2013-03-05 2 views
0

, 난 여기에 내 자신의 함수에 zend_compile_file을 수정 PHP 확장에서 가상 파일을 컴파일 할 수 없습니다,소스 코드 내가 PHP 확장을 코딩하고

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의 디버그 정보입니다. 아무도 도와 줄 수 있습니까? 나는이 PHP에 새로운 사람들이 가지고 일반적인 문제입니다 여기

img link

답변

0

이미지를 게시 할 수 없습니다 원인 구글 문서에 대한 유감을 연결합니다. 내가 새롭고 대답을 찾을 수 없을 때 이것이 나에게 일어났던 좌절감을 이해합니다. "require"문을 사용하려면 괄호를 사용하지 않아야합니다. 괄호를 사용하면 논리 문장처럼 취급합니다. 문장이 ("ThisIsAstring")이기 때문에 true 또는 1로 해석됩니다 (빈 문자열이 아닙니다). 괄호를 제거하십시오. : D

EDIT : 참고로, 이와 같이 반올림 한 오류가있는 경우에는 모두의 소스 코드를 포함해야합니다.

여기에 유래에서 발견 좋은 대답 : When should I use parenthesis in require/include statements?

+0

미안 해요, 난 C++와 PHP 확장을 쓰고, PHP 코드를 작성하지. – zhzhwcn

+0

그럴 경우, 명시 적으로 포함 시키거나 요구하지 않는 한, "C : \ php5411 \ 1.php"을 열지 못했습니다. 오해에 사과드립니다. –

+0

내 확장 프로그램을 제거하면 정상적으로 작동합니다. 도와 줘서 고마워. – zhzhwcn