php - 无法在 PHP 扩展中编译虚拟文件

标签 php c++ c php-extension

我正在编写 PHP 扩展,我将 zend_compile_file 修改为我自己的函数,这是源代码:

FILE *bravery_ext_fopen(FILE *fp)
{
struct  stat    stat_buf;
char    *datap, *newdatap;
int datalen, newdatalen;
char sign[] = "BRAVERY";
int cryptkey_len = sizeof(sign);

fstat(_fileno(fp), &stat_buf);
datalen = stat_buf.st_size -  sizeof(sign);
datap = (char*)malloc(datalen);
fread(datap, datalen, 1, fp);
fclose(fp);

fp = tmpfile();

fwrite(datap, datalen-1, 1, fp);

free(datap);


rewind(fp);
return fp;
}
zend_op_array *bravery_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC)
{
FILE    *fp;
char sign[] = "BRAVERY";
char    buf[8];
char    fname[128];

memset(fname, 0, sizeof fname);
if (zend_is_executing(TSRMLS_C)) {
    if (get_active_function_name(TSRMLS_C)) {
        strncpy(fname, get_active_function_name(TSRMLS_C), sizeof fname - 2);
    }
}
if (fname[0]) {
    if ( strcasecmp(fname, "show_source") == 0
      || strcasecmp(fname, "highlight_file") == 0) {
        return NULL;
    }
}

fp = fopen(file_handle->filename, "r");
if (!fp) {
    return org_compile_file(file_handle, type TSRMLS_CC);
}

fread(buf, 7, 1, fp);
if (memcmp(buf, sign, 7) != 0) {
    fclose(fp);
    return org_compile_file(file_handle, type TSRMLS_CC);
}

if (file_handle->type == ZEND_HANDLE_FP) fclose(file_handle->handle.fp);
if (file_handle->type == ZEND_HANDLE_FD) close(file_handle->handle.fd);
file_handle->handle.fp = bravery_ext_fopen(fp);
file_handle->type = ZEND_HANDLE_FP;
//file_handle->opened_path = expand_filepath(file_handle->filename, NULL TSRMLS_CC);
file_handle->opened_path = NULL;
return org_compile_file(file_handle, type TSRMLS_CC);
}

它在普通 PHP 文件上运行良好, 但它给了我一个 Fatal error: Unknown: Failed opening required 'C:\php5411\1.php' (include_path='.;C:\php\pear') in Unknown on line 0 错误对我来说,当 phpfile 以“BRAVERY”开头时(这是我用来签署我的 php 文件的内容)。

这是 file_handle 的调试信息。有人可以帮助我吗?对于谷歌文档链接感到抱歉,因为我无法在此处发布图片

img link

最佳答案

这是 PHP 新手经常遇到的问题。我理解这种挫败感,因为当我还是新手时,这种情况就发生在我身上,无法找到答案。 “require”语句要求您不使用括号。如果您使用括号,它会将其视为逻辑语句。由于语句是 ("ThisIsAstring"),因此它被解释为 true 或 1(它不是空字符串)。删除括号。 :D

编辑:请注意,当您遇到这样的半模糊错误时,您应该真正包含所有源代码。

这是在 stackoverflow 上找到的一个很好的答案:When should I use parenthesis in require/include statements?

关于php - 无法在 PHP 扩展中编译虚拟文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15218305/

相关文章:

c++ - 如何在 cocos2d-x 中以自定义类作为根节点访问子 ccb 文件中的变量

c++ - 杂注警告(禁用 : 4700 ) not working in Visual Studio Express 2013

php - 将查询错误转换为 MySQLi 中的异常

php 循环跳过或缺少 mysql 查询的某些结果

C++ 打包 typedef 枚举

c - 是否存在非数组不完整类型?

C编程: Singular to plural nouns

C CRC16 的 Java 等价物

php - 使用 php 隐藏一个 Div

javascript - 如何将href链接的值传递给ajax函数