我正在替换zend_compile_string()
进行代码预处理,然后传递给原始zend_compile_string()
。
有效。
但我还需要从文件(_include/require
,php <file.php>
)获取代码预处理。
Zend提供了替换zend_compile_file()
的功能,但源文本仅在open_file_for_scanning()
(zend_stream_fixup(file_handle, &buf, &size TSRMLS_CC)
)内可用,但无法从扩展程序访问。
如何在发送到zendparse()
之前更改代码?
修改:我找到了解决方案:
zend_op_array* ext_zend_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC)
{
char *buf;
size_t size;
if (zend_stream_fixup(file_handle, &buf, &size TSRMLS_CC) == FAILURE) {
return NULL;
}
char *res;
size_t res_size;
// My code that uses file_handle->handle.stream.mmap.buf/len is read-only and filling res/res_size
file_handle->handle.stream.mmap.buf = res;
file_handle->handle.stream.mmap.len = res_size;
return ext_orig_zend_compile_file(file_handle, type TSRMLS_CC);
}