簡體   English   中英

無法在PHP擴展中編譯虛擬文件

[英]can not compile a virtual file in 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的調試信息。有人可以幫助我嗎? 抱歉,Google docs鏈接導致我無法在此處發布圖片

img鏈接

這是PHP新手經常遇到的問題。 我很沮喪,因為我剛來時就遇到了這種麻煩,無法找到答案。 “要求”語句要求您不要使用括號。 如果使用括號,它將被視為邏輯語句。 由於該語句為(“ ThisIsAstring”),因此該語句被解釋為true或1(它不是空字符串)。 刪除括號。 :D

編輯:請注意,當您遇到類似這樣的半明確錯誤時,您應該真正包括所有源代碼。

這是在stackoverflow上找到的一個很好的答案: 什么時候應該在require / include語句中使用括號?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM