首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP中的并行处理/分叉以加快检查大数组的速度

PHP中的并行处理/分叉以加快检查大数组的速度
EN

Stack Overflow用户
提问于 2014-07-04 18:23:19
回答 3查看 632关注 0票数 2

我有一个php脚本在我的网站,是为了给一个很好的概述一个域名,用户输入。它做得很好,但速度却很慢。这可能与它正在检查一个由64个可能的域名组成的数组有关,然后继续检查名称服务器的A records/MX记录/NS记录等等。

我想知道的是,可以运行多个线程/子进程吗?这样它就可以同时检查数组的多个单元格,并更快地生成丢失的输出?

我已经将我的代码放在一个pastebin中(所以为了避免在这里创建一个庞大的垃圾邮件) http://pastebin.com/Qq9qKtP9

在perl中,我可以这样做:

代码语言:javascript
复制
  $fork = new Parallel::ForkManager($threads);
  foreach(Something here){
  $fork->start and next;
  $fork->finish;
  }

我可以根据需要让循环在多少个进程中运行。在PHP中是否可能有类似的东西,或者任何其他你能想到的加快速度的方法?主要问题是,cloudflare有一个超时,通常需要足够长的CF来阻止响应的发生。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-04 23:26:10

您要做的第一件事是优化代码,以尽可能缩短执行时间。例如,与其进行五个dns查询:$NS = dns_get_record($murl, DNS_NS); $MX = dns_get_record($murl,DNS_MX); $SRV = dns_get_record($murl,DNS_SRV); $A = dns_get_record($murl,DNS_A); $TXT = dns_get_record($murl,DNS_TXT);

您只能调用dns_get_record一次:$DATA = dns_get_record($murl, DNS_NS + DNS_MX + DNS_SRV + DNS_A + DNS_TXT);并从其中解析变量。

与直接分叉进程同时处理几个部分不同,我实现了一个队列,所有请求都将被推入其中。查询处理器将限制它可以同时处理多少项,如果同时有数百或数千个请求到达您的站点,就避免了潜在的DoS。如果没有某种限制机制,最终会有太多的进程导致服务器挂起。

至于处理器,除了前面提到的项之外,您还可以尝试使用佩克尔/吉尔曼作为队列处理器。我没有用过它,但它似乎能做你要找的东西。

优化这一点的另一种方法是实现缓存系统,该系统将结果节省一周(或其他任何时间)。这将减少在一天内重复查找同一站点的人(或在您的站点上运行脚本)。

票数 1
EN

Stack Overflow用户

发布于 2014-07-06 19:19:55

*别管支持!!*

您永远不希望创建线程(或其他进程)来直接响应web请求。

如果指示您的前端在每次单击page.php时创建60个线程,并且有100个人同时出现并请求page.php,您将要求您的硬件同时创建和执行6000个线程,更不用说操作系统服务和其他软件使用的线程了。由于明显的原因,这种情况不会,也永远不会扩大。

相反,您希望将应用程序中需要额外线程或进程的部分分离出来,并通过某种正常的RPC与应用程序的这一部分进行通信。这意味着应用程序的后端可以通过p线程或分叉利用并发,使用固定数量的线程或进程,并尽可能均匀地在所有可用资源之间传播工作。这允许大量流量;它允许您的应用程序进行扩展。

我不会编写示例代码,这看起来太琐碎了。

票数 3
EN

Stack Overflow用户

发布于 2014-07-04 20:38:51

我怀疑用PHP作为apache进程的分叉是个好主意。但是如果您真的想要的话,就会有PCNTL (在apache模块中是不可用的)。

使用丝线你可能会玩得更开心。现在,您甚至可以下载声称是threadsafe的PHP。

最后,您可以使用经典的非阻塞IO,对于PHP来说,我更喜欢它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24579303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档