0

この問題は、最初に呼び出されたときにのみ発生します。2回目は、エラーも問題もありません。為替レートを更新するために1日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);

    }
4

2 に答える 2

2

まったく必要ありませんtouch()touch()ファイルが存在しない場合はファイルを作成します (作成したばかりなので存在します)。または、現在の日付と時刻に時刻を設定します (これは によって既に行われていfclose()ます)。

いずれにせよ、すでに行われていることを行います。

そうは言っても、正解は Mark Ba​​ker によるものtouch()です。ファイル ハンドルではなく、ファイル名を指定する必要があります。

更新: 「2 回目、エラーも問題もありません。なぜですか?」と尋ねます。その呼び出しを呼び出してエラーを発生させない方法がわかりません。fopenが失敗して が返された場合でも、falseからエラーが発生しtouch()ます。したがって、この「2回目」では、関数が実際にまったく呼び出されないか、実行が touch() に到達するのを妨げる微妙なバグがあるのではないかと心配しています。エラーが発生する可能性もありますが、何らかの方法でキャッチまたは非表示になります。

しかし、これは確かにわかっています。毎回失敗しますtouch(<resource>)

于 2013-01-17T10:48:27.133 に答える
1

touchファイル名 imo. あなたはそれにファイルハンドルを与えています$pFile

に変更touch($pFile);touch(self::OPT_FILE);て、動作することを確認します。

于 2013-01-17T10:47:57.897 に答える