如何在 PHP 中执行异步睡眠

How to make an async sleep execution in PHP

这可以通过 cronjob 来完成,但由于我还没有切换到具有相同计划的提供商,所以我想出了我认为可能是 objective 的解决方法,甚至不是一个更好的解决方案。 范围:这是一个消息系统,您希望在用户注销时让其他用户知道。这在用户决定在应用程序中注销的情况下很容易完成,但是如果用户的 wifi 出现故障,例如,显然该应用程序将无法告诉其他用户他不再在线。 每 5 秒,应用程序会检查一次新消息,同时还会为每个用户更新 mysql 和当前时间戳。所以我认为如果应用程序每 5 秒调用一次 php 脚本检查 php 脚本时 sql table 中的时间戳是否是10 秒后被叫的还是一样,然后其他用户会被告知他下线了。 这就是我在脚本末尾所做的:

$sql =$conn->prepare ("SELECT time FROM Users WHERE username = ? limit 1");
$sql->execute(array($usernametmp));  
$oldtime = $sql->fetch(PDO::FETCH_COLUMN);
sleep(10);
$sql =$conn->prepare ("SELECT time FROM Users WHERE username = ? limit 1");
$sql->execute(array($usernametmp));  
$newtime = $sql->fetch(PDO::FETCH_COLUMN);
if ($oldtime == $newtime) 
{
(here´s where the other users are being informed
....

但遗憾的是,整个 php 脚本中的所有代码直到 10 秒睡眠后才执行。我想要的是执行 sleep 命令之前的所有代码,10 秒后,上面的代码被触发。 有人知道我怎样才能做到这一点吗?

好的,我想出了一个不错的解决方法:

每次客户端检查新消息时,在 mysql table 中为此用户添加的新时间戳也会发送到客户端。 时间戳从客户端立即发送到另一个 php 脚本,该脚本休眠 10 秒,然后检查时间戳是否与 mysql 数据库中的时间戳相同。如果是这种情况,客户端的状态将更改为离线,因为在那 10 秒内,table 中的时间戳应该有更新 - 除非客户端离线。