cellog Sat Jun 21 06:53:11 2008 UTC Modified files: (Branch: PHP_5_3) /php-src/ext/phar phar.phar phar_object.c Log: 82x(./profile2) speedup for buildFrom*() http://cvs.php.net/viewvc.cgi/php-src/ext/phar/phar.phar?r1=1.7.2.22&r2=1.7.2.23&diff_format=u Index: php-src/ext/phar/phar.phar http://cvs.php.net/viewvc.cgi/php-src/ext/phar/phar_object.c?r1=1.266.2.25&r2=1.266.2.26&diff_format=u Index: php-src/ext/phar/phar_object.c diff -u php-src/ext/phar/phar_object.c:1.266.2.25 php-src/ext/phar/phar_object.c:1.266.2.26 --- php-src/ext/phar/phar_object.c:1.266.2.25 Fri Jun 20 09:17:53 2008 +++ php-src/ext/phar/phar_object.c Sat Jun 21 06:53:10 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: phar_object.c,v 1.266.2.25 2008/06/20 09:17:53 johannes Exp $ */ +/* $Id: phar_object.c,v 1.266.2.26 2008/06/21 06:53:10 cellog Exp $ */ #include "phar_internal.h" #include "func_interceptors.h" @@ -1365,20 +1365,22 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php