tag.TagParser->read() (rev3038/3045)

現在、テンプレートでエラー発生すると、

C:\xampp\htdocs\pdt\rhaco\Rhaco.php(275) : eval()'d code(147)

のようになって、何がエラーになったのか解明できない。

setup.phpから、キャッシュありにすれば、/work/cache にキャッシュファイルが
作られるのでスクリプトを確認することができる。

のだが・・・
キャッシュはキャッシュなわけで、古いものである可能性もあるわけで、
デバッグでいちいちそんなこと考えるのは手間。
(キャッシュファイルを消してから実行すればいいんですけど。それがメンドクサイ)

で、キャッシュの更新期間を0sにすればいいじゃん。
とか思ったわけです。そうすれば毎回キャッシュファイルが更新される。
んじゃなかろうかと予測。

ところが、
更新期間0sとしたとき。
1.毎回テンプレートをphp化して文字列$rhaco_tag_parse_srcに格納
2.$rhaco_tag_parse_srcをファイル化&eval()

という動きになるので、相変わらずメッセージは

C:\xampp\htdocs\pdt\rhaco\Rhaco.php(275) : eval()'d code(147)

のまま。
毎回キャッシュされるようになったものの、肝心のキャッシュファイル名はわからないorz

ということで改造してみます。
流れとしては、こんな感じ。
1.テンプレートをphp化して文字列$rhaco_tag_parse_srcに格納
2.$rhaco_tag_parse_srcをファイル化&*include* ←ここ変更

改造したソースはこんな感じ。
行頭インデント無しが追加したコードです。
(echoは不要)

	/**
	 * テンプレートをフォーマットし取得する
	 * @param string $templateFileName テンプレートファイルパス(resources/templates)からの相対
	 * @param string $remotePath 相対パス変換用のルートパス
	 * @param array $variables テンプレートで利用する変数(hash)
	 * @return string
	 */
	function read($filename="",$variables=array(),$remotePath=""){
		/*** unit("tag.TagParserTest"); */
		$this->filename	= empty($filename) ? $this->filename : $filename;
		if(empty($this->filename)) return ExceptionTrigger::raise(new NotFoundException("template"));
		$filename = Url::parseAbsolute($this->path,$this->filename);
		$variables = $this->_setSpecialVariables(array_merge(ArrayUtil::arrays($variables),ArrayUtil::arrays($this->variables)));
		$cacheurl = $this->_getCacheUrl($filename);
		$this->tmpurl = empty($remotePath) ? $this->url : $remotePath;
		$rhaco_tag_parse_src = "";

echo $filename . "<br />";
		if(!Variable::bool(Rhaco::constant("NOT_MAKE_CACHE")) && Variable::bool(Rhaco::constant("TEMPLATE_CACHE")) &&
			!Cache::isExpiry($cacheurl,Rhaco::constant("TEMPLATE_CACHE_TIME",86400)) && (FileUtil::time($filename) < Cache::time($cacheurl))
		){
echo "in<br />";
			$rhaco_tag_parse_src = Cache::execute($cacheurl,$variables);
		}else{
echo "out<br />";
			$rhaco_tag_parser_read_src = $this->_parse($this->_getTemplateSource($filename));
			if(Variable::bool(Rhaco::constant("TEMPLATE_CACHE")) && !Variable::bool(Rhaco::constant("NOT_MAKE_CACHE"))){
				Cache::set($cacheurl,$rhaco_tag_parser_read_src);
			}
if(Variable::bool(Rhaco::constant("TEMPLATE_CACHE")) && !Variable::bool(Rhaco::constant("NOT_MAKE_CACHE")) &&
Rhaco::constant("TEMPLATE_CACHE_TIME") == 0) {
$rhaco_tag_parse_src = Cache::execute($cacheurl,$variables);
} else {
			$rhaco_snapshot = new Snapshot();
			Rhaco::execute($rhaco_tag_parser_read_src,$variables);
			$rhaco_tag_parse_src = $rhaco_snapshot->get();
			unset($rhaco_snapshot,$rhaco_tag_parser_read_src);
}
		}
echo Rhaco::constant("TEMPLATE_CACHE_TIME") . "<br />";
		unset($filename,$variables,$cacheurl);
		return StringUtil::encode($this->_callFilter("publish",$this->_call($rhaco_tag_parse_src,"_doRead")),$this->encodeType);
	}

これで、テンプレートでエラー発生したとき、

C:\xampp\htdocs\pdt\myrhaco\01\work\cache\.41723fa0b88088e663506ac75a690999(147)

のようになります。