【问题标题】:Checking if a website is online using a PHP Script使用 PHP 脚本检查网站是否在线
【发布时间】:2020-08-14 16:33:07
【问题描述】:

我需要创建一个 PHP 脚本,该脚本可以成功检查网站当前是否在线/是否仍处于活动状态。

我有一个大约 3000 个网站的列表要检查,我想设置一个 CRON 作业来每天运行脚本以确保这些网站仍然处于活动状态。

我已经做了一些研究并使用这个例子构建了一些东西:

<?php

       if (isDomainAvailible('http://www.css-tricks.com'))
       {
               echo "Up and running!";
       }
       else
       {
               echo "Woops, nothing found there.";
       }

       //returns true, if domain is availible, false if not
       function isDomainAvailible($domain)
       {
               //check, if a valid url is provided
               if(!filter_var($domain, FILTER_VALIDATE_URL))
               {
                       return false;
               }

               //initialize curl
               $curlInit = curl_init($domain);
               curl_setopt($curlInit,CURLOPT_CONNECTTIMEOUT,10);
               curl_setopt($curlInit,CURLOPT_HEADER,true);
               curl_setopt($curlInit,CURLOPT_NOBODY,true);
               curl_setopt($curlInit,CURLOPT_RETURNTRANSFER,true);

               //get answer
               $response = curl_exec($curlInit);

               curl_close($curlInit);

               if ($response) return true;

               return false;
       }
?>

但它总是在检查 300 次左右后超时,我知道这可能是 PHP 执行问题,我想知道是否有更好或更快的方法来检查这些网站。

【问题讨论】:

  • 它的工作脚本 & 执行单个网站检查需要 5 秒。
  • 是的,这是一个工作脚本,但每个站点 5 秒乘以 3000 多个站点意味着 250 分钟,我认为这不是一个可行的解决方案?
  • 您可以使用multi-curl 功能提高性能。从官方手册中了解如何正确使用它有点难以理解。所以最好使用多卷曲包装器,例如Rolling Curl Mini(插入!)。

标签: php curl cron


【解决方案1】:

如果 allow_url_fopen 指令为 On,您也可以使用 fopen() 等函数:

$handle = fopen("http://www.example.com/", "r");

或stream_context_create():

$opts = array('http' => array(
    'method'=>"GET",
));
$context = stream_context_create($opts);
$fp = fopen('http://www.example.com', 'r', false, $context);
fpassthru($fp);
fclose($fp);

【讨论】:

  • fopen 比 curl() 快吗?
  • 我没有做过这样的测试。我已经展示了可能的替代方案
【解决方案2】:

假设链接存储在数据库中,您可以在db表中添加DATE字段,例如'last_check'和检查后更新日期。

但是每个站点 5 秒乘以 3000 多个站点意味着 250 分钟,我认为这不是一个可行的解决方案吗? – SNpn

您的 SQL 查询应选择“last_check”,其中“last_check”不等于当前日期。每个查询限制为 10 个结果。

将您的 cron 设置为每分钟运行一次 php 脚本,从午夜到早上 6 点。

* 0-6 * * * *   PATH/TO/YOUR/PHP/SCRIPT

【讨论】:

  • 他根本没有将它用作 cron ;) 或许可以详细说明一下
  • @Robert 他想设置一个 cron 作业,它在帖子中说,我写了一个解决方案。
  • 您能解释一下这样做的好处吗?我将在数据库上创建一个较小的查询,但我仍然需要多次运行脚本来检查超过 3000 个。作为网站,可以每天离线,我仍然需要每天重新检查超过 3000 个条目?
  • 也许您的 curl 脚本会获取整个远程站点。而且速度很慢。据我了解,您需要一个简单的 php ping 函数,如果远程位置在那里,它将返回 OK,就像这里的描述 thecave.info/php-ping-script-to-check-remote-server-or-website 。解释我的答案:这是原始的“队列/工作者”php 系统。您的 Cron 运行 php 脚本,该脚本在需要一定时间的后台作业中运行,在您的情况下,每个远程站点需要 5 秒。
猜你喜欢
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
相关资源
最近更新 更多