我试图从网站上抓取大量数据。 (可能大约有50M记录。)网站使用$ _GET,因此只需生成一个链接列表,每个链接都会收集一些数据。
我有一个脚本可以在屏幕上生成链接列表。这些链接都调用相同的PHP脚本,传递不同的搜索值。然后我使用Chrome" LinkClump"扩展以同时启动单独选项卡中的所有链接(右键单击并拖动所有链接)。
我一次启动26个标签但是调用的PHP脚本并非全部启动。写入日志显示只有6个一次运行。在其他人完成之前,下一个将不会开始。有没有办法让一次超过6次运行?
以下是执行搜索的26个工作脚本中的相关代码片段。我只是为每一个传递一个不同的$值:
$html = file_get_html("http://website.com/cgi-bin/Search?search=$value");
foreach($html->find('table[cellpadding="3"]') as $e)
foreach($e->find('tr') as $f){
$colval=0;
foreach($f->find('td[class="output"]') as $g)
要检查是否是限制连接的Apache或simple_html_dom,我编写了另一个小脚本,它只是在前后写入日志时写入睡眠(10)。再次只有6个会立即执行,因此它必须是Apache。
是否有一些ini设置我可以在我的脚本中更改以强制更多立即运行?
我在Simultaneous Requests to PHP Script的另一篇帖子中发现了这条评论:
"如果请求来自同一客户端和同一浏览器,则大多数浏览器会在这种情况下对请求进行排队,即使没有任何服务器端产生此行为。"
我在Chrome上运行。
答案 0 :(得分:1)
浏览器通常会限制到单个域的并发连接数。在达到此限制后打开的每个连续选项卡都必须等到较早的选项卡完成。
绕过此行为的常见技巧是将资源分散到多个子域中。因此,目前您将所有请求发送至website.com
。将代码更改为每个发送六个请求,例如sub1.website.com
,sub2.website.com
等。显然,您需要在DNS和Web服务器上设置这些请求。如果您的PHP脚本存在于每个子域中,您应该能够同时运行更多连接。
答案 1 :(得分:0)
我在这里找到答案:Max parallel http connections in a browser?
这是一个浏览器问题。它表明Firefox允许限制增加,所以我会尝试。
为了他人的利益,您需要做的就是让Firefox与一台主机进行超过6次会话。它与上述帖子略有不同。
1. Enter about:config
2. Accept the warranty warning
3. Find network.http.max-persistent-connections-per-server and change it from 6 to whatever value you need.
现在,您可以从单独的选项卡在该主机上运行更多脚本。
如果这是有用的信息,请向上投票问题。我需要摆脱消极的声誉。