]> granicus.if.org Git - php/commitdiff
82x(./profile2) speedup for buildFrom*()
authorGreg Beaver <cellog@php.net>
Sat, 21 Jun 2008 06:53:10 +0000 (06:53 +0000)
committerGreg Beaver <cellog@php.net>
Sat, 21 Jun 2008 06:53:10 +0000 (06:53 +0000)
ext/phar/phar.phar
ext/phar/phar_object.c

index 170c4a8860a154cd199c087be054e3974a5a0af0..0da97c8923314eb690ccabeb998cbbc61769637e 100755 (executable)
Binary files a/ext/phar/phar.phar and b/ext/phar/phar.phar differ
index ab53965a282d7547ec35871e4fcd4d6051295166..41b30941f2a5a30bc04b73967260d415d271f2e9 100755 (executable)
@@ -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(&regexiter);
                }
+               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);