我有一个php脚本在我的网站,是为了给一个很好的概述一个域名,用户输入。它做得很好,但速度却很慢。这可能与它正在检查一个由64个可能的域名组成的数组有关,然后继续检查名称服务器的A records/MX记录/NS记录等等。
我想知道的是,可以运行多个线程/子进程吗?这样它就可以同时检查数组的多个单元格,并更快地生成丢失的输出?
我已经将我的代码放在一个pastebin中(所以为了避免在这里创建一个庞大的垃圾邮件) http://pastebin.com/Qq9qKtP9
在perl中,我可以这样做:
$fork = new Parallel::ForkManager($threads);
foreach(Something here){
$fork->start and next;
$fork->finish;
}我可以根据需要让循环在多少个进程中运行。在PHP中是否可能有类似的东西,或者任何其他你能想到的加快速度的方法?主要问题是,cloudflare有一个超时,通常需要足够长的CF来阻止响应的发生。
谢谢
发布于 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。如果没有某种限制机制,最终会有太多的进程导致服务器挂起。
至于处理器,除了前面提到的项之外,您还可以尝试使用佩克尔/吉尔曼作为队列处理器。我没有用过它,但它似乎能做你要找的东西。
优化这一点的另一种方法是实现缓存系统,该系统将结果节省一周(或其他任何时间)。这将减少在一天内重复查找同一站点的人(或在您的站点上运行脚本)。
发布于 2014-07-06 19:19:55
*别管支持!!*
您永远不希望创建线程(或其他进程)来直接响应web请求。
如果指示您的前端在每次单击page.php时创建60个线程,并且有100个人同时出现并请求page.php,您将要求您的硬件同时创建和执行6000个线程,更不用说操作系统服务和其他软件使用的线程了。由于明显的原因,这种情况不会,也永远不会扩大。
相反,您希望将应用程序中需要额外线程或进程的部分分离出来,并通过某种正常的RPC与应用程序的这一部分进行通信。这意味着应用程序的后端可以通过p线程或分叉利用并发,使用固定数量的线程或进程,并尽可能均匀地在所有可用资源之间传播工作。这允许大量流量;它允许您的应用程序进行扩展。
我不会编写示例代码,这看起来太琐碎了。
发布于 2014-07-04 20:38:51
我怀疑用PHP作为apache进程的分叉是个好主意。但是如果您真的想要的话,就会有PCNTL (在apache模块中是不可用的)。
使用丝线你可能会玩得更开心。现在,您甚至可以下载声称是threadsafe的PHP。
最后,您可以使用经典的非阻塞IO,对于PHP来说,我更喜欢它。
https://stackoverflow.com/questions/24579303
复制相似问题