我正在尝试制作一个PHP脚本,以尽快检查网站的HTTP状态。
我目前正在使用get_headers()并在来自mysql数据库的200个随机网址的循环中运行它。
要检查所有200个 - 平均需要2个48秒。
我能做些什么才能让它(更快)更快?
(我知道fsockopen - 它可以在20s内检查200个站点上的端口80 - 但它与请求http状态代码不同,因为服务器可能在端口上响应 - 但可能没有正确加载网站等)< / p>
这是代码..
<?php
function get_httpcode($url) {
$headers = get_headers($url, 0);
// Return http status code
return substr($headers[0], 9, 3);
}
###
## Grab task and execute it
###
// Loop through task
while($data = mysql_fetch_assoc($sql)):
$result = get_httpcode('http://'.$data['url']);
echo $data['url'].' = '.$result.'<br/>';
endwhile;
?>
答案 0 :(得分:8)
您可以尝试使用CURL库。您可以使用CURL_MULTI_EXEC
同时并行发送多个请求示例:
$ch = curl_init('http_url');
curl_setopt($ch, CURLOPT_HEADER, 1);
$c = curl_exec($ch);
$info = curl_getinfo($ch, CURLINFO_HTTP_CODE);
print_r($info);
<强>已更新强>
看这个例子。 http://www.codediesel.com/php/parallel-curl-execution/
答案 1 :(得分:3)
我不知道这是否是您可以考虑的选项,但您可以使用fork几乎同时运行所有这些选项,这样脚本只需要比一个请求更长的时间 http://www.php.net/manual/en/function.pcntl-fork.php
您可以在以cli模式运行的脚本中添加此项并同时启动所有请求,例如
编辑:你说你有200次调用,所以你可能遇到的一件事是数据库连接丢失。问题是由第一个脚本完成时链接被销毁的事实引起的。为了避免你可以为每个孩子创建一个新的连接。我看到你正在使用标准的mysql_ *函数,所以一定要传递第4个参数,以确保每次都创建一个新的链接。还要检查服务器上的最大并发连接数