如何使用PHP实现Telegram机器人定时发送消息
PHP实现Telegram定时推送机器人相关问题解答
现有逻辑是否会自动每秒执行判断?
不会。PHP是请求驱动型语言,你贴出的这段代码只有在被Web请求访问、或者被命令行主动调用时才会执行一次,执行完成后进程就会直接退出,根本不会自动留在后台循环跑判断。
如果要实现每秒执行一次判断的效果,你要么额外给代码套一层死循环、每次执行完休眠1秒,要么靠外部工具每秒触发一次脚本,否则这段代码放在主机上不会产生任何自动执行的行为。
每秒判断的逻辑是否会造成过大性能压力?
会,而且这类开销完全没有必要。
- 如果用PHP死循环常驻运行:PHP本身对常驻内存场景的优化一般,长时间运行容易出现内存泄漏问题,每秒执行一次时间判断属于无意义的空耗,哪怕单次判断占用资源极少,长期运行也是纯粹的资源浪费。
- 如果靠外部请求每秒触发脚本:相当于每秒给主机发送一次无意义的请求,Web服务器、PHP进程会被频繁唤起,资源浪费比常驻循环更明显。
除了性能问题外,这个逻辑本身还有功能缺陷:如果真的每秒执行一次,在12:00这一分钟内,每次判断都会命中$time == "12:00 pm"的条件,会连续发送60条重复消息;如果判断精度到秒,又可能因为脚本执行延迟刚好卡过时间点,导致漏发消息。
更优的替代实现方案
按推荐优先级从高到低排序:
- 首选系统原生定时任务:Linux环境直接配置Crontab,Windows环境使用系统自带的任务计划程序即可。比如需要每天中午12点推送消息,只需要加一条定时规则:
这种方案平时完全不占用任何主机资源,到点系统才会唤起PHP脚本执行一次推送逻辑,脚本里不需要写任何时间判断,执行完自动释放资源,稳定性最高、性能开销几乎可以忽略。使用前记得在PHP脚本里配置正确的时区,避免推送时间偏移。0 12 * * * /usr/bin/php /你的项目实际存放路径/send_push.php - 如果使用虚拟主机、没有系统定时任务的配置权限:可以使用定时触发类服务,到点主动请求你暴露的推送脚本HTTP地址来触发执行,原理和系统定时任务一致,也不需要自己写循环判断逻辑。
- 如果一定要用PHP常驻进程实现:不要写每秒判断的循环逻辑,每次执行完推送后,直接计算当前时间距离下一次推送的时间差,调用
sleep(对应秒数)让进程进入休眠状态,到点自动唤醒执行推送即可。休眠状态下进程几乎不占用CPU资源,额外需要给进程配置守护程序(比如Supervisor),防止进程意外退出后推送失效,同时要加推送状态标记,避免同一时间点重复发送消息。
内容的提问来源于stack exchange,提问作者YK20
相关产品推荐
相关产品推荐

