dmitry Wed Jul 16 15:09:39 2008 UTC Modified files: (Branch: PHP_5_3) /php-src/ext/phar phar_object.c Log: Improved support for opcode caches. Now some open() syscalls might be eliminated by caches.
http://cvs.php.net/viewvc.cgi/php-src/ext/phar/phar_object.c?r1=1.266.2.34&r2=1.266.2.35&diff_format=u Index: php-src/ext/phar/phar_object.c diff -u php-src/ext/phar/phar_object.c:1.266.2.34 php-src/ext/phar/phar_object.c:1.266.2.35 --- php-src/ext/phar/phar_object.c:1.266.2.34 Wed Jul 9 08:47:05 2008 +++ php-src/ext/phar/phar_object.c Wed Jul 16 15:09:39 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: phar_object.c,v 1.266.2.34 2008/07/09 08:47:05 dmitry Exp $ */ +/* $Id: phar_object.c,v 1.266.2.35 2008/07/16 15:09:39 dmitry Exp $ */ #include "phar_internal.h" #include "func_interceptors.h" @@ -161,7 +161,7 @@ } /* }}} */ -static int phar_file_action(phar_entry_data *idata, char *mime_type, int code, char *entry, int entry_len, char *arch, int arch_len, char *basename, int basename_len, char *ru, int ru_len TSRMLS_DC) /* {{{ */ +static int phar_file_action(phar_archive_data *phar, phar_entry_info *info, char *mime_type, int code, char *entry, int entry_len, char *arch, int arch_len, char *basename, int basename_len, char *ru, int ru_len TSRMLS_DC) /* {{{ */ { char *name = NULL, buf[8192], *cwd; zend_syntax_highlighter_ini syntax_highlighter_ini; @@ -171,6 +171,8 @@ zend_file_handle file_handle; zend_op_array *new_op_array; zval *result = NULL; + php_stream *fp; + off_t position; switch (code) { case PHAR_MIME_PHPS: @@ -185,7 +187,6 @@ highlight_file(name, &syntax_highlighter_ini TSRMLS_CC); - phar_entry_delref(idata TSRMLS_CC); efree(name); #ifdef PHP_WIN32 efree(arch); @@ -197,60 +198,60 @@ ctr.line_len = spprintf(&(ctr.line), 0, "Content-type: %s", mime_type); sapi_header_op(SAPI_HEADER_REPLACE, &ctr TSRMLS_CC); efree(ctr.line); - ctr.line_len = spprintf(&(ctr.line), 0, "Content-length: %d", idata->internal_file->uncompressed_filesize); + ctr.line_len = spprintf(&(ctr.line), 0, "Content-length: %d", info->uncompressed_filesize); sapi_header_op(SAPI_HEADER_REPLACE, &ctr TSRMLS_CC); efree(ctr.line); if (FAILURE == sapi_send_headers(TSRMLS_C)) { - phar_entry_delref(idata TSRMLS_CC); zend_bailout(); } /* prepare to output */ - if (!phar_get_efp(idata->internal_file, 1 TSRMLS_CC)) { + fp = phar_get_efp(info, 1 TSRMLS_CC); + if (!fp) { char *error; - if (!phar_open_jit(idata->phar, idata->internal_file, phar_get_pharfp(idata->phar TSRMLS_CC), &error, 0 TSRMLS_CC)) { + if (!phar_open_jit(phar, info, phar_get_pharfp(phar TSRMLS_CC), &error, 0 TSRMLS_CC)) { if (error) { zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, error); efree(error); } return -1; } - idata->fp = phar_get_efp(idata->internal_file, 1 TSRMLS_CC); - idata->zero = phar_get_fp_offset(idata->internal_file TSRMLS_CC); + fp = phar_get_efp(info, 1 TSRMLS_CC); } - phar_seek_efp(idata->internal_file, 0, SEEK_SET, 0, 1 TSRMLS_CC); + position = 0; + phar_seek_efp(info, 0, SEEK_SET, 0, 1 TSRMLS_CC); do { - got = php_stream_read(idata->fp, buf, MIN(8192, idata->internal_file->uncompressed_filesize - idata->position)); - PHPWRITE(buf, got); - idata->position = php_stream_tell(idata->fp) - idata->zero; - if (idata->position == (off_t) idata->internal_file->uncompressed_filesize) { - break; + got = php_stream_read(fp, buf, MIN(8192, info->uncompressed_filesize - position)); + if (got > 0) { + PHPWRITE(buf, got); + position += got; + if (position == (off_t) info->uncompressed_filesize) { + break; + } } } while (1); - phar_entry_delref(idata TSRMLS_CC); zend_bailout(); case PHAR_MIME_PHP: if (basename) { phar_mung_server_vars(arch, entry, entry_len, basename, basename_len, ru, ru_len TSRMLS_CC); efree(basename); } - phar_entry_delref(idata TSRMLS_CC); if (entry[0] == '/') { name_len = spprintf(&name, 4096, "phar://%s%s", arch, entry); } else { name_len = spprintf(&name, 4096, "phar://%s/%s", arch, entry); } - ret = php_stream_open_for_zend_ex(name, &file_handle, ENFORCE_SAFE_MODE|USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC); - - if (ret != SUCCESS) { - efree(name); - return -1; - } + file_handle.type = ZEND_HANDLE_FILENAME; + file_handle.handle.fd = 0; + file_handle.filename = name; + file_handle.opened_path = NULL; + file_handle.free_filename = 0; + PHAR_G(cwd) = NULL; PHAR_G(cwd_len) = 0; - if (zend_hash_add(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1, (void *)&dummy, sizeof(int), NULL)==SUCCESS) { + if (!zend_hash_exists(&EG(included_files), name, name_len+1)) { if ((cwd = strrchr(entry, '/'))) { PHAR_G(cwd_init) = 1; if (entry == cwd) { @@ -266,14 +267,13 @@ } } new_op_array = zend_compile_file(&file_handle, ZEND_REQUIRE TSRMLS_CC); + if (new_op_array) { + zend_hash_add(&EG(included_files), name, name_len+1, (void *)&dummy, sizeof(int), NULL); + } zend_destroy_file_handle(&file_handle TSRMLS_CC); } else { + efree(name); new_op_array = NULL; -#if PHP_VERSION_ID >= 50300 - zend_file_handle_dtor(&file_handle TSRMLS_CC); -#else - zend_file_handle_dtor(&file_handle); -#endif } #ifdef PHP_WIN32 efree(arch); @@ -321,31 +321,28 @@ } /* }}} */ -static void phar_do_404(char *fname, int fname_len, char *f404, int f404_len, char *entry, int entry_len TSRMLS_DC) /* {{{ */ +static void phar_do_404(phar_archive_data *phar, char *fname, int fname_len, char *f404, int f404_len, char *entry, int entry_len TSRMLS_DC) /* {{{ */ { - int hi; - phar_entry_data *phar; - char *error; - if (f404_len) { - if (FAILURE == phar_get_entry_data(&phar, fname, fname_len, f404, f404_len, "r", 0, &error, 1 TSRMLS_CC)) { - if (error) { - efree(error); - } - goto nofile; + sapi_header_line ctr = {0}; + phar_entry_info *info; + + if (phar && f404_len) { + info = phar_get_entry_info(phar, f404, f404_len, NULL, 1 TSRMLS_CC); + + if (info) { + phar_file_action(phar, info, "text/html", PHAR_MIME_PHP, f404, f404_len, fname, fname_len, NULL, 0, NULL, 0 TSRMLS_CC); + return; } - hi = phar_file_action(phar, "text/html", PHAR_MIME_PHP, f404, f404_len, fname, fname_len, NULL, 0, NULL, 0 TSRMLS_CC); - } else { - sapi_header_line ctr = {0}; -nofile: - ctr.response_code = 404; - ctr.line_len = sizeof("HTTP/1.0 404 Not Found")+1; - ctr.line = "HTTP/1.0 404 Not Found"; - sapi_header_op(SAPI_HEADER_REPLACE, &ctr TSRMLS_CC); - sapi_send_headers(TSRMLS_C); - PHPWRITE("<html>\n <head>\n <title>File Not Found</title>\n </head>\n <body>\n <h1>404 - File ", sizeof("<html>\n <head>\n <title>File Not Found</title>\n </head>\n <body>\n <h1>404 - File ") - 1); - PHPWRITE(entry, entry_len); - PHPWRITE(" Not Found</h1>\n </body>\n</html>", sizeof(" Not Found</h1>\n </body>\n</html>") - 1); } + + ctr.response_code = 404; + ctr.line_len = sizeof("HTTP/1.0 404 Not Found")+1; + ctr.line = "HTTP/1.0 404 Not Found"; + sapi_header_op(SAPI_HEADER_REPLACE, &ctr TSRMLS_CC); + sapi_send_headers(TSRMLS_C); + PHPWRITE("<html>\n <head>\n <title>File Not Found</title>\n </head>\n <body>\n <h1>404 - File ", sizeof("<html>\n <head>\n <title>File Not Found</title>\n </head>\n <body>\n <h1>404 - File ") - 1); + PHPWRITE(entry, entry_len); + PHPWRITE(" Not Found</h1>\n </body>\n</html>", sizeof(" Not Found</h1>\n </body>\n</html>") - 1); } /* }}} */ @@ -534,7 +531,8 @@ int alias_len = 0, ret, f404_len = 0, free_pathinfo = 0, ru_len = 0; char *fname, *basename, *path_info, *mime_type, *entry, *pt; int fname_len, entry_len, code, index_php_len = 0, not_cgi; - phar_entry_data *phar; + phar_archive_data *phar = NULL; + phar_entry_info *info; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!saz", &alias, &alias_len, &index_php, &index_php_len, &f404, &f404_len, &mimeoverride, &rewrite) == FAILURE) { return; @@ -697,8 +695,10 @@ entry = estrndup("/index.php", sizeof("/index.php")); entry_len = sizeof("/index.php")-1; } - if (FAILURE == phar_get_entry_data(&phar, fname, fname_len, entry, entry_len, "r", 0, NULL, 1 TSRMLS_CC)) { - phar_do_404(fname, fname_len, f404, f404_len, entry, entry_len TSRMLS_CC); + + if (FAILURE == phar_get_archive(&phar, fname, fname_len, NULL, 0, NULL TSRMLS_CC) || + (info = phar_get_entry_info(phar, entry, entry_len, NULL, 0 TSRMLS_CC)) == NULL) { + phar_do_404(phar, fname, fname_len, f404, f404_len, entry, entry_len TSRMLS_CC); if (free_pathinfo) { efree(path_info); } @@ -730,14 +730,14 @@ } sapi_header_op(SAPI_HEADER_REPLACE, &ctr TSRMLS_CC); sapi_send_headers(TSRMLS_C); - phar_entry_delref(phar TSRMLS_CC); efree(ctr.line); zend_bailout(); } } - if (FAILURE == phar_get_entry_data(&phar, fname, fname_len, entry, entry_len, "r", 0, &error, 1 TSRMLS_CC)) { - phar_do_404(fname, fname_len, f404, f404_len, entry, entry_len TSRMLS_CC); + if (FAILURE == phar_get_archive(&phar, fname, fname_len, NULL, 0, NULL TSRMLS_CC) || + (info = phar_get_entry_info(phar, entry, entry_len, NULL, 0 TSRMLS_CC)) == NULL) { + phar_do_404(phar, fname, fname_len, f404, f404_len, entry, entry_len TSRMLS_CC); #ifdef PHP_WIN32 efree(fname); #endif @@ -818,7 +818,6 @@ if (HASH_KEY_IS_LONG == zend_hash_get_current_key_ex(Z_ARRVAL_P(mimeoverride), &key, &keylen, &intkey, 0, NULL)) { zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "Key of MIME type overrides array must be a file extension, was \"%d\"", intkey); - phar_entry_delref(phar TSRMLS_CC); #ifdef PHP_WIN32 efree(fname); #endif @@ -829,7 +828,6 @@ if (FAILURE == zend_hash_get_current_data(Z_ARRVAL_P(mimeoverride), (void **) &val)) { zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "Failed to retrieve Mime type for extension \"%s\"", str_key); - phar_entry_delref(phar TSRMLS_CC); #ifdef PHP_WIN32 efree(fname); #endif @@ -841,7 +839,6 @@ PHAR_SET_USER_MIME((char) Z_LVAL_PP(val)) } else { zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "Unknown mime type specifier used, only Phar::PHP, Phar::PHPS and a mime type string are allowed"); - phar_entry_delref(phar TSRMLS_CC); #ifdef PHP_WIN32 efree(fname); #endif @@ -853,7 +850,6 @@ break; default : zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "Unknown mime type specifier used (not a string or int), only Phar::PHP, Phar::PHPS and a mime type string are allowed"); - phar_entry_delref(phar TSRMLS_CC); #ifdef PHP_WIN32 efree(fname); #endif @@ -865,7 +861,7 @@ no_mimes: code = phar_file_type(&mimetypes, entry, &mime_type TSRMLS_CC); zend_hash_destroy(&mimetypes); - ret = phar_file_action(phar, mime_type, code, entry, entry_len, fname, fname_len, pt, strlen(pt), ru, ru_len TSRMLS_CC); + ret = phar_file_action(phar, info, mime_type, code, entry, entry_len, fname, fname_len, pt, strlen(pt), ru, ru_len TSRMLS_CC); } /* }}} */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php