PHP is_file関数について

質問全般・改善要望
返信する
Ralph
メンバー
メンバー
記事: 24
登録日時: 2012年8月09日(木) 11:42

PHP is_file関数について

投稿記事 by Ralph »

お世話になっております。

以前、イベントログにて下記の様なエラーがありました。

コード: 全て選択

« MODX Parse Error »
MODX encountered the following error while attempting to parse the requested resource:
« PHP Parse Error »
PHP error debug
Error : file_get_contents(/~/assets/cache/process.pageCache.php): failed to open stream: No such file or directory
ErrorType[num] :	WARNING[2]
File :	/~/manager/includes/document.parser.class.inc.php
Line :	3295
Source :	 $src = file_get_contents($cache_path);
Basic info
REQUEST_URI :	/feed.xml
Referer :	
User Agent :	Mozilla/4.0 (Windows 98; US) Opera 10.00 [en]
IP :	37.228.106.34
Benchmarks
MySQL :	0.0005 s (0 Requests)
PHP :	0.0179 s
Total :	0.0184 s
Memory :	2.47 MB

Backtrace

1	DocumentParser->executeParser()
index.php on line 149
2	DocumentParser->initProcessCache()
manager/includes/document.parser.class.inc.php on line 203
3	file_get_contents()
manager/includes/document.parser.class.inc.php on line 3295
調査したところ、「DocumentParser->initProcessCache()」は、下記コードとなっていました。

コード: 全て選択

function initProcessCache()
        {
                $cache_path = $this->config['base_path'] . 'assets/cache/process.pageCache.php';
                if(is_file($cache_path))
                {
                        $src = file_get_contents($cache_path);
                        $this->processCache = unserialize($src);
                }
                else $this->processCache = array();
        }
不可解な事に、「is_file」が通ったにも関わらず、「file_get_contents」にて『No such file or directory』のエラーが稀に出てしまいます。
PHPリファレンスを調べたところ、http://us2.php.net/manual/ja/function.i ... ャッシュされるらしく
「clearstatcache()」によってキャッシュをクリアする必要があるようです。
他に回避方法が検討できていないのですが、ご検討をよろしくお願いいたします。
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: PHP is_file関数について

投稿記事 by yama »

同じような現象をGMO系のサーバで確認したことがありましたが、その時はclearstatcache関数では解決できませんでした。
今回の件ではclearstatcache関数をis_file判定の直前に置くことで解決しましたでしょうか?
Ralph
メンバー
メンバー
記事: 24
登録日時: 2012年8月09日(木) 11:42

Re: PHP is_file関数について

投稿記事 by Ralph »

yama様

ありがとうございます。
そうですか・・・
まだ試せてはいないので、試してみます。
Ralph
メンバー
メンバー
記事: 24
登録日時: 2012年8月09日(木) 11:42

Re: PHP is_file関数について

投稿記事 by Ralph »

上記コードの「is_file」関数の直前に『clearstatcache()』を挿入しましたが、
依然としてエラーが出来てきてしまいます。

コード: 全て選択

function initProcessCache()
        {
                $cache_path = $this->config['base_path'] . 'assets/cache/process.pageCache.php';
                clearstatcache();
                if(is_file($cache_path))
                {
                        $src = file_get_contents($cache_path);
                        $this->processCache = unserialize($src);
                }
                else $this->processCache = array();
        }
何か良い解決策は無いのでしょうかね?
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: PHP is_file関数について

投稿記事 by yama »

コード: 全て選択

$src = @file_get_contents($cache_path);
if (!empty($src)) {
    $this->processCache = unserialize($src);
} else {
    $this->processCache = array();
}
対症療法ですが、こんな感じでどうでしょう?ファイルは存在するはずなのに、おかしいなという気はしますが。file_get_contentsの挙動に何か問題があるのかも?
Ralph
メンバー
メンバー
記事: 24
登録日時: 2012年8月09日(木) 11:42

Re: PHP is_file関数について

投稿記事 by Ralph »

yama様

ありがとうございます。

こんな記事を見つけました。
http://stackoverflow.com/questions/1277 ... ted-networ
(リンク貼って大丈夫でした?)

そこで、エラーの解析の為に、下記コードで様子を見たいと思います。

コード: 全て選択

        function initProcessCache()
        {
                $cache_path = $this->config['base_path'] . 'assets/cache/process.pageCache.php';
                if(is_file($cache_path))
                {
                        try {
                                $src = file_get_contents($cache_path);
                                if(!$src) throw new Exception();
                                $this->processCache = unserialize($src);
                        } catch(Exception $e) {
                                $this->processCache = array();
                                
                                $msg = "Error at the processCache\n";
                                $msg .= "Host: " . $_SERVER['REMOTE_HOST'] . "\n";
                                $msg .= "IP: " . $_SERVER["REMOTE_ADDR"] . "\n";
                                $msg .= "Refferer: " . $_SERVER["HTTP_REFERER"] . "\n";
                                $this->logEvent("1009", 3, $message, "ProcessChache Error")
                        }
                }
                else $this->processCache = array();
        }
返信する