質問: file_exists()は、phpでは遅すぎます。誰かがより速い代替案を提案できますか? ウェブサイトに画像を表示するとき、file_exists()を呼び出してファイルが存在するかどうかを確認します。ファイルが見つからなかった場合は、ダミーの画像にフォールバックします。ただし、プロファイリングでは、これがfile_exists()を使用してページを生成する最も遅い部分であり、ファイルごとに最大1/2 msがかかることが示されています。テストするのは40ファイルほどですが、これでもページの読み込み時間に20msがプッシュされます。これをより速くする方法を誰かが提案できますか?ファイルが存在するかどうかをテストするより良い方法はありますか?ある種のキャッシュを構築する場合、どのようにして同期を保つ必要がありますか。
回答: php 5.6:を使用したベンチマーク既存のファイル:0.0012969970 : stream_resolve_include_path + include 0.0013520717 : file_exists + include 0.0013728141 : @include 無効なファイル:0.0000281333 : file_exists + include 0.0000319480 : stream_resolve_include_path + include 0.0001471042 : @include 無効なフォルダ:0.0000281333 : file_exists + include 0.0000360012 : stream_resolve_include_path + include 0.0001239776 : @include コード:// microtime(true) is less accurate. function microtime_as_num($microtime){ $time = array_sum(explode(' ', $microtime)); return $time; } function test_error_suppression_include ($file) { $x = 0; $x = @include($file); return $x; } function test_file_exists_include($file) { $x = 0; $x = file_exists($file); if ($x === true) { include $file; } return $x; } function test_stream_resolve_include_path_include($file) { $x = 0; $x = stream_resolve_include_path($file); if ($x !== false) { include $file; } return $x; } function run_test($file, $test_name) { echo $test_name . ":\n"; echo str_repeat('=',strlen($test_name) + 1) . "\n"; $results = array(); $dec = 10000000000; // digit precision as a multiplier $i = 0; $j = 0; $time_start = 0; $time_end = 0; $x = -1; $time = 0; $time_start = microtime(); $x= test_error_suppression_include($file); $time_end = microtime(); $time = microtime_as_num($time_end) - microtime_as_num($time_start); $results[$time*$dec] = '@include'; $i = 0; $j = 0; $time_start = 0; $time_end = 0; $x = -1; $time = 0; $time_start = microtime(); $x= test_stream_resolve_include_path_include($file); $time_end = microtime(); $time = microtime_as_num($time_end) - microtime_as_num($time_start); $results[$time * $dec] = 'stream_resolve_include_path + include'; $i = 0; $j = 0; $time_start = 0; $time_end = 0; $x = -1; $time = 0; $time_start = microtime(); $x= test_file_exists_include($file); $time_end = microtime(); $time = microtime_as_num($time_end) - microtime_as_num($time_start); $results[$time * $dec ] = 'file_exists + include'; ksort($results, sort_numeric); foreach($results as $seconds => $test) { echo number_format($seconds/$dec,10) . ' : ' . $test . "\n"; } echo "\n\n"; } run_test($argv[1],$argv[2]); コマンドライン実行:php test.php '/path/to/existing_but_empty_file.php' 'existing file' php test.php '/path/to/non_existing_file.php' 'invalid file' php test.php '/path/invalid/non_existing_file.php' 'invalid folder'