Hi Pierre,
To avoid stat()
syscalls the opcode cache has to override
zend_resolve_path() and zend_open_stream() callbacks with something like
the following functions.
static char* my_resolve_path(const char *filename, int filename_len
TSRMLS_DC)
{
if ((EG(opline_ptr) &&
*EG(opline_ptr) &&
(*EG(opline_ptr))->opcode == ZEND_INCLUDE_OR_EVAL &&
((*EG(opline_ptr))->extended_value == ZEND_INCLUDE_ONCE ||
(*EG(opline_ptr))->extended_value == ZEND_REQUIRE_ONCE))) {
CACHE_BUCKET *b = OPCODE_CACHE_FIND(filename TSRMLS_CC);
if (b) {
return b->real_path;
}
}
return orig_resolve_path(filename, filename_len TSRMLS_CC);
}
static int my_stream_open(const char *filename, zend_file_handle *handle
TSRMLS_DC)
{
if ((EG(opline_ptr) &&
*EG(opline_ptr) &&
(*EG(opline_ptr))->opcode == ZEND_INCLUDE_OR_EVAL &&
((*EG(opline_ptr))->extended_value == ZEND_INCLUDE_ONCE ||
(*EG(opline_ptr))->extended_value == ZEND_REQUIRE_ONCE))) {
CACHE_BUCKET *b = OPCODE_CACHE_FIND(filename TSRMLS_CC);
if (b) {
handle->type = ZEND_HANDLE_FILENAME;
handle->opened_path = estrdup(b->real_path);
return SUCCESS;
}
}
return orig_steam_open(filename, handle TSRMLS_CC);
}
Thanks. Dmitry.