1

public_htmlディレクトリにファイルが含まれているかどうかを確認するために約295のドメインがあります。現在、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 2 秒で合計 10 分の経過時間が得られます。

ヘッダーを要求し、本文を要求しないなどのさまざまなアプローチは、トランザクションごとのコストを削減できますが、致命的なのは、クエリを一度に 1 つずつ実行していることです。curl_multi_ *ルーチンでできることは、バッチを並行して実行することです。たとえば、10 個のバッチを 30 回実行すると、30 秒近くかかります。PHP ドキュメントのユーザー投稿メモをスキャンすると、これを設定する方法を説明するこの投稿が表示されます:
PHP および curl_multi_exec と並行して複数のカール要求を実行します

もう 1 つのオプション ( php-cliを使用している場合) は、現在のコードと同じように 10 個のバッチ スレッドを開始するだけですが、チェックするサイトの 10 分の 1 の独自のサブリストを使用します。

どちらのアプローチも、特定のリンク容量に制限されるのではなく、主に遅延に制限されるため、時間は同じ要因で大幅に低下するはずです。

于 2012-06-21T16:15:41.770 に答える
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 に答える
0

公開されているファイルの場合は、file_get_contents()それを取得するために使用できます。成功すれば、そこにあることがわかります。失敗した場合は、そうではありません。ファイル全体をダウンロードする必要はありません。高速で帯域幅を無駄にしないように、文字数を少なくするだけです。

$page = file_get_contents($url, NULL, NULL, 0, 100);
if ($page !== false)
{
    // it exists
}
于 2012-06-20T13:54:30.583 に答える