gpt4 book ai didi

php - 防止flock引起的死锁

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:39:52 24 4
gpt4 key购买 nike

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

$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)) {} 中条件 block 。

为了准确找出卡住的内容和位置,我会在每次调用 flock() 之前和之后添加时间戳(并刷新,因此输出缓冲区中没有任何内容)调试输出, fopen()fwrite()fclose(),并将每个脚本实例的输出重定向到它自己的文件。

然后,在卡住 + 重新启动后,您可以查看每个文件的末尾并查看重新启动时每个脚本在做什么。通过比较日期戳,您应该能够看到哪个脚本首先“卡住”。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com