【问题标题】:How to make PHP listening to the job tables如何让 PHP 监听作业表
【发布时间】:2021-10-16 06:24:55
【问题描述】:

我正在开发没有框架的 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 小时(有很多错误)

虽然我可以做 cron 任务来对 curl 进行排队,比如获取前 5 个 curl 并每 1 分钟运行一次。但是如果我们不断增加用户或任务,并且第三方 api 保持缓慢。完成任务可能需要更多小时。

有没有什么办法可以让它一直监听job表,并且一个一个地运行curl? 如果将新行添加到表中,我希望它可以自动触发。 (比如 websocket?)而不是单个 php 运行和无限循环(为了防止发生一些错误,需要手动重新运行 php 任务)

(API密钥在php项目中,所以我希望我可以在同一个项目中这样做)

【问题讨论】:

  • 您要求我们更改更新数据的 PHP 脚本的性能特征。但是您没有向我们展示代码,也没有提供数据结构的任何细节。 “如果将新行添加到表中,我希望它可以自动触发” - 这不是数据库触发器的用途吗?这听起来确实像是您试图解决这里的错误问题。

标签: php curl cron message-queue


【解决方案1】:

需要触发 PHP 脚本才能执行某些操作,它们不能真正“在后台运行”(我的意思是,从技术上讲,它们可以,但不应该以这种方式使用 PHP)。

相反,通常使用以下三个选项之一来进行作业管理:

  • 每次从网络调用时调用作业,以及生成输出的实际代码
  • 使用外部 Web cron 服务来查询与作业执行相关的特定 URL
  • 使用系统上的本地 cron 作业来调用 php 可执行文件并让它定期执行作业

如果您想要一个基于事件的系统,PHP 可能是错误的选择。根据您的数据库系统,尽管您可能能够创建一个订阅数据库更改并在插入时触发的小型包装代码,然后再次调用 PHP - 但它绝对是使用更合适的编程语言/环境的更清洁的解决方案。

【讨论】:

    猜你喜欢
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2018-02-28
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    相关资源
    最近更新 更多