这个问题只在第一次调用时发生。第二次,没有错误,没有问题。每天呼叫一次以更新货币汇率。
private function updateRates()
{
$szContent = file_get_contents(self::OPT_URL);
if(!$szContent)
{
throw new Exception('XML resource unavailable.');
}
$pXML = new SimpleXMLElement($szContent);
$aRates = array();
foreach($pXML->Cube->Cube->Cube as $pChildren)
{
$aRates[(string) $pChildren['currency']] = (float) $pChildren['rate'];
}
$pFile = fopen(self::OPT_FILE, 'w+');
fwrite($pFile, json_encode($aRates));
fclose($pFile);
touch($pFile);
}
您根本不需要touch()
。如果该文件不存在(但它存在,因为您刚刚创建了它),touch()
将创建该文件,或者它将在当前日期和时间设置时间(这已经由fclose()
完成)。
无论哪种方式,你都是在做别人已经做过的事情。
也就是说,正确的答案是Mark Baker给出的:你需要给touch()
一个文件名,而不是一个文件句柄。
UPDATE:你问,"第二次,没有错误,没有问题-为什么?"我不明白你怎么能调用那个调用而不是得到一个错误。即使fopen
失败并返回false
,您也会从touch()
获得错误。所以我担心这"第二次"要么是函数根本没有被调用,要么是有一些微妙的错误阻止了它的执行到达touch()。也有可能引发错误,但它被捕获或以某种方式隐藏。
但有一点我很确定:touch(<resource>)
每次都会失败
touch
需要文件名。你给它的文件句柄是$pFile
。
把touch($pFile);
改成touch(self::OPT_FILE);
,看看效果如何