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; \
|
return; \
|
||||||
}
|
}
|
||||||
|
|
||||||
static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ */
|
struct _phar_t {
|
||||||
{
|
|
||||||
zval **value;
|
|
||||||
zend_uchar key_type;
|
|
||||||
zend_bool is_splfileinfo = 0, close_fp = 1;
|
|
||||||
ulong int_key;
|
|
||||||
struct _t {
|
|
||||||
phar_archive_object *p;
|
phar_archive_object *p;
|
||||||
zend_class_entry *c;
|
zend_class_entry *c;
|
||||||
char *b;
|
char *b;
|
||||||
uint l;
|
uint l;
|
||||||
zval *ret;
|
zval *ret;
|
||||||
int count;
|
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;
|
uint str_key_len, base_len = p_obj->l, fname_len;
|
||||||
phar_entry_data *data;
|
phar_entry_data *data;
|
||||||
php_stream *fp;
|
php_stream *fp;
|
||||||
|
@ -1605,7 +1607,13 @@ after_open_fp:
|
||||||
if (error) {
|
if (error) {
|
||||||
efree(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) {
|
if (close_fp) {
|
||||||
php_stream_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;
|
data->internal_file->compressed_filesize = data->internal_file->uncompressed_filesize = contents_len;
|
||||||
phar_entry_delref(data TSRMLS_CC);
|
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;
|
return ZEND_HASH_APPLY_KEEP;
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
@ -1647,14 +1646,7 @@ PHP_METHOD(Phar, buildFromDirectory)
|
||||||
int dir_len, regex_len = 0;
|
int dir_len, regex_len = 0;
|
||||||
zend_bool apply_reg = 0;
|
zend_bool apply_reg = 0;
|
||||||
zval arg, arg2, *iter, *iteriter, *regexiter = NULL;
|
zval arg, arg2, *iter, *iteriter, *regexiter = NULL;
|
||||||
struct {
|
struct _phar_t pass;
|
||||||
phar_archive_object *p;
|
|
||||||
zend_class_entry *c;
|
|
||||||
char *b;
|
|
||||||
uint l;
|
|
||||||
zval *ret;
|
|
||||||
int count;
|
|
||||||
} pass;
|
|
||||||
|
|
||||||
PHAR_ARCHIVE_OBJECT();
|
PHAR_ARCHIVE_OBJECT();
|
||||||
|
|
||||||
|
@ -1731,12 +1723,14 @@ PHP_METHOD(Phar, buildFromDirectory)
|
||||||
pass.l = dir_len;
|
pass.l = dir_len;
|
||||||
pass.count = 0;
|
pass.count = 0;
|
||||||
pass.ret = return_value;
|
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)) {
|
if (SUCCESS == spl_iterator_apply((apply_reg ? regexiter : iteriter), (spl_iterator_apply_func_t) phar_build, (void *) &pass TSRMLS_CC)) {
|
||||||
zval_ptr_dtor(&iteriter);
|
zval_ptr_dtor(&iteriter);
|
||||||
if (apply_reg) {
|
if (apply_reg) {
|
||||||
zval_ptr_dtor(®exiter);
|
zval_ptr_dtor(®exiter);
|
||||||
}
|
}
|
||||||
|
phar_obj->arc.archive->ufp = pass.fp;
|
||||||
phar_flush(phar_obj->arc.archive, 0, 0, 0, &error TSRMLS_CC);
|
phar_flush(phar_obj->arc.archive, 0, 0, 0, &error TSRMLS_CC);
|
||||||
if (error) {
|
if (error) {
|
||||||
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, error);
|
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, error);
|
||||||
|
@ -1761,14 +1755,7 @@ PHP_METHOD(Phar, buildFromIterator)
|
||||||
char *error;
|
char *error;
|
||||||
uint base_len = 0;
|
uint base_len = 0;
|
||||||
char *base = NULL;
|
char *base = NULL;
|
||||||
struct {
|
struct _phar_t pass;
|
||||||
phar_archive_object *p;
|
|
||||||
zend_class_entry *c;
|
|
||||||
char *b;
|
|
||||||
uint l;
|
|
||||||
zval *ret;
|
|
||||||
int count;
|
|
||||||
} pass;
|
|
||||||
PHAR_ARCHIVE_OBJECT();
|
PHAR_ARCHIVE_OBJECT();
|
||||||
|
|
||||||
if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
|
if (PHAR_G(readonly) && !phar_obj->arc.archive->is_data) {
|
||||||
|
@ -1789,8 +1776,10 @@ PHP_METHOD(Phar, buildFromIterator)
|
||||||
pass.l = base_len;
|
pass.l = base_len;
|
||||||
pass.ret = return_value;
|
pass.ret = return_value;
|
||||||
pass.count = 0;
|
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)) {
|
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);
|
phar_flush(phar_obj->arc.archive, 0, 0, 0, &error TSRMLS_CC);
|
||||||
if (error) {
|
if (error) {
|
||||||
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, error);
|
zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, error);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue