Bruce.です。
閑舎 writes:
> エラーの原因を探っていたところ、require で呼び出した側のスク
> リプト内に書かれた素の html ソースに
>
> <img src="not_exist.jpg">
>
> のような存在しない URL を参照していた画像タグがあり、これを存在するもの
> に直したところ、突然ブラウザ画面に思った通りの表示が出ました。
>
> 「?」
>
> PHP は内部的に HTML ソースの解析機能を持っていることはわかりますが、「画
> 像の URL まで調べるか、ふつう?」と思ってしまいます。また、スクリプト構
> 造が複雑でなければ、こんなエラーに出合ったこともありません。
いくらPHPでも(ry とソースを見てみました(4.4.7)。
PHPタグの外側にある部分の処理と思われる部分で
zend_language_scanner.l
<INITIAL>(([^<]|"<"[^?%s<]){1,400})|"<s"|"<" {
#ifdef ZEND_MULTIBYTE
if (SCNG(output_filter)) {
int readsize;
readsize = SCNG(output_filter)(&(zendlval->value.str.val), &(zendlval->value.str.len), yytext, yyleng TSRMLS_CC);
if (readsize < yyleng) {
yyless(readsize);
}
} else {
zendlval->value.str.val = (char *) estrndup(yytext, yyleng);
zendlval->value.str.len = yyleng;
}
#else /* ZEND_MULTIBYTE */
zendlval->value.str.val = (char *) estrndup(yytext, yyleng);
zendlval->value.str.len = yyleng;
#endif /* ZEND_MULTIBYTE */
zendlval->type = IS_STRING;
HANDLE_NEWLINES(yytext, yyleng);
return T_INLINE_HTML;
}
が、HTMLタグの処理をしているところだと思われますが(タグの種類によっては
別の部分を通りますが、img タグならここのはず)、
zend_language_parser.y
| T_INLINE_HTML { zend_do_echo(&$1 TSRMLS_CC); }
と単に echo しているだけです。
念のためさらに追いかけても
case ZEND_ECHO:
zend_print_variable(get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R));
FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1));
NEXT_OPCODE();
なので、ファイルのオープン(や存在確認)をしているところは通りません。
んー、謎…
いじょ。