1

php関数を使用して、1000を超えるWebサイトのステータスを返します(つまり、Webサイトがアップまたはダウンしています)。

public function curlCheck($nodes) {

    $results = array();
    $node_count = count($nodes);

    $curl_arr = array();
    $master = curl_multi_init();

    for ($i = 0; $i < $node_count; $i++) {
        $url = $nodes[$i];
        $curl_arr[$i] = curl_init($url);
        curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl_arr[$i], CURLOPT_NOBODY, true);
        curl_setopt($curl_arr[$i], CURLOPT_TIMEOUT, 5);
        curl_multi_add_handle($master, $curl_arr[$i]);
    }

    $running = null;
    do {
        curl_multi_exec($master, $running);
    } while ($running > 0);


    for ($i = 0; $i < $node_count; $i++) {
        $results[$i]['url'] = curl_getinfo($curl_arr[$i], CURLINFO_EFFECTIVE_URL);
        $results[$i]['code'] = curl_getinfo($curl_arr[$i], CURLINFO_HTTP_CODE);
        $results[$i]['time'] = curl_getinfo($curl_arr[$i], CURLINFO_PRETRANSFER_TIME);
    }
    echo 'done';
    return $results;
}

$nodes = array('http://google.com','http://yahoo.com','http://msn.com');   
$result= curlCheck($nodes);
print_r($result);

私が使用している間curl_multi、しかしこのプロセスの時間は長いです。この目的で並列処理を行うにはどうすればよいですか。

4

2 に答える 2

0

https://bugs.php.net/bug.php?id=61141によると:

libcurl バージョン 7.24 以降 (PHP 5.3.10 以降に対応しているようです) を使用する Windows セットアップでは、curl_multi_select() が常に -1 を返し、ドキュメントのサンプル コードがタイムアウトすることがあります。これは明らかに、厳密にはバグではありません。libcurl のドキュメントによると、curl_multi_select が -1 を返す場合、独自のスリープを追加する必要があります。

于 2015-03-09T10:38:34.620 に答える
-1

この解決策を試してください:

set_time_limit(0);xampp または wampp を使用している場合に使用します。実行時間が突然終了する場合があります。

class myclass
{

public $multi_exec_curl_files = array();

//...

public function name()
{

//add urls to list

foreach($array as $id => $value)
$this->multi_exec_curl_files[] = array('link' => $value['link']);

//...

$this->multiCurl($this->multi_exec_curl_files);


...

}

public function multiCurl($res = array(), $options = "") {

        if (count($res) <= 0)
            return False;

        $handles = array();

        if (!$options) // add default options
            $options = self::$options;

        //print_r($options);
        // add curl options to each handle
        foreach ($res as $k => $row) {
            $ch{$k} = curl_init();
            $options[CURLOPT_URL] = $row['link'];
            //echo $row['link'].PHP_EOL;
            curl_setopt_array($ch{$k}, $options);
            $handles[$k] = $ch{$k};
        }
        //die('d');

        $mh = curl_multi_init();

        foreach ($handles as $k => $handle) {
            curl_multi_add_handle($mh, $handle);
        }

        $running_handles = null;
        //execute the handles
        do {
            $status_cme = curl_multi_exec($mh, $running_handles);
        } while ($status_cme == CURLM_CALL_MULTI_PERFORM);
//
        while ($running_handles && $status_cme == CURLM_OK) {
            if (curl_multi_select($mh) != -1) {
                do {
                    $status = curl_multi_exec($mh, $running_handles);
                } while ($status == CURLM_CALL_MULTI_PERFORM);
            }
        }

}

ここから取ります。これは機能します。毎日テストします。必要に応じて機能を追加します。

ガイド:

  1. 大文字と小文字を区別してクラスをインスタンス化する

    $app = 新しい myclass();

  2. メイン関数を実行

    $app->名前();

この関数では、クエリを実行してデータベースからすべての Web サイトの URL を抽出し、変数/プロパティにリンクを保存する必要があります$this->multi_exec_curl_files

$arrayを自分のウェブサイト リストとして使用しました。

  1. すべての Web サイト URL を読み込んだ後、multi curl メソッドを呼び出します。

    $this->multiCurl($this->multi_exec_curl_files);

これは、各 Web サイトの URL に対して実行行 (ハンドル) を開始し、指示どおりに実行します。

この方法を使用して、複数の Web サイトの Web ページを同時にダウンロードします。これを使用して、Web サイトがオンライン (複数の Web サイト) であるかどうかを確認できます。

$handlescurl のリンク集です

$handleURLです

プロセスが開始されると、すべてのハンドルが完了するまで待機します。

于 2013-02-13T09:40:47.217 に答える