我正在尝试模拟在繁忙站点上写入文件。我写了下面的代码,最终导致计算机卡住。

$loop = 10000;
$sleep = 500000;
$i =0;

while($i < $loop) {

    $mtime = microtime();
    $mtime = explode(" ",$mtime);
    $mtime = $mtime[1] + $mtime[0];
    $starttime = $mtime;

    $handler = fopen($file,"a+");
    if($handler) {
    if (flock($handler, LOCK_EX)) {
        $mtime = microtime();
        $mtime = explode(" ",$mtime);
        $mtime = $mtime[1] + $mtime[0];
        $endtime = $mtime;
        $totaltime = ($endtime - $starttime);

        fwrite($handler,"Script 1 took $totaltime secs\n");
    }

    flock($handler, LOCK_UN);
    fclose($handler);
}
$i++;
usleep($sleep);
}

我无法使用LOCK_NB,因为它将无法在Windows上运行。如果少于13个进程同时执行上述代码,则该代码可以正常工作。我该如何应对这种僵局?

最佳答案

阅读您的代码,我认为您应该将flock($handler, LOCK_UN);移到if (flock($handler, LOCK_EX)) {}条件块中。
为了弄清楚到底是什么卡住了,在哪里,我将在每次调用flock()fopen()fwrite()fclose()之前和之后添加带时间戳的代码(并冲洗掉,以便什么都不会卡在输出缓冲区中),并调试输出,并从每个脚本实例到其自己的文件。
然后,在卡住+重新启动后,您可以查看每个文件的末尾,并查看重新启动时每个脚本在做什么。通过比较日期戳,您应该能够看到哪个脚本先被“卡住”了。

关于php - 防止因羊群引起的死锁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5771950/

10-14 08:38