Touch()期望参数1为字符串,资源给定



这个问题只在第一次调用时发生。第二次,没有错误,没有问题。每天呼叫一次以更新货币汇率。

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);,看看效果如何

最新更新