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

时间:2012-06-20 13:51:22

标签: php performance ftp

我有大约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>";
            }
        }
    }



 }
 ?>

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

使用卷曲。选项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”,则文件/资源​​存在。

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

答案 2 :(得分:0)

M,这实际上只是对AlexeyKa答案的解释。你的扫描谈话10分钟的原因是你正在序列化大约300个网络交易,每个交易平均花费大约2秒,300 x 2s给你总共10分钟的经过时间。

请求标题和没有正文的各种方法可以削减每笔交易的成本,但杀手就是您仍然一次运行一个查询。 curl_multi _ * 例程允许您执行的操作是并行运行批处理,例如30个批次的10个批次接近30秒。扫描PHP文档的用户提供的注释给出了这篇文章,解释了如何设置它:
Executing multiple curl requests in parallel with PHP and curl_multi_exec

另一个选项(如果你使用的是 php-cli )只是简单地开始,比如十个批处理线程,每个线程作为你当前的代码,但有自己的十分之一的子列表要检查的网站。

由于任何一种方法都主要是延迟限制而非特定的链路容量限制,因此时间应该大部分落在同一因素上。