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