Я пытаюсь зациклить некоторые функции в цикле с «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>";
};
Ваша проблема здесь — время каждой итерации 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_multi*
набор функций. Он встроен в библиотеку 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-запросов, что является довольно хорошим пределом. Увеличение этого лимита должно быть сделано с забота, уважение и ответственность это может нанести серьезный вред другим службам.
Чтобы увеличить этот лимит (например, если вы делаете запросы к своим собственным серверам), вы можете использовать curl_multi_setopt
с CURLMOPT_MAXCONNECTS
вариант
$new_limit = 15;
curl_multi_setopt ( $mh, CURLMOPT_MAXCONNECTS, $new_limit );
Также обратите внимание, что вы можете не сделать один запрос быстрее, чем он уже делает, если только с вашим сервером / интернет-соединением что-то не так. Параллелизм не поможет вам ускорить выполнение отдельных запросов (просто подумал, что я проясню это).
Вы также можете использовать потоки, если хотите, но я думаю, что встроенный подход cURL будет самым быстрым, простым и наиболее обслуживаемым, учитывая ваш существующий код
В той же мысли, что и @edhurtig, вы можете взглянуть на нарезания резьбы в PHP. Я думаю, что вы как-то неправильно сформулировали проблему. Вам нужно сделать несколько независимых запросов, и они не должны быть последовательными, что происходит в цикле foreach. Выполнение параллельных вызовов API возможно, открывая новый поток для каждого запроса, таким образом выполняя их параллельно.