mirror of
https://github.com/php/php-src.git
synced 2025-08-19 17:04:47 +02:00
82x(./profile2) speedup for buildFrom*()
This commit is contained in:
parent
14c26d05ba
commit
529aa19cc7
2 changed files with 23 additions and 34 deletions
Binary file not shown.
|
@ -1365,20 +1365,22 @@ PHP_METHOD(Phar, unlinkArchive)
|
|||
return; \
|
||||
}
|
||||
|
||||
static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
zval **value;
|
||||
zend_uchar key_type;
|
||||
zend_bool is_splfileinfo = 0, close_fp = 1;
|
||||
ulong int_key;
|
||||
struct _t {
|
||||
struct _phar_t {
|
||||
phar_archive_object *p;
|
||||
zend_class_entry *c;
|
||||
char *b;
|
||||
uint l;
|
||||
zval *ret;
|
||||
int count;
|
||||
} *p_obj = (struct _t*) puser;
|
||||
php_stream *fp;
|
||||
};
|
||||
static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
zval **value;
|
||||
zend_uchar key_type;
|
||||
zend_bool is_splfileinfo = 0, close_fp = 1;
|
||||
ulong int_key;
|
||||
struct _phar_t *p_obj = (struct _phar_t*) puser;
|
||||
uint str_key_len, base_len = p_obj->l, fname_len;
|
||||
phar_entry_data *data;
|
||||
php_stream *fp;
|
||||
|
@ -1605,7 +1607,13 @@ after_open_fp:
|
|||
if (error) {
|
||||
efree(error);
|
||||
}
|
||||
contents_len = php_stream_copy_to_stream(fp, data->fp, PHP_STREAM_COPY_ALL);
|
||||
/* convert to PHAR_UFP */
|
||||
php_stream_close(data->internal_file->fp);
|
||||
data->internal_file->fp_type = PHAR_UFP;
|
||||
data->internal_file->offset_abs = data->internal_file->offset = php_stream_tell(p_obj->fp);
|
||||
contents_len = php_stream_copy_to_stream(fp, p_obj->fp, PHP_STREAM_COPY_ALL);
|
||||
data->internal_file->uncompressed_filesize = data->internal_file->compressed_filesize =
|
||||
php_stream_tell(p_obj->fp) - data->internal_file->offset;
|
||||
}
|
||||
if (close_fp) {
|
||||
php_stream_close(fp);
|
||||
|
@ -1622,15 +1630,6 @@ after_open_fp:
|
|||
|
||||
data->internal_file->compressed_filesize = data->internal_file->uncompressed_filesize = contents_len;
|
||||
phar_entry_delref(data TSRMLS_CC);
|
||||
if (++p_obj->count && p_obj->count % 900) {
|
||||
/* every 900 files, flush so we remove open temp file handles, fixes Bug #45218 */
|
||||
phar_flush(p_obj->p->arc.archive, 0, 0, 0, &error TSRMLS_CC);
|
||||
if (error) {
|
||||
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, error);
|
||||
efree(error);
|
||||
return ZEND_HASH_APPLY_STOP;
|
||||
}
|
||||
}
|
||||
return ZEND_HASH_APPLY_KEEP;
|
||||
}
|
||||
/* }}} */
|
||||
|
@ -1647,14 +1646,7 @@ PHP_METHOD(Phar, buildFromDirectory)
|
|||
int dir_len, regex_len = 0;
|
||||
zend_bool apply_reg = 0;
|
||||
zval arg, arg2, *iter, *iteriter, *regexiter = NULL;
|
||||
struct {
|
||||
phar_archive_object *p;
|
||||
zend_class_entry *c;
|
||||
char *b;
|
||||
uint l;
|
||||
zval *ret;
|
||||
int count;
|
||||
} pass;
|
||||
struct _phar_t pass;
|
||||
|
||||
PHAR_ARCHIVE_OBJECT();
|
||||
|
||||
|
@ -1731,12 +1723,14 @@ PHP_METHOD(Phar, buildFromDirectory)
|
|||
pass.l = dir_len;
|
||||
pass.count = 0;
|
||||
pass.ret = return_value;
|
||||
pass.fp = php_stream_fopen_tmpfile();
|
||||
|
||||
if (SUCCESS == spl_iterator_apply((apply_reg ? regexiter : iteriter), (spl_iterator_apply_func_t) phar_build, (void *) &pass TSRMLS_CC)) {
|
||||
zval_ptr_dtor(&iteriter);
|
||||
if (apply_reg) {
|
||||
zval_ptr_dtor(®exiter);
|
||||
}
|
||||
phar_obj->arc.archive->ufp = pass.fp;
|
||||
phar_flush(phar_obj->arc.archive, 0, 0, 0, &error TSRMLS_CC);
|
||||
if (error) {
|
||||
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, error);
|
||||
|
@ -1761,14 +1755,7 @@ PHP_METHOD(Phar, buildFromIterator)
|
|||
char *error;
|
||||
uint base_len = 0;
|
||||
char *base = NULL;
|
||||
struct {
|
||||
phar_archive_object *p;
|
||||
zend_class_entry *c;
|
||||
char *b;
|
||||
uint l;
|
||||
zval *ret;
|
||||
int count;
|
||||
} pass;
|
||||
struct _phar_t pass;
|
||||
PHAR_ARCHIVE_OBJECT();
|
||||
|
||||
if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
|
||||
|
@ -1789,8 +1776,10 @@ PHP_METHOD(Phar, buildFromIterator)
|
|||
pass.l = base_len;
|
||||
pass.ret = return_value;
|
||||
pass.count = 0;
|
||||
pass.fp = php_stream_fopen_tmpfile();
|
||||
|
||||
if (SUCCESS == spl_iterator_apply(obj, (spl_iterator_apply_func_t) phar_build, (void *) &pass TSRMLS_CC)) {
|
||||
phar_obj->arc.archive->ufp = pass.fp;
|
||||
phar_flush(phar_obj->arc.archive, 0, 0, 0, &error TSRMLS_CC);
|
||||
if (error) {
|
||||
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, error);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue