异步 PHP cron 作业?有可能吗?

问题描述 投票:0回答:4

我需要编写一个 cron (php) 脚本来从多个网站获取 html 结果。

假设我的数据库有 50 个网站记录(即 http://www.somewebsite.com/page.php)。因此 cron 作业将设置为每 x 分钟运行一次。当它运行时,它会从数据库加载记录,检查每个网站的状态,然后从中获取 HTML 结果并进行分析。

我担心的是,如果第n条记录中的网站没有响应,或者加载需要一些时间(即海外网站),那么第n+1条记录将不会运行,直到第n条记录完成,那么这个 cron 作业将需要一段时间才能完成。

如果我在浏览器上执行脚本,那么可以使用ajax异步轻松处理它,但是这是一个cron作业,所以我不知道如何处理这种情况。

php asynchronous cron
4个回答
0
投票

这是你可以做的, 从 crontab 运行 sh 脚本,并在脚本中调用处理异步任务的 .php 程序。


0
投票

我认为如果需要“异步”,最好转向其他语言。这是对创建整体系统架构方式的重大升级。因此,对于任何 PHP 开发人员来说,这都是一次重大升级,因为我自己在 PHP 上投入了大量资金,并寻求 NodeJS 来寻求更好的解决方案。尽管引入了术语“Aync”,但 PHP 内部或核心尚不支持此类需求。


0
投票

我一直在努力应对多个 cron 的问题,这需要花费大量时间。这是我发现的可以解决我问题的东西。

curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1);

属性CURLOPT_TIMEOUT_MS定义了curl在继续执行之前等待响应的时间(以毫秒为单位)。将其设置为 1 本质上意味着没有延迟。


0
投票

这是可能的,甚至相当容易。您正在寻找的不是异步,而是并行。

您正在寻找的称为消费者:您有一个任务列表,并且一个或多个消费者在该列表中工作。当消费者可用时,它会向列表(也称为队列)询问列表中的下一个任务。

这意味着这将会发生

  • 消费者 1 接受任务 1
  • 消费者2接受任务2
  • Consumer1 变得可用:Consumer1 接受 Task3
  • Consumer1 变得可用:Consumer1 接受 Task4

您可以选择(至少)两条路线:

自己做:

  • 当消费者接受“开放”任务时,立即更新数据库。在执行其他操作之前,将此行的状态从“打开”设置为“处理”。
  • 因为消费者只接受一个“开放”任务,所以下一个消费者将接受下一个任务
  • 工作完成后,将状态设置为“完成”
  • 或者:当发生错误时,将状态设置为“错误”

使用排队系统

  • 您可以采用预构建的队列系统。例如,我们使用rabbitMQ系统(与(不附属)cloudamqp.com)。这处理了大部分工作,并且大多数框架都有某种形式的 amqp 消息处理插件。
© www.soinside.com 2019 - 2024. All rights reserved.