比get_headers()更快的东西

时间:2012-04-01 12:03:17

标签: php mysql http-status-codes fsockopen get-headers

我正在尝试制作一个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;
?>

2 个答案:

答案 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个参数,以确保每次都创建一个新的链接。还要检查服务器上的最大并发连接数