Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 随着应用程序的增长,工作程序的扩展_Php_Worker - Fatal编程技术网

Php 随着应用程序的增长,工作程序的扩展

Php 随着应用程序的增长,工作程序的扩展,php,worker,Php,Worker,我目前有一个PHP守护进程,它需要通过一个永无止境的循环运行非常快速的迭代 它看起来像而(true){/*做某事*/} 问题是,随着应用程序的增长,我的应用程序需要这个循环执行越来越多的操作。但是,如果循环运行时间过长,则可能会错过一些操作。由于循环正在发送网络请求,因此需要一些时间。目前,它每个循环只发送大约5个请求,但我已经看到它很快会增长到50个左右 如果每个请求需要1秒,则50秒的循环是不可接受的。信息将会丢失 我的问题是,如何在保持非常快速的循环迭代的同时改进当前系统以适应更多的请求

我目前有一个PHP守护进程,它需要通过一个永无止境的循环运行非常快速的迭代

它看起来像
而(true){/*做某事*/}

问题是,随着应用程序的增长,我的应用程序需要这个循环执行越来越多的操作。但是,如果循环运行时间过长,则可能会错过一些操作。由于循环正在发送网络请求,因此需要一些时间。目前,它每个循环只发送大约5个请求,但我已经看到它很快会增长到50个左右

如果每个请求需要1秒,则50秒的循环是不可接受的。信息将会丢失

我的问题是,如何在保持非常快速的循环迭代的同时改进当前系统以适应更多的请求


我知道PHP不适合这种情况,但当时提供了一个非常优雅的解决方案。我需要使用一个带有JSON编码/解码的MySQL数据库,PHP非常适合这样做。如果有更好的语言,请告诉我。

启动多个Worker,处理URL的子集。许多事情取决于您想要实现的细节,但是消息队列(比如rabbitMQ)也可能会有所帮助。例如:每个工作人员都从队列接收消息,此消息包含他们应该注意的url。

请尝试

它使用Redis作为消息队列,提供票证系统来检查工作是否完成


使用基于javascript的代码,代码很容易理解。

生成一些子流程(
pcntl\U fork
)。如果您的循环从套接字读取输入,请稍后再执行。或者单独的网络传输(接收/发送)。只想提及:这不是一个守护进程。守护进程静默地等待传入的请求(来自TCP、套接字或任何东西)来处理。这看起来更像是一个continuos worker。区别:第一个是被动的,最后一个是主动的(在本例中是轮询)。@mario我不确定在本例中如何使用pcntl_fork。@KingCrunch感谢您提供的信息,您是正确的。这个脚本是一个工作人员不断轮询数据。我以前从未编写过类似的程序。老实说,关于父/子进程的想法绝对令人困惑。为了澄清一点,这些工作人员需要不断轮询来自单一来源的数据,当发现特定信息时,他们需要发送网络请求。@SteffanLong这(至少最初)与fork或子进程无关。关键是,您有一个脚本,它从消息队列中获取消息并对消息“做些什么”。现在,您可以多次启动此脚本,它们都并行运行(操作系统负责)。//编辑:我记得我不一定有消息队列。我必须向外部服务器查询我需要的信息。您是否建议我让一名“工作人员”轮询服务器以获取信息并将其记录到数据库中,以及任何数量的工作进程来处理数据库中的信息?@SteffanLong如果这足够的话,是的。尽管如此,随着我的应用程序的增长,轮询工作人员仍无法足够快地轮询数据。我基本上需要能够并行发送网络请求。