2

PHP をいじり始めたところ、Web ページのヒット カウンターとして機能するはずの次のコード スニペットを見つけました。

/* counter */

//opens countlog.txt to read the number of hits
$datei = fopen("/countlog.txt","r");
$count = fgets($datei,1000);
fclose($datei);
$count=$count + 1 ;
echo "$count" ;
echo " hits" ;
echo "\n" ;

// opens countlog.txt to change new hit number
$datei = fopen("/countlog.txt","w");
fwrite($datei, $count);
fclose($datei);

私が読んだことに基づいて、サーバー上で複数のリクエストを同時に実行できます。countlog.txtしたがって、このファイルに同時にアクセスする可能性があります(正しいですか?)。もしそうなら、このコードは忙しいウェブサイトでは機能しません (正しいですか?)。このコードを変更して、忙しいウェブサイトで機能させるにはどうすればよいでしょうか? 複数のリクエスト間で共有される PHP でロックを使用できますか?

PS: 質問はカウンターに関するものではありません。可能であれば、回答で SQL を使用しないでください。

4

2 に答える 2

0

flock() を使用して、ファイルの排他ロックを取得できます。http://php.net/manual/en/function.flock.phpを参照してください。

$fp = fopen("/tmp/lock.txt", "r+");

if (flock($fp, LOCK_EX)) {
    $datei = fopen("/countlog.txt","r");
    $count = fgets($datei,1000);

    $count=$count + 1 ;
    echo "$count" ;
    echo " hits" ;
    echo "\n" ;

    ftruncate($fp, 0);
    fwrite($fp, $count);
    fflush($fp);
    flock($fp, LOCK_UN);
} else {
    echo "Could not lock file!";
}

fclose($fp);

おそらく、アクティブな待機を避けるために、usleep() を使用してロックの成功を待機するループを構築する必要があります: http://php.net/manual/en/function.usleep.php

于 2015-12-14T06:47:03.113 に答える