作者: Bruce.
日時: 2007/9/20(17:25)
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();

なので、ファイルのオープン(や存在確認)をしているところは通りません。

んー、謎…

いじょ。