gpt4 book ai didi

PHP 无限 while 循环阻止对脚本的其他调用

转载 作者:搜寻专家 更新时间:2023-10-31 21:30:46 28 4
gpt4 key购买 nike

目标/动机

我想写一个服务,它应该一直运行。但是当服务已经运行时,应该不可能再次启动该服务。

用例

用户 X 打开页面 myService.php 并通过单击页面上的按钮启动服务。之后关闭浏览器。一段时间后,另一个用户打开浏览器并尝试启动该服务。但是该服务应该只启动一次。

(半)伪代码

<?php 

ignore_user_abort(TRUE);
set_time_limit(0);
$sleepTime = 60;

while(1){

if( serviceAlreadyStarted() ){
echo "Service has already been started.";
exit;
}

if( shouldServiceBeStopped() ){
echo "Service has been stopped.";
exit;
}
// DO SOMETHING
sleep($sleepTime);
}
?>

预期行为

在第二次调用再次打开服务时,用户立即收到消息。

实际行为

脚本的第二次调用没有响应,直到第一次调用由第二个条件 shouldServiceBeStopped() 退出

最佳答案

tldr:不要让用户进入第二个循环,他们可以按下按钮进入循环之前检查服务是否正在运行。

我会将值存储在数据库或 JSON 文件中(ini 文件也可以)。然后当用户第一次加载页面时,读取该值并查看它是否已经启动。然后,您可以直接向用户显示一条消息,表明进程已经启动,而不是让他们按下按钮启动它,然后再向他们显示一条消息。它减少了一个步骤并使用户更容易,它还应该解决您的问题,即第二个循环一直运行直到第一个循环停止。

问题是如果您的脚本在运行时崩溃,它会使文件标记为打开。有两种方法可以解决这个问题。第一个是你的 stopService 函数可以强制文件退出,并且在你的 where 循环中,如果它检测到这个值退出。这需要用户停止服务。第二种方法,也是我推荐的方法,是记录服务的日期/时间戳,每次循环开始时都更新文件中的日期/时间。然后在您的 serviceAlreadyStarted() 函数中,您可以检查日期/时间是否在有效期限内。如果不是,您知道脚本崩溃并可以向用户显示错误消息。

更新

我注意到您添加了一条评论,说明您几乎已经这样做了,但文件仍保持打开状态。确保在读取/设置值后立即关闭文件。也有可能你的循环执行得太快以至于它打开和关闭文件的速度太快以至于第二个副本也无法访问它。如果是这种情况,我只允许循环每 100 次左右循环打开文件,这应该也允许程序的其他实例访问该文件。

关于PHP 无限 while 循环阻止对脚本的其他调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30298746/

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