14

Linux で数バイトを含むファイルの場合、最後に処理されてから変更されたときにのみ処理する必要があります。clearstatcache(); filemtime();定期的に PHP を呼び出して、ファイルが変更されたかどうかを確認します。ファイル全体は常に小さいため、filemtime の呼び出しを削除し、内容を過去の内容と比較してファイルの変更を確認すると、パフォーマンスが向上しますか? または、パフォーマンスの観点から、そのための最良の方法は何ですか。

4

4 に答える 4

15

使用するfilemtime + clearstatcache

@Ben_D のテストを強化するには:

<?php

$file = 'small_file.html';
$loops = 1000000;

// filesize (fast)
$start_time = microtime(1);
for ($i = 0; $i < $loops; $i++) {
    $file_size = filesize($file);
}
$end_time = microtime(1);
$time_for_file_size = $end_time - $start_time;

// filemtime (fastest)
$start_time = microtime(1);
for ($i = 0; $i < $loops; $i++) {
    $file_mtime = filemtime($file);
}
$end_time = microtime(1);
$time_for_filemtime = $end_time - $start_time;

// filemtime + no cache (fast and reliable)
$start_time = microtime(1);
for ($i = 0; $i < $loops; $i++) {
    clearstatcache();
    $file_mtime_nc = filemtime($file);
}
$end_time = microtime(1);
$time_for_filemtime_nc = $end_time - $start_time;

// file_get_contents  (slow and reliable)
$start_time = microtime(1);
for ($i = 0; $i < $loops; $i++) {
    $file_contents = file_get_contents($file);
}
$end_time = microtime(1);
$time_for_file_get_contents = $end_time - $start_time;

// output
echo "
<p>Working on file '$file'</p>
<p>Size: $file_size B</p>
<p>last modified timestamp: $file_mtime</p>
<p>file contents: $file_contents</p>

<h1>Profile</h1>
<p>filesize: $time_for_file_size</p>
<p>filemtime: $time_for_filemtime</p>
<p>filemtime + no cache: $time_for_filemtime_nc</p>
<p>file_get_contents: $time_for_file_get_contents</p>";

/* End of file */

結果

于 2013-11-13T16:52:23.327 に答える
8

私はパーティーに遅れていることを知っていますが、少しのベンチマークが議論を損なうことはありません. ブライアン・ローチの直感は、比較ステップを考慮に入れる前であっても、サウンドを証明します。

テスト:

$file = "small_file.html";
$file_size = filesize($file);

//get the filemtime 1,000,000 times
$start_time = microtime(true);
for($i=0;$i<1000000;$i++){
    $set_time = filemtime($file);
}
$end_time = microtime(true);

$time_for_filemtime = ($end_time-$start_time);

//get the time for file_get_contents 1,000,000 times
$start_time = microtime(true);
$file = "small_file.html";
for($i=0;$i<1000000;$i++){
    $set_time = file_get_contents($file);
}
$end_time = microtime(true);

$time_for_file_get_contents = ($end_time-$start_time);

echo "<p>Working on a file that is $file_size B long</p>
<p>filemtime: $time_for_filemtime vs file_get_contents: $time_for_file_get_contents";

結果

長さが 41 B のファイルでの作業

filemtime: 0.36287999153137 vs file_get_contents: 16.191468000412

「ファイル システムに何らかのメタデータを要求する」ことは、「ファイルを開いて読み込み、内容を比較する」よりも高速です。

于 2013-01-25T22:30:24.813 に答える
4

ファイルを stat するには、ファイル システムに何らかのメタデータを要求するだけです。

2 番目のアプローチでは、ファイルを開いて読み込み、内容を比較します。

どちらが速いと思いますか?;)

于 2011-05-01T17:49:50.700 に答える
3

ファイルへの変更について通知を受ける最良の方法はinotify、まさにこの目的のために設計された です。

inotify 拡張機能を参照してください。

于 2011-05-01T17:49:30.370 に答える