PHP cURL多处理导致服务器之间的随机连接问题


PHP cURL multi handling causing random connection issues between servers?

我有一个网站,跟踪个人玩家的数据为在线游戏。每天在同一时间运行cron,使用cURL从游戏公司的服务器获取每个玩家的数据(每个玩家需要自己的页面来获取)。以前我是循环遍历每个玩家,每次创建自己的cURL请求并存储数据-虽然这是一个缓慢的过程,但几周内一切都运行良好(每天处理500-1,000个玩家)。

当我们获得更多的玩家时,cron开始花费太长时间来运行,所以我在大约一周前使用ParallelCurl (cURL多处理)重写了它。它被设置为每次打开不超过10个连接,并且运行得非常完美——在3-4分钟内完成了大约3000个页面。我从来没有注意到任何问题,直到一两天后我随机无法连接到他们的服务器(返回http代码为0),我以为我被永久禁止/封锁,直到大约1-2小时后我可以突然再次连接。阻塞发生在cron运行当天的几个小时之后——当时唯一发出的请求是偶尔的单个文件请求(这些请求一直工作得很好,几个月来都没有动过)。

过去的几天都是这样的。Cron运行正常,然后过了一段时间(几个小时),我有一两个小时无法连接。今天我更新了cron,一次只打开5个连接-一切都很好,直到5-6小时后,我无法连接2小时。

我已经用谷歌搜索了很多,但似乎找不到任何有用的东西。我猜可能是防火墙阻止了我的连接,但当遇到这种事情时,我真的不知所措。我真的不知道发生了什么,我需要做些什么来解决它。我很感激任何帮助,即使是猜测或正确的方向指指点点。

请注意,我使用的是一个共享的网络主机(HostGator)。2天前,我提交了一个票,并在他们的论坛上发表了一个帖子,我也给公司发了一封电子邮件,但还没有看到任何回复。

——编辑——

下面是我使用parallelcurl运行多个请求的代码。include保持不变,如下所示
set_time_limit(0);
require('path/to/parallelcurl.php');
$plyrs = array();//normally an array of all the players i need to update
function on_request_done($content, $url, $ch, $player) {
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);    
    if ($httpcode !== 200) {
        echo 'Could Not Find '.$player.'<br />';
        return;
    } else {//player was found, store in db
        echo 'Updated '.$player.'<br />';
    }
}
$max_requests = 5;
$curl_options = array(
    CURLOPT_SSL_VERIFYPEER => FALSE,
    CURLOPT_SSL_VERIFYHOST => FALSE,
    CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9',
);
$parallel_curl = new ParallelCurl($max_requests, $curl_options);
foreach ($plyrs as $p) {
    $search_url = "http://website.com/".urlencode($p);
    $parallel_curl->startRequest($search_url, 'on_request_done', $p);
usleep(300);//now that i think about it, does this actually do anything worthwhile positioned here?
}
$parallel_curl->finishAllRequests();

下面是我用来查看是否可以连接的代码

$ch = curl_init();
$options = array(
    CURLOPT_URL            => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER         => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_ENCODING       => "",
    CURLOPT_AUTOREFERER    => true,
    CURLOPT_CONNECTTIMEOUT => 120,
    CURLOPT_TIMEOUT        => 120,
    CURLOPT_MAXREDIRS      => 10,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => false,
);
curl_setopt_array( $ch, $options );
$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
print_r(curl_getinfo($ch));
if ( $httpCode != 200 ){
    echo "Return code is {$httpCode} 'n"
        .curl_error($ch);
} else {
    echo "<pre>".htmlspecialchars($response)."</pre>";
}
curl_close($ch);

当我无法连接时运行该结果如下:

Array ( [url] => http://urlicantgetto.com/ [content_type] => [http_code] => 0 [header_size] => 0 [request_size] => 121 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 30.073574 [namelookup_time] => 0.003384 [connect_time] => 0.025365 [pretransfer_time] => 0.025466 [size_upload] => 0 [size_download] => 0 [speed_download] => 0 [speed_upload] => 0 [download_content_length] => -1 [upload_content_length] => 0 [starttransfer_time] => 30.073523 [redirect_time] => 0 ) Return code is 0 Empty reply from server

这听起来像是网络或防火墙问题,而不是PHP/代码问题。

HostGator阻止你的出站连接,因为你的出站流量可能会被误解为一个小的DOS攻击,或者游戏网站正在阻止你同样的原因。特别是因为这只是在请求数量增加之后才开始的。HTTP状态码0表示防火墙行为

或者,可能在curl请求之后连接没有正确关闭,然后当你试图加载该网站或下载文件时,你不能,因为服务器上已经有太多打开的连接。

如果你有SSH访问到你的服务器,我可能能够帮助调试,如果它是网络连接打开的问题,否则你需要说话HostGator和游戏网站所有者,看看是否有任何一方是阻止你。

另一个解决方案可能是缓慢抓取游戏网站(在请求之间引入等待时间),以避免被标记为高网络流量。