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.

Reply via email to