比get_headers()更快的东西

9
我正在制作一个PHP脚本,尽可能快地检查网站的HTTP状态。
我目前正在使用get_headers()函数,并在从mysql数据库中随机选择的200个URL的循环中运行它。
为了检查所有200个URL,平均需要2分48秒。
有什么方法可以使速度(更)快吗?
(我知道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;
?>
2个回答

11

1
嗨,我也尝试过使用cURL - 就像你发布的代码一样。但是它和get_headers()一样长,实际上有点更长。 - Clarkey
1
尝试按照我提供的链接进行多请求。例如每次10个请求。 - safarov
+1 很棒!我不知道curl扩展可以并行处理请求。 - user1191247
并行执行?那么这是否有效地意味着另一个线程同时运行? - Clarkey
4
使用multi-curl可以一次性处理200个请求。它所需的时间将等同于最慢的服务器响应时间。如果其中一个请求需要60秒,那么整个请求将需要60秒。但是您可以在curl中设置超时时间。 - Brent Baisley
显示剩余4条评论

4

我不知道你是否考虑过这种方法,但是可以使用fork函数使所有请求同时进行,这样脚本只需要比一个请求多一点时间

http://www.php.net/manual/en/function.pcntl-fork.php

你可以将此代码添加到以cli模式运行的脚本中,并同时启动所有请求

编辑:你说你有200个调用要进行,可能会遇到的问题是数据库连接丢失。这个问题是由于当第一个脚本完成时链接被销毁所引起的。为了避免这个问题,你可以为每个子进程创建一个新的连接。我看到你正在使用标准的mysql_*函数,所以请确保传递第四个参数以确保每次都创建新的连接。另外,请检查服务器上的最大同时连接数。


这就是我想要的 - 我会看看你发的链接,谢谢。 - Clarkey
@MattClarke 好的,我很高兴你觉得它有用... 如果你在子进程中获取结果并且需要ping网站,则需要在迭代中运行fork,如果你在父进程中则需要继续。 - mishu
我不明白你在说什么——这个 fork 的概念对我来说完全是新的,我甚至不知道它是可能存在的。 - Clarkey
@MattClarke,它更新了答案,讨论了在使用fork时常见的问题。第一次看起来可能有点复杂是正常的。如果你决定要使用这个选项(为了学习这些系统),你会在php手册页面上找到很好的资源(答案中的链接)。在那个页面的评论中可以找到很多好的想法。 - mishu
谢谢 - 我会点赞你的,但是我的声望值不够! - Clarkey
没问题,如果能在某种程度上帮助到你,我很高兴。 - mishu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接