比 PHP FTP 函数更快的方法来检查文件是否在公共 html 目录中


Faster methods than PHP FTP functions for checking if files are in public html directory

我有大约 295 个域来检查它们是否包含public_html目录中的文件。目前我正在使用 PHP FTP 函数,但脚本大约需要 10 分钟才能完成。我正在尝试缩短这段时间,我可以使用什么方法来实现这一目标。

这是我的PHP代码

  <?php
  foreach($ftpdata as $val) {
    if (empty($val['ftp_url'])) {
        echo "<p>There is no URL provided</p>";
    }
    if (empty($val['ftp_username']))    {
        echo "<p>The site ".$val['ftp_url']." dosent have a username</p>";
    }
    if (empty($val['ftp_password']))    {
        echo "<p>The site ".$val['ftp_url']." dosent have a password</p>";
    }

    if($val['ftp_url'] != NULL && $val['ftp_password'] != NULL && $val['ftp_username'] != NULL) {
        $conn_id = @ftp_connect("ftp.".$val['ftp_url']);
        if($conn_id == false)   {
            echo "<p></br></br><span>".$val['ftp_url']." isnt live</span></p>";
        }
        else    {
            $login_result = ftp_login($conn_id, $val['ftp_username'], $val['ftp_password']);
            ftp_chdir($conn_id, "public_html");
            $contents = ftp_nlist($conn_id, ".");
            if (count($contents) > 3)   {
                echo "<p><span class='green'>".$val['ftp_url']." is live</span><p>";
            }
            else {
                echo "<p></br></br><span>".$val['ftp_url']." isnt live</span></p>";
            }
        }
    }

 }
 ?>

如果它是一个公开可用的文件,您可以使用file_get_contents()来尝试抓取它。如果它成功了,你就知道它就在那里。如果失败,则不是。您无需下载整个文件。只需将其限制为少量字符,这样它就很快并且不会浪费带宽。

$page = file_get_contents($url, NULL, NULL, 0, 100);
if ($page !== false)
{
    // it exists
}

使用 curl。将选项CURLOPT_NOBODY设置为 true 请求方法设置为 HEAD 并且不传输正文。

<?php
// create a new cURL resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://google.com/images/srpr/logo3w.png"); //for example google logo
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, true);
//get content
$content = curl_exec($ch);
// close
curl_close($ch);
//work with result
var_dump($content);
?>

在输出中,如果设置了"HTTP/1.1 200 OK",则文件/资源存在。

尝试使用curl_multi_*。它非常快。

M,这实际上只是对阿列克谢卡答案的解释。 扫描 10 分钟的原因是您正在序列化大约 300 个网络事务,每个事务平均大约需要 2 秒,而 300 x 2s 为您提供了总共 10 分钟的运行时间。

各种方法(例如请求标头和 no body)可以削减每个事务的成本,但杀手锏是您仍然一次运行一个查询。 curl_multi_* 例程允许您并行运行批处理,例如 30 x 批次,每批 10 个,接近 30 秒。 浏览PHP文档的用户贡献的注释给出了这篇文章,其中解释了如何设置它:
与 PHP 和 curl_multi_exec 并行执行多个 curl 请求。

另一种选择(如果您使用的是php-cli)只是启动十个批处理线程,每个线程与您当前的代码一样,但有自己的子列表,其中包含要检查的十分之一站点。

由于这两种方法在很大程度上都受延迟限制,而不是受特定链路容量限制,因此时间应该在很大程度上下降相同的因素。