在 PHP 中延迟发送消息(没有 "sleep" 功能)

To send a message with a delay in PHP (without "sleep" function)

正在尝试在我的电报机器人中实现掷骰子功能。 现在如何运作:

问题是 — 第二条消息不应立即出现,最好是在掷骰子动画结束后出现。 我的第一个明显的尝试是在发送第二条消息之前添加 "sleep(3)",它工作正常,直到我意识到它完全延迟了我的脚本的执行那 3 秒。 (如果两个用户同时掷骰子,其中一个用户必须等到另一个人的掷骰子完成)。所以不酷

我能用什么? :c

来自Wikipedia

In computing, [..] fork is an operation whereby a process creates a copy of itself.

当您的 PHP 脚本 运行 时,您可以创建多个相互交互的进程。这些进程 运行 并发且异步。这样您就可以让一个进程等待发送消息,而脚本的其余部分继续 运行.

除了启动另一个进程,您还可以启动另一个线程。两者之间的技术差异解释如下: Forking vs Threading

PHP 报价 Process Control Extensions for both forking and threading. You might want to check out the example in the PHP documentation for pcntl_fork()

根据您的需要,您可能希望使用旨在处理整个应用程序并发性的框架。如果是这样的话,我会推荐 amphp.

最简单的选择是将“任务”添加到“队列”。队列可以是数据库中的 table,带有时间戳和聊天 ID,以及何时向谁发送消息。启动另一个进程,例如,由cron启动,运行一分钟。在那一刻,他去数据库检查是否有东西需要现在发送。

Crontab 配置

打开 crontab

sudo crontab -e

添加下一个字符串

* * * * * php /path/to/cron.php >> /path/to/log/file/for/debug.log 2>&1

Cron 运行 你的脚本每 1 分钟一次。

Cron.php“直播”60秒 cron.php:

    $now = time();
    $expectedTime = $now + 60;
    while (true) {
        Worker::run();
        if ($expectedTime < time()) {
            die(0);
        }
    }

其中 Worker::run() 您的方法,它从数据库获取记录,检查时间戳并发送消息