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


Parallel processing/forking in PHP to speed up checking large arrays

我有一个php脚本在我的网站上,旨在给一个很好的概述域名的用户输入。它能很好地完成这项工作,但是速度很慢。这可能与它检查64个可能的域名数组的事实有关,然后继续检查名称服务器的A记录/MX记录/NS记录等。

我想知道的是,是否有可能运行多线程/子进程?这样它就可以一次检查数组的多个元素,并更快地生成输出?

我已经把我的代码的一个例子放在粘贴bin(所以为了避免在这里创建一个巨大的和垃圾邮件的帖子)http://pastebin.com/Qq9qKtP9

在perl中我可以这样做:

  $fork = new Parallel::ForkManager($threads);
  foreach(Something here){
  $fork->start and next;
  $fork->finish;
  }

并且我可以使循环在需要的任意多个进程中运行。在PHP中是否可能有类似的东西,或者你能想到的其他方法来加快这个速度?主要的问题是,cloudflare有一个超时,通常它会花费足够长的时间来阻止响应的发生。

谢谢

*不要介意支持!*

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

如果你的前端被指示在每次有人点击page.php时创建60个线程,并且同时有100个人来请求page.php,那么你将要求你的硬件同时创建和执行6000个线程,更不用说操作系统服务和其他软件使用的线程了。由于显而易见的原因,这不会也永远不会扩展。

相反,您希望分离出需要额外线程或进程的应用程序部分,并通过某种相同的RPC与应用程序的这部分进行通信。这意味着应用程序的后端可以通过pthreads或fork来利用并发性,使用固定数量的线程或进程,并在所有可用资源上尽可能均匀地分布工作。这允许流量的涌入;它允许你的应用扩展。

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

您要做的第一件事是优化代码以尽可能缩短执行时间。例如,与其进行5次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。如果没有某种限制机制,服务器可能会挂起如此多的进程。
至于处理器,除了前面提到的项目之外,您还可以尝试使用pecl/Gearman作为队列处理器。我没有用过,但它似乎可以做你要找的。

另一种优化方法是实现一个缓存系统,它可以将结果保存一周(或更长时间)。这将减少某人在一天内重复查找同一个网站(或在您的网站上运行脚本)

我怀疑用PHP分叉apache进程是不是一个好主意。但是如果你真的想要,有PCNTL(它在apache模块中不可用)。

使用pthread可能会更有趣。现在你甚至可以下载一个声称是线程安全的PHP。

最后你可以使用经典的非阻塞IO,我更喜欢在PHP的情况下。