2016-04-04 16 views
2

私は小さなスクリプトを開発していますが、私はいくつかのcurlとwhileループを使って少しうんざりしています。whileループを使ったPHPの複数のカールURL

URLの1つが私に情報を与えている時点で、カールの処理を停止したいと考えています。注:私は複数のカール要求があります。

だから私の考え方は私がからの情報を処理し、取得したURLのカップルを持って、

です。特定のURLに情報が見つかった場合、それは私に文字列を与えます。情報が見つからなければ、それは私に価値を与えません。だから私はおよそ10個のURLを処理しています。すべての場合、URLのいずれかが私に情報を与えているので、残りのURLは価値がないでしょう。 URLの処理が多いので、待ち時間が問題になります。下のサンプルコードで、urlがvalue2.phpで終わって結果が得られたら、直ちに他のURLの処理を停止したいと考えていました。私はすでに結果と他のカールを実行する点がないので、最後に結果を印刷しなければなりません。

また、URLのいずれも結果を生成しない状態があります。誰かがそれを処理する方法を私に示していると、それは素晴らしいものになります。

サンプルコードです。

<?php 
///functions here 
do { 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value1.php?process=$param"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$combined = curl_exec ($ch); 
curl_close ($ch); 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value2.php?process=$param"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$combined = curl_exec ($ch); 
curl_close ($ch); 


$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value3.php?process=$param"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$combined = curl_exec ($ch); 
curl_close ($ch); 


$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value4.php?process=$param"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$combined = curl_exec ($ch); 
curl_close ($ch); 


$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value5.php?process=$param"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$combined = curl_exec ($ch); 
curl_close ($ch); 


$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value6.php?process=$param"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$combined = curl_exec ($ch); 
curl_close ($ch); 


$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value7.php?process=$param"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$combined = curl_exec ($ch); 
curl_close ($ch); 


$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value8.php?process=$param"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$combined = curl_exec ($ch); 
curl_close ($ch); 


$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value9.php?process=$param"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$combined = curl_exec ($ch); 
curl_close ($ch); 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value10.php?process=$param"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$combined = curl_exec ($ch); 
curl_close ($ch); 

} while (strlen($combined) != 0); 
echo $combied; 

///functions here 

?> 
+0

あなたのURLは定数ですか?あなたの結果があなたのために十分になるまで、アドレスの配列を使ってカールする呼び出しを1回だけ呼び出すのはなぜですか? – user15

+0

はい、すべてのURLは一定ですが、それぞれ異なるURLです。 3番目のURLが私に結果を与える場合、どうやって処理を止めることができますか?私はwhileループを処理しなければならず、それを打つ。 –

+0

結果が見つかった後、**を停止する必要がありますか?言い換えれば、彼らは特定の順序で処刑されなければならないし、順序を変更することは何かを混乱させるか、それとも重要ではないか? – Mike

答えて

0

次のことを試してみてください。

<?php 

function callCURL($url) { 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $combined = curl_exec ($ch); 
    curl_close ($ch); 
    return $combined; 
} 


function getResult($urls) { 
    $return = array(); 

    foreach ($urls as $url) { 
     $response = callCURL($url); 
     if (strlen($response) !== 0) { 
      $return[] = $response; 
      break; 
     } 
    } 
    return $return; 
} 

$urls = array("example.com/value1.php?process=$param", "example.com/value2.php?process=$param", "example.com/value3.php?process=$param") 

$result = getResult($urls); 
+0

これは素晴らしい仲間です。他のお勧めのように、この回答をカールマルチで更新できますか? –

+0

私にデモコードを教えてもらえますか? – Rathinam

0

このようなものを使用できます。私はコードをチェックしていない、デバッグ後に動作するはずです。

function callcurl($url) 
{ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL,"example[dot]com/value5.php?process=$param"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $ret = curl_exec ($ch); 
    curl_close ($ch); 
} 

$urls = array('url1', 'url2'); /// etc 
$combined = '' 
$cnt = 0; 
do { 
    $combined = callcurl($urls[$cnt++]); 
} while (strlen($combined) != 0 && $cnt < count($urls)); // 

print $combined; 
0

forループを使用してこれを達成できます。

$fileNames = array(
    '0' => 'valueabc', 
    '1' => 'valuedef', 
    [...] => [...] 
); 
$combined = array(); 
for ($i = 1; $i < 10; $i++) 
{ 
    $ch = curl_init(); 
    $url = "example[dot]com/" . $fileNames[$i] . ".php?process=" . $param; 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $combined[$i] = curl_exec ($ch); 
    curl_close ($ch); 
} 

あなたが$combinedforeachすることができ、すべての回答を参照してください。

foreach ($combined as $value=>$response) 
{ 
    // TODO: Work with the response 
    echo "[" . $value . "]" . $response; 
} 
+0

こんにちはカイル、サンプルコードありがとう。私の場合は、私の質問に投稿されたコードは、実際のページ名を公開しないように編集されています。実際には、URLはexample [dot] com/mypageabc.php?process = $ param、example [dot] com/mypagedef.php?process = $ paramなどのようになります。数値ではない –

+0

ああ、お詫び申し上げます。どのように名前を配列に貼り付け、 '/ value $ i'の中の' $ i'を '$ arrayOfFileNames [$ i]'に置き換えるのですか? - それを更新する。 – KDOT

+0

私はこれを行うためのより多くのOOPメソッドを考えて、おそらくコンストラクタを使用します。しかし、幸運。 – KDOT

1

、あなたの質問にそれを持って、どのように他の回答がそれを持っているように、問題は各要求のためにあなたがそれを送信する必要があることで、応答を待ちます、データを処理して、次にあなたの後続のリクエストを行いますか?これは正常に動作しますが、非常に時間がかかりません。たとえば、各リクエストには10​​0ミリ秒かかります(おそらく非現実的ではないでしょう)。 10件のリクエストでは、1秒の読み込み時間が必要です。代わりに、結果を見つけてすべてのリクエストを送信した後にリクエストを停止しようとすることを忘れることをお勧めします。。これは、PHPのcurl_multi_*関数で実現できます。

// Put all of your URLs in here. I'm just using google for 
// all as an example: 
$urls[] = 'http://www.google.com'; 
$urls[] = 'http://www.google.com'; 
$urls[] = 'http://www.google.com'; 
$urls[] = 'http://www.google.com'; 
$urls[] = 'http://www.google.com'; 
$urls[] = 'http://www.google.com'; 

// Get cURL handles 
foreach ($urls as $key => $url) { 
    $chs[$key] = curl_init(); 

    // Set all your options for each connection here 
    curl_setopt($chs[$key], CURLOPT_URL, $url); 
    curl_setopt($chs[$key], CURLOPT_HEADER, 0); 
} 

//create the multiple cURL handle 
$mh = curl_multi_init(); 

//add the handles 
foreach ($chs as &$ch) { 
    curl_multi_add_handle($mh,$ch); 
} 

$active = null; 
//execute the handles 
do { 
    $mrc = curl_multi_exec($mh, $active); 
} while ($mrc == CURLM_CALL_MULTI_PERFORM); 

while ($active && $mrc == CURLM_OK) { 
    if (curl_multi_select($mh) != -1) { 
     do { 
      $mrc = curl_multi_exec($mh, $active); 
     } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
    } 
} 

foreach ($chs as $url=>&$ch) { 
    $html = curl_multi_getcontent($ch); 

    // [do what you want with the HTML] 

    curl_multi_remove_handle($mh, $ch); // remove the handle (assuming you are done with it); 
} 

curl_multi_close($mh); 
関連する問題