PHP通过使用使用http请求的模块来防止超时

延斯·托内尔(JensTörnell)

我使用PHP,并且有10项需要运行的任务。它们中的每一个都不应超时,但是所有10个任务都可能超时。

在新的http请求中使用模块化方法是否是一个好的解决方案?

像这样的东西:

http://example.com/some/module/fetch
http://example.com/some/module/parse
http://example.com/some/module/save

也许这些url各自执行一项任务。如果成功,请执行该任务的下一个任务。一种连锁反应。一个路径调用下一个路径(卷曲)。

利弊?这是一个好方法吗?如果没有,还有什么更好的选择?

罗比

模块化方法是一个好主意(如果一个“单元”失败,工作将按您的意愿停止;另外,调试/测试每个单独的单元也更简单)。

它将起作用,但是您的链接方法存在一些问题:

  • 如果存在瓶颈(即一个“单元”花费的时间比其他“单元”长),那么最终可能会导致100个瓶颈进程全部运行,并且您将失去对服务器资源的控制权
  • 缺乏控制;假设服务器需要重新启动:要重新启动作业,则需要在开始时全部启动它们。
  • 同样,如果由于某种原因在运行时需要停止/启动/调试单个单元,则需要在第一个单元上重新启动作业以重复执行。
  • 通过发出Web请求,您就在使用Apache / NGIX资源,内存,套接字连接等来运行PHP进程。您可以直接运行PHP进程,而无需使用开销。
  • 最后,如果在DMZ的Web服务器上,则该服务器实际上可能无法对其自身发出请求。

为了获得更多控制,您应该使用排队系统进行此类操作。

使用PHP(实际上是任何语言),您的基本过程是:

  1. 每个“单元”都是一个永无休止的不断循环的php脚本*

  2. 每个“单元”过程都监听一个排队系统;当作业到达它可以处理的队列时,它将其从队列中移出

  3. 当每个单元完成作业时,它确认已处理并推送到下一个队列。

  4. 如果单位决定该作业不应该继续,请确认已处理该作业,但不要推送到下一个队列。

好处:

  • 如果“单元”停止,则作业将保留在队列中,并且在重新启动“单元”时可以将其收集。使重新启动单元/服务器或一个单元崩溃更容易。
  • 如果一个“单元”非常重,如果您有空间服务器容量,则可以开始执行完全相同的第二个过程。如果没有服务器容量,则表示您接受了瓶颈;因此,您对正在使用的资源有一个非常透明的视图。
  • 如果您决定使用另一种语言来更好地处理请求,则可以将NodeJS,Python,Ruby和...混合使用,它们都可以与相同的队列通信。

关于“不断循环PHP”的旁注:这是通过将max_execution_time设置为“ 0”来完成的。确保您不会引起“内存泄漏”并保持干净。您可以在启动时自动启动该过程(取决于操作系统,是systemd或任务计划程序),也可以手动运行以进行测试。如果您不希望它连续循环,请在5分钟后超时并重新启动cron / task Scheduler。

关于队列的旁注:对于简单的应用程序,您可以使用内存高速缓存数据库“自己动手”(例如,使用数据库系统可以轻松地每小时在队列中处理100,000个项目),但是避免冲突/管理状态/重试有点一门艺术。更好的选择是RabbitMQ(https://www.rabbitmq.com/)。安装有点麻烦,但是一旦安装它,请按照PHP教程进行操作,您将永远不会回头!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过长时间运行的后台工作来防止HTTP请求超时

来自分类Dev

使用 HTTP 模块保护请求

来自分类Dev

AngularJS:使用超时属性取消$ http请求

来自分类Dev

使用RestTemplate的Http请求超时的SimpleClientHttpRequestFactory与HttpComponentsClientHttpRequestFactory

来自分类Dev

模拟使用HTTPretty超时的HTTP请求

来自分类Dev

是否允许使用409冲突状态代码来防止某些字段在HTTP PUT请求中被更新

来自分类Dev

防止有角度的 http post 请求超时

来自分类Dev

使用请求模块的HTTP删除消息

来自分类Dev

使用请求模块的HTTP删除消息

来自分类Dev

通过使用.htaccess和PHP的图像分辨率来防止热链接?

来自分类Dev

通过超时建立http请求-Java

来自分类Dev

使用HTTP.jl设置获取请求的超时

来自分类Dev

使用Java发送HTTP请求时连接超时

来自分类Dev

使用requirejs的模块加载超时

来自分类Dev

如何通过在 python 中使用请求来设置 cookie?

来自分类Dev

使用 Node 的请求模块通过 REST API 上传文件

来自分类Dev

如何使用PHP会话来防止重复提交表单?

来自分类Dev

使用异步Node.JS来服务HTTP请求

来自分类Dev

使用Python请求模块获取HTTP响应标头

来自分类Dev

强制PHP SoapClient使用HTTP GET请求

来自分类Dev

使用PHP发出HTTP / 2请求

来自分类Dev

使用PHP + cURL的HTTP POST请求

来自分类Dev

在Bluemix上使用PHP发送HTTP请求

来自分类Dev

php通过var来卷曲请求

来自分类Dev

通过导入ES6模块来加载和使用旧版JS模块(例如IIFE)

来自分类Dev

通过POST请求调用外部HTTP时,Cloud Functions超时

来自分类Dev

防止Ajax请求超时(jquery)

来自分类Dev

使用GetOverlappedResultEx中的超时来模拟超时等待?

来自分类Dev

使用AngularJS的$ http服务通过GET请求发送数组

Related 相关文章

  1. 1

    通过长时间运行的后台工作来防止HTTP请求超时

  2. 2

    使用 HTTP 模块保护请求

  3. 3

    AngularJS:使用超时属性取消$ http请求

  4. 4

    使用RestTemplate的Http请求超时的SimpleClientHttpRequestFactory与HttpComponentsClientHttpRequestFactory

  5. 5

    模拟使用HTTPretty超时的HTTP请求

  6. 6

    是否允许使用409冲突状态代码来防止某些字段在HTTP PUT请求中被更新

  7. 7

    防止有角度的 http post 请求超时

  8. 8

    使用请求模块的HTTP删除消息

  9. 9

    使用请求模块的HTTP删除消息

  10. 10

    通过使用.htaccess和PHP的图像分辨率来防止热链接?

  11. 11

    通过超时建立http请求-Java

  12. 12

    使用HTTP.jl设置获取请求的超时

  13. 13

    使用Java发送HTTP请求时连接超时

  14. 14

    使用requirejs的模块加载超时

  15. 15

    如何通过在 python 中使用请求来设置 cookie?

  16. 16

    使用 Node 的请求模块通过 REST API 上传文件

  17. 17

    如何使用PHP会话来防止重复提交表单?

  18. 18

    使用异步Node.JS来服务HTTP请求

  19. 19

    使用Python请求模块获取HTTP响应标头

  20. 20

    强制PHP SoapClient使用HTTP GET请求

  21. 21

    使用PHP发出HTTP / 2请求

  22. 22

    使用PHP + cURL的HTTP POST请求

  23. 23

    在Bluemix上使用PHP发送HTTP请求

  24. 24

    php通过var来卷曲请求

  25. 25

    通过导入ES6模块来加载和使用旧版JS模块(例如IIFE)

  26. 26

    通过POST请求调用外部HTTP时,Cloud Functions超时

  27. 27

    防止Ajax请求超时(jquery)

  28. 28

    使用GetOverlappedResultEx中的超时来模拟超时等待?

  29. 29

    使用AngularJS的$ http服务通过GET请求发送数组

热门标签

归档