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(&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 @@
        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

Reply via email to