1

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



 }
 ?>
4

3 回答 3

0

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

请求标头和没有正文的各种方法可以减少每笔事务的成本,但杀手是您仍然一次运行查询。curl_multi_ *例程允许您并行运行批次,例如 30 x 批次 10 接近 30 秒。浏览 PHP 文档的用户提供的注释后,可以看到这篇文章解释了如何设置:
Executing multiple curl requests in parallel with PHP 和 curl_multi_exec

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

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

于 2012-06-21T16:15:41.770 回答
0

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

$page = file_get_contents($url, NULL, NULL, 0, 100);
if ($page !== false)
{
    // it exists
}
于 2012-06-20T13:54:30.583 回答
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);
?>

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

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

于 2012-06-20T14:53:44.740 回答