Jen*_*ell 9 php timeout httprequest
我使用PHP并且需要运行10个任务.他们中的每一个都不应该超时,但所有10个任务可能会在一起.
使用带有新http请求的模块化方法是一个很好的解决方案吗?
像这样的东西:
http://example.com/some/module/fetch
http://example.com/some/module/parse
http://example.com/some/module/save
Run Code Online (Sandbox Code Playgroud)
也许这些网址各自执行一项任务.如果成功,请执行该任务的下一个任务.一种连锁反应.一条路径调用下一条路径(使用curl).
优点和缺点?这是一个好方法吗?如果没有,什么是更好的选择?
模块化方法是一个好主意(如果一个“单元”发生故障,作业会根据您的需要停止;此外,调试/测试每个单独的单元也更简单)。
它会起作用,但是您的链接方法存在一些问题:
为了获得更多控制,您应该使用排队系统来进行此类操作。
使用 PHP(或任何语言,实际上),您的基本过程是:
每个“单元”都是一个不断循环的 php 脚本,永远不会结束*
每个“单元”进程监听一个排队系统;当一个作业到达它可以处理的队列时,它将它从队列中取出
当每个单元完成作业时,它会确认已处理并推送到下一个队列。
如果单位决定作业不应继续,请确认已处理的作业,但不要推送到下一个队列。
优点:
关于“连续循环 PHP”的旁注:这是通过将 max_execution_time 设置为“0”来完成的。确保您不会导致“内存泄漏”并具有 cleanm 。您可以在启动时自动启动该进程(systemd 或任务调度程序,具体取决于操作系统)或手动运行以进行测试。如果您不想让它不断循环,请在 5 分钟后超时并重新启动 cron/任务调度程序。
关于队列的旁注:您可以使用内存缓存数据库“自行推出”简单的应用程序(例如,使用数据库系统可以轻松地每小时处理队列中的 100,000 个项目),但避免冲突/管理状态/重试有点困难属于一门艺术。更好的选择是 RabbitMQ ( https://www.rabbitmq.com/ )。安装起来有点麻烦,但是一旦安装了它,请按照 PHP 教程进行操作,您将永远不会回头!