2

非常に単純なページカウンターと、ファイルに格納されているカウンターをインクリメントし、クライアントのオペレーティングシステムとクライアントが使用しているブラウザーに関する情報をログに記録するログスクリプトを作成しました。これは私が取り組んできた単純な空き時間プロジェクトであり、非常に初歩的なものであり、サイトの各ページの指定されたフォルダーに、毎日新しいファイルにカウンターとログ情報を書き込みます。

最近、blitz.ioを使用してサイトをテストし、毎秒250リクエストの「ラッシュ」を実行すると、最後のクエリを除いて、カウンターとログが完全にフラッシュされました。

何が起こったのか完全にはわかりませんが、PHPに沿った何かが、次のクエリを実行する前に前のクエリを適切に終了していないのではないかと思います。

file()の代わりに、両方にfile_get_contents()/ file_put_contents()を使用します。file()に変更すると問題は解決しますか?

カウンターは次のとおりです。

    $filename = '.' . $_SERVER['PHP_SELF'];
$counterpath = '/Websites/inc/logs/counters/total/' . getCurrentFileName() . '-counter.txt';
$globalcounter = '/Websites/inc/logs/counters/total/global-counter.txt';

if (file_exists($counterpath)) {
    $hit_count = file_get_contents($counterpath);
    $hit_count++;
    file_put_contents($counterpath,$hit_count);
}
else {
    $hit_count = "1";
    file_put_contents($counterpath, $hit_count);
}

そして、これがロガーです:

$logdatefolder = '/Websites/inc/logs/ip/' . date('Y-m-d',$_SERVER['REQUEST_TIME_FLOAT']);
    $logfile = $logdatefolder . "/" . getCurrentFileName() . '-iplog.html';
    $ua = getbrowser();
    if (false == (file_exists($logdatefolder))) {
        mkdir($logdatefolder);
    }
    function checkRef() {
        if (!isset($_SERVER['HTTP_REFERER'])) {
            //If not isset -> set with dummy value
            $_SERVER['HTTP_REFERER'] = 'N/A';
        } 
        return $_SERVER['HTTP_REFERER'];
    }

    /* Main logger */
    $logheader = "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en-US\"><head><title>" . getCurrentFileName() . " log</title><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /></head><body>";
    $logentry = date("Y-m-d, H:i:s, O T") . ":" . 
    "<br />- Requesting: http://giphtbase.org" . $_SERVER['REQUEST_URI'] . 
    "<br />- Arriving from: " . checkRef() . 
    "<br />- Browser: " . $ua['browser'] . 
    "<br />- Full browser name: " . $ua['name'] . 
    "<br />- Operating system: " . $ua['platform'] . 
    "<br />- Full user agent: " . $ua['userAgent'] . 
    "<br />";
    $logfooter = "<!-- Bottom --></body></html>";

    if (file_exists($logfile)) {
        $logPage = file_get_contents($logfile);
        $logContents = str_replace("<!-- Bottom --></body></html>","",$logPage);
        file_put_contents($logfile, $logContents . $logentry . $logfooter);
    }
    elseif (false == (file_exists($logfile))) {
        file_put_contents($logfile, $logheader . $logentry . $logfooter);
    }
4

1 に答える 1

1

FILE_APPENDフラグを使用する必要があります。file_put_contents()そうしないと、最後のエントリしか表示されません。

file_put_contents($logfile, $logContents . $logentry . $logfooter, FILE_APPEND);

カウンターに関しては、ファイルが異なるスレッドによって何度も書き込まれようとしているため、アクセスできなくなっているようです。データベースを使用するか、file_lockを作成するか、一時ファイルを作成してcronjobを実行して計算を行う必要があります。

于 2013-01-04T17:50:15.383 に答える