0

私は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ドキュメントのリンクで申し訳ありません

画像リンク

4

1 に答える 1

0

これは、PHP を初めて使用する人が抱える一般的な問題です。私が新人で答えを見つけることができなかったときにこれが私に起こったので、私は欲求不満を理解しています. 「require」ステートメントでは、括弧を使用しないことが要求されます。括弧を使用すると、論理ステートメントのように扱われます。ステートメントは ("ThisIsAstring") であるため、true または 1 として解釈されます (空の文字列ではありません)。括弧を削除します。:D

編集:注意として、そのようなややあいまいなエラーがある場合は、実際にはすべてのソース コードを含める必要があります。

これがstackoverflowで見つかった良い答えです:require / includeステートメントで括弧を使用する必要があるのはいつですか?

于 2013-07-04T02:04:19.087 に答える