在 PHP 中延迟发送消息(没有 "sleep" 功能)
To send a message with a delay in PHP (without "sleep" function)
正在尝试在我的电报机器人中实现掷骰子功能。
现在如何运作:
- 当用户发送“掷骰子”机器人时,使用 sendDice 方法回复并发送另一条消息,结果为“你掷出 5,你赢了等等......”
> how it looks <
问题是 — 第二条消息不应立即出现,最好是在掷骰子动画结束后出现。
我的第一个明显的尝试是在发送第二条消息之前添加 "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() 您的方法,它从数据库获取记录,检查时间戳并发送消息
正在尝试在我的电报机器人中实现掷骰子功能。 现在如何运作:
- 当用户发送“掷骰子”机器人时,使用 sendDice 方法回复并发送另一条消息,结果为“你掷出 5,你赢了等等......” > how it looks <
问题是 — 第二条消息不应立即出现,最好是在掷骰子动画结束后出现。
我的第一个明显的尝试是在发送第二条消息之前添加 "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() 您的方法,它从数据库获取记录,检查时间戳并发送消息