2016-04-22 24 views
0

"foreach"と配列でループ内のいくつかの関数をループしようとしています。情報を得るには非常に時間がかかります。すべての配列ループ要素を同時に実行することは可能ですか?PHP - foreachループですべての配列を即座に実行できますか?

ini_set("max_execution_time", 0); 
function bhttpGet($burl) 
{ 
    global $data; 
    global $makaronas; 
    global $makaronas2; 
    $data = array("clientType" => "Android", "os" => "21", "screenType" => "xxhdpi", "version" => "3");                  
    $data_string = json_encode($data); 
    $bch = curl_init(); 

    curl_setopt($bch,CURLOPT_URL,$burl); 
    curl_setopt($bch,CURLOPT_RETURNTRANSFER,true); 
    curl_setopt($bch,CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($bch,CURLOPT_HEADER, false); 
    curl_setopt($bch, CURLOPT_POSTFIELDS, $data_string); 
    curl_setopt($bch, CURLOPT_HEADER, 1); 
    curl_setopt($bch, CURLOPT_RETURNTRANSFER, 1); 

    curl_setopt($bch, CURLOPT_HTTPHEADER, array(
    'Accept-Language: en', 
    'Content-Type: application/json; charset=UTF-8', 
    'User-Agent: Dalvik/2.1.0 (Linux; U; Android 5.0.2; HTC One Build/LRX22G)', 
    'Host: mobileapi.turkishairlines.com', 
    'Connection: Keep-Alive', 
    'Accept-Encoding: gzip', 
    'Cookie: JSESSIONID=5096E068E5B2E11E4EC96A6B725C5BB1; AWSELB=A3F31BC902ED4282BBCBA2D31E20E7210081D104D0AC59E7291F2B1692E6E27BB90F1D78BBC7CFBAD0D14DA4FFA5A59F223573F1C428362BCD544E72A28094F07742E08B3292F74F8BE17859D515D4392E4D9C052C' 
    )); 

    $result = curl_exec($bch); 
    curl_close($bch); 
    preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches); 
    $cookies = array(); 
    foreach($matches[1] as $item) { 
     parse_str($item, $cookie); 
     $cookies = array_merge($cookies, $cookie); 
    } 
    $makaronas = $cookies['JSESSIONID']; 
    $makaronas2 = $cookies['AWSELB']; 
} 

function httpGet($url){ 
    global $makaronas3; 
    global $makaronas4; 
    $ch = curl_init(); 

    curl_setopt($ch,CURLOPT_URL,$url); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); 
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Accept-Language: en', 
    'User-Agent: Dalvik/2.1.0 (Linux; U; Android 5.0.2; HTC One Build/LRX22G)', 
    'Host: mobileapi.turkishairlines.com', 
    'Connection: Keep-Alive', 
    'Accept-Encoding: gzip', 
    "Cookie: JSESSIONID={$makaronas3}; AWSELB={$makaronas4}" 

    )); 
    $output2=curl_exec($ch); 
    curl_close($ch); 
} 

function chttpGet($kurl){ 
    global $makaronas3; 
    global $makaronas4; 
    global $output3; 
    $kch = curl_init(); 

    curl_setopt($kch,CURLOPT_URL,$kurl); 
    curl_setopt($kch,CURLOPT_RETURNTRANSFER,true); 
    curl_setopt($kch,CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($kch, CURLOPT_HTTPHEADER, array(
    'Accept-Language: en', 
    'User-Agent: Dalvik/2.1.0 (Linux; U; Android 5.0.2; HTC One Build/LRX22G)', 
    'Host: mobileapi.turkishairlines.com', 
    'Connection: Keep-Alive', 
    'Accept-Encoding: gzip', 
    "Cookie: JSESSIONID={$makaronas3}; AWSELB={$makaronas4}" 
    )); 

    $output3=curl_exec($kch); 
    curl_close($kch); 
} 

function between($src,$start,$end){ 
    $txt=explode($start,$src); 
    $txt2=explode($end,$txt[1]); 
    return trim($txt2[0]); 
    } 
$departuredatearray= array("01.08.2016","02.08.2016","03.08.2016","04.08.2016","05.08.2016","06.08.2016","07.08.2016","08.08.2016","09.08.2016","10.08.2016","11.08.2016","12.08.2016","13.08.2016","14.08.2016","15.08.2016","16.08.2016","17.08.2016","18.08.2016","19.08.2016","20.08.2016","21.08.2016","22.08.2016","23.08.2016","24.08.2016","25.08.2016","26.08.2016","27.08.2016","28.08.2016","29.08.2016","30.08.2016","31.08.2016"); 

    foreach ($departuredatearray as $lopas) { 
    $initialize="https://mobileapi.turkishairlines.com/init.json"; 
    $initialize2 = "https://mobileapi.turkishairlines.com/booking/internationalFlights.json?cabinType=economy&adultCount=1&childCount=0&infantCount=0&isOneWay=true&departureAirportCode=VNO&arrivalAirportCode=IST&flightDate={$lopas}&isReturn=false"; 
    $initialize3 = "https://mobileapi.turkishairlines.com/booking/internationalFare.json?departureFlightIndex=0&returnFlightIndex=-1&isDeparturePromotion=false&isReturnPromotion=false"; 
$mano=bhttpget($initialize); 
echo "$mano"; 
$makaronas3=$makaronas; 
$makaronas4=$makaronas2; 
$mano2=httpget($initialize2); 

echo "$mano2"; 
$mano4 = chttpget($initialize3); 

echo "$mano4"; 
echo "<BR>"; 
echo "<table border='1' align='center' style='text-align:center;'>"; 
    echo "<tr>"; 
     echo "<td>flight Number</td>"; 
     echo "<td>departure Airport Code</td>"; 
     echo "<td>arrival Airport Code</td>"; 
     echo "<td>departure Date</td>"; 
     echo "<td>departure Time</td>"; 
     echo "<td>arrival Date</td>"; 
     echo "<td>arrival Time</td>"; 
     echo "<td>duration</td>"; 
     echo "<td>total Price</td>"; 
     echo "<td>Curency</td>"; 
    echo "</tr>"; 
    echo "<tr>"; 
     echo "<td>"; 
     echo between($output3, '"flightNumber":"', '","departureAirportCode'); 
     echo "</td>"; 
     echo "<td>"; 
     echo between($output3, 'departureAirportCode":"', '","departureAirportName'); 
     echo "</td>"; 
     echo "<td>"; 
     echo between($output3, 'arrivalAirportCode":"', '","arrivalAirportName'); 
      echo "</td>";   
      echo "<td>"; 
      echo between($output3, 'departureDate":"', '","formattedDepartureDate'); 
      echo "</td>"; 
      echo "<td>"; 
      echo between($output3, 'departureTime":"', '","arrivalDate'); 
      echo "</td>"; 
      echo "<td>"; 
      echo between($output3, 'arrivalDate":"', '","formattedArrivalDate'); 
      echo "</td>"; 
      echo "<td>"; 
      echo between($output3, 'arrivalTime":"', '","duration'); 
      echo "</td>"; 
      echo "<td>"; 
      echo between($output3, 'duration":"', '","stopTimeAfterArrival'); 
      echo "</td>"; 
      echo "<td>"; 
      echo between($output3, 'totalPrice":"', '","currency":"'); 
      echo "</td>"; 
      echo "<td>"; 
      echo between($output3, 'currency":"', '","totalTax'); 
      echo "</td>"; 

echo "</table>"; 
}; 
+9

あなたのコードと配列を表示します。 – RJParikh

+1

コードを追加した後、私たちはあなたを助けることができます。 –

+1

あなたのコードを投稿してください –

答えて

2

あなたの問題は、ここではforeachの各反復は、HTTPリクエストでブロック費やしている時間です。これはAPIレイテンシの問題であり、通常はHTTPリクエストの部分を同時に処理することで処理されます。

各HTTPリクエストが完了するまでに3秒かかり、そしてあなたは、同時に10のHTTP要求を処理できる場合たとえば、あなたはあなたのスクリプトを作ってきたおおよそ 10倍速く

100 Requests w/o concurrency (3 seconds each, 1 at a time) = 300 seconds 
100 Requests w/ concurrency (3 seconds each, 10 at a time) = 30 seconds 

かなりがありますHTTPを並列化する優れた方法は、一連の機能を要求します。これはcURLライブラリに組み込まれており、使用するのはかなり簡単です。

チュートリアル:http://www.phpied.com/simultaneuos-http-requests-in-php-with-curl/

PHPマニュアル:http://php.net/manual/en/function.curl-multi-exec.php

あなたが、同時に実行する必要がありますすることができHTTPリクエストの数に実際の制限があることに注意することが重要です。 curl_multi*はデフォルトで10個の同時HTTPリクエストがありますが、これはかなり良い制限です。この制限を増やすには、のケア、尊重、責任をお持ちでなければなりません。他のサービスに重大な損害を与える可能性があります。あなたは

$new_limit = 15; 
curl_multi_setopt ($mh, CURLMOPT_MAXCONNECTS, $new_limit); 

はまた、あなたが単一の要求はいずれも行くことはありませことに注意してCURLMOPT_MAXCONNECTSオプションでcurl_multi_setoptを使用することができます(あなたがあなた自身のサーバーに対してリクエストを行っている場合など)は、この制限値を増加さ

サーバー/インターネット接続に何か問題がないかぎり、すでに実行しているよりも高速です。並行処理は、個々のリクエストをより速く進めるのに役立ちません(ちょっと考えてみてください)。

あなたが好きな場合にも、スレッドを使用することができますが、私は組み込みcURLのアプローチが最速になるだろうと思いますが、最も簡単な、と始めた@edhurtig思考の同じラインで既存のコード

+0

これは良い提案ですが、あなたはforeachのすべてのケースを同時に実行することはできないとOPが理解していることを願っていますが、 "無料食事のようなものはありません" –

+0

絶対に正しく! – edhurtig

+0

このスクリプトをもっと速く動かす方法はありますか? – user3237444

0

与えられた最も保守性PHPでthreadingを見てみるとよいでしょう。あなたは何とか問題を間違って述べたと思います。いくつかの独立した要求を行う必要があり、foreachループ内で発生するシリアル化する必要はありません。パラレルAPI呼び出しを行うには、リクエストごとに新しいスレッドを開いてパラレルに実行します。

+0

はい、あなたは私を正しく理解していると思います。しかし、私はプログラミングで新しいです、多分あなたはどの例を投稿することができますか? – user3237444

+1

@ user3237444私はあなたを過小評価しようとしていないか、何らかの形でプログラミングを学ぶ意志があります。あなたは複雑なものを試しているのが好きです。しかし、これらのコンセプトは複雑なものであり、より簡単なものから始めることをお勧めします。私があなたに与えたリンクの例題とスレッド化のドキュメントはすべてあり、PHPのドキュメントはとても良いです。それでも、私は、マルチスレッドのようなものを始める前に、 '制御構造 'のような言語の基本を理解することをお勧めします。 –

関連する問題