9

我正在尝试制作一个 PHP 脚本,以尽快检查网站的 HTTP 状态。

我目前正在使用 get_headers() 并在来自 mysql 数据库的 200 个随机 URL 的循环中运行它。

检查所有 200 个 - 平均需要 2m 48s。

我能做些什么来让它(很多)更快?

(我知道 fsockopen - 它可以在 20 年代检查 200 个站点上的端口 80 - 但它与请求 http 状态代码不同,因为服务器可能会在端口上响应 - 但可能无法正确加载网站等)

这是代码..

<?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;
?>
4

2 回答 2

10

您可以尝试 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/

于 2012-04-01T12:07:39.757 回答
4

我不知道这是否是您可以考虑的选项,但是您可以使用 fork 几乎同时运行所有这些,这样脚本将只比一个请求长一点 http://www.php .net/manual/en/function.pcntl-fork.php

例如,您可以将其添加到以 cli 模式运行并同时启动所有请求的脚本中

编辑:您说您要拨打 200 次电话,因此您可能会遇到数据库连接丢失的情况。问题是由于第一个脚本完成时链接被破坏的事实引起的。以避免您可以为每个孩子创建一个新的连接。我看到您使用的是标准 mysql_* 函数,因此请务必传递第四个参数以确保您每次都创建一个新链接。还要检查服务器上的最大同时连接数

于 2012-04-01T12:13:24.027 回答