php - 如何让 PHP 监听作业表
问题描述
我正在研究在没有框架的情况下用 php 开发的系统。
它具有每天晚上通过第三方api自动运行一些作业的功能。它循环表中的所有作业并使用 curl 调用 api。
// run cron job to loop this table
ID JOB
1 updateUser
2 getLatestInfo/topicA
……
//code
// if UpdateUser
loop user table and call api to get latest info…
Also other curl task will do here like send email / notification …
以前可以完美运行。但是最近我们有很多新用户。它将同时调用 50-100 个 API。
每个 api 调用需要 10-20 秒才能响应,如果超时,我们将重试 api。
我检查了日志,仅第一份工作就需要 3-4 小时(有很多错误)
虽然我可以为 curl 排队做 cron 工作,比如获得前 5 个 curl 并每 1 分钟运行一次。但是如果我们不断增加用户或任务,并且第三方 api 保持缓慢。完成任务可能需要更多时间。
有什么解决方案可以让它一直听作业表,并一一运行 curl?如果将新行添加到表中,我希望它可以自动触发。(像websocket?)而不是单个php来运行和无限循环(为了防止发生一些错误并且需要手动重新运行php任务)
(API 密钥在 php 项目中,所以我希望我可以在同一个项目中这样做)
解决方案
PHP 脚本需要被触发才能做某事,它们不能真正“在后台运行”(我的意思是,从技术上讲,它们可以,但不应该以这种方式使用 PHP)。
相反,通常使用三个选项之一来进行作业管理:
- 在来自网络的每次调用中调用作业,以及生成输出的实际代码
- 使用外部 Web cron 服务来查询与作业执行相关的特定 URL
- 使用系统上的本地 cron 作业来调用 php 可执行文件并让它定期执行作业
如果您想要一个基于事件的系统,PHP 可能是错误的选择。根据您的数据库系统,尽管您可能能够创建一个订阅数据库更改并在插入时触发的小型包装代码,然后再次调用 PHP - 但它绝对是使用更合适的编程语言/环境的更清洁的解决方案。
推荐阅读
- c# - 如何搜索重叠的时间片?
- swift - 如何在 NSDecimalNumber 中停止舍入?
- javascript - How to lazy load remote data with React
- python - How do you get Visual Studio Code to use different Python interpreter?
- r - Subsetting Data in R not working through a vector
- google-cloud-platform - GCP:在传递到云人工智能平台之前进行数据预处理
- apache-poi - 如何修复“提供的数据似乎在 Office 2007+ XML 中。”
- c++ - 如何设置 VSCode 调试器以使用 cmake?
- c++ - 在模板类中使用友元运算符重载函数,错误未定义引用
- virtual-machine - 比实时运行更快的虚拟机