旅するえんじにあ - Engineers to Travel -

旅するエンジニアの気まま備忘録

【PHP】 filemtime関数の罠

APCでデータのキャッシュをさせつつ、色々とロジックを組んでテストしている最中にテストが通らなかったのでメモ

やりたかった事としては

・ファイルをオープンして配列化 ・配列化したデータをAPCにキャッシュ ・キャッシュさせたデータにファイルの変更日付を持たせる ・ファイルが更新されたらファイルオープンして配列化してデータをAPCに上書き

こんな処理をするmethodを作成しました。

このテストの一部に以下のテストを実施しました。

CSVファイルを設置し、配列化したデータをAPCキャッシュにstore ・ファイルの変更日時を更新 ・APCに入れているデータの日付とファイル変更をしたファイルの日付を比較 ・変更したファイルのデータを配列化して上書きする

上記のテストを実行したのだけどどうも通らない。

もちろん自分の書いたプログラムなんて信用できない。 だからテストを行っているのですが、そのテストが通らない。 テストのテストを書くか。。。いやいやいやいやいや。

ってことで書いたプログラムをにらめっこしてても解決せず。 dumpしながら確認していった結果、ファイルの時間を取得する部分がうまく動いていない。

ファイルを変更したにも関わらず、最初に入れた時の時間を返す。

もしかしたらtouch関数が何か邪魔をしているのかと思いつつ sleepさせながら確認してみたけど、やっぱりfimemtimeっぽい。

ということで困ったときのPHPマニュアル

この関数は、ファイルのブロックデータが書き込まれた時間を返します。 これは、ファイルの内容が変更された際の時間です。


返り値 ¶

ファイルの最終更新時刻を返し、失敗した場合に FALSE を返します 時間は Unix タイムスタンプとして返されます。 この関数の結果は date() 等で使用できます。

OK,言ってる事はわかるよ。 やりたいのそれですからね。

そこまで見て実装していたのが悪かったです。

注意: この関数の結果は キャッシュされます。詳細は、clearstatcache() を参照してください。

ははーんこれか。 ファイルの情報キャッシュされて変更日はキャッシュした日付を取ってきているのか。 っていうことで、処理の手前にclearstatcache(path)を入れて解決。

まさかキャッシュされているとは思わず。。。