我有一个网站可以跟踪在线游戏的个人玩家数据。每天同时运行cron,使用cURL从游戏公司的服务器获取每个玩家的数据(每个玩家需要自己的页面来获取)。以前我循环遍历每个玩家并一次创建他们自己的cURL请求并存储数据 - 虽然这是一个缓慢的过程,但一切都运行良好数周(每天从500-1,000名玩家做任何事情)。
当我们获得更多玩家时,cron开始花费太长时间来运行所以我在大约一周前使用ParallelCurl(cURL多处理)重新编写了它。它被设置为一次打开不超过10个连接并且运行良好 - 在3-4分钟内完成大约3,000页。直到一两天后我才发现任何错误,我随机无法连接到他们的服务器(返回http代码为0)。我以为我被永久禁止/封锁直到大约1-2小时后我才能突然再次连接。这个阻塞是在cron运行一天后的几个小时内发生的 - 当时正在发出的唯一请求是偶尔的单个文件请求(这些请求已经正常工作并保持数月不变)。
过去几天都是这样的。 Cron运行正常,然后一段时间(几个小时)我无法连接一两个小时。今天我更新了cron,一次只能打开5个连接 - 一切正常,直到5-6小时后我无法连接2个小时。
我做了大量的谷歌搜索,似乎找不到任何有用的东西。我猜可能防火墙阻止了我的连接,但是当涉及到这样的事情时,我真的很想知道。我对发生的事情一无所知,以及我需要做些什么来解决它。我会感激任何帮助 - 甚至是正确方向的猜测或恰到好处。
请注意,我正在使用共享的网络主机(HostGator)。 2天前我提交了一张票并在他们的论坛上发了帖子,我也发了一封电子邮件给公司,还没有看到任何回复。
- 编辑 -
这是我使用parallelcurl运行多个请求的代码。包含保持不变,与显示here
相同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
答案 0 :(得分:1)
这听起来像是网络或防火墙问题,而不是PHP /代码问题。
HostGator阻止您的出站连接,因为您的出站流量可能被误解为小型DOS攻击,或者游戏网站因同样的原因阻止您。特别是因为这已经开始,因为请求的数量已经增加。还有HTTP status code of 0 suggests firewall behaviour。
或者,也许在curl请求之后连接没有正确关闭,以后当你尝试加载该网站或下载一个你不能的文件时,因为你的服务器已经有太多打开的连接。
如果您有对服务器的SSH访问权限,我可以帮助调试,如果是网络连接打开问题,否则您需要与HostGator和游戏网站所有者联系,看看是否有任何一方阻止您
另一种解决方案可能是缩短游戏网站的速度(在请求之间引入等待时间),以避免被标记为高网络流量。