как сделать неблокирующий звонок в php - PullRequest
1 голос
/ 14 января 2012

Я использую php-скрипт для загрузки большого количества файлов.Я использую команду CURL.Удаленный сервер принимает только запросы POST.Но когда я выполняю приведенный ниже скрипт, он обрабатывает первый запрос и ожидает загрузки первого файла.Есть ли способ сделать его неблокирующим и запустить одновременно 2 запроса на загрузку curl. Найдите приведенный ниже пример кода.

<?php
  $arr= array(somefile1.txt,somefile2.txt);
  for ( $i=0;$i<2;$i++) {
     $cmd = "curl  -F name=aaa -F type=yyy  FileName=@/xxxxx/xxxx/$arr[$i] http://someurl.com";
     print "Executing file ";
     shell_exec("nohup  $cmd  2> /dev/null & echo $!" );
     print "=======  done ================";
  }
?>

Ответы [ 3 ]

5 голосов
/ 04 июля 2012

Полагаю, вы можете захотеть curl_multi_init . Вот исходящий пример; он должен быть адаптирован к вашей входящей проблеме. Это кажется чище, чем вы сами разветвляетесь на несколько потоков.

<?php
// create both cURL resources
$ch1 = curl_init();
$ch2 = curl_init();

// set URL and other appropriate options
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

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

//add the two handles
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$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);
    }
}

//close the handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

?>
2 голосов
/ 14 января 2012

Есть хорошая статья о "многопоточности", посмотрите здесь: Многопоточность в PHP с CURL

0 голосов
/ 14 января 2012

Нет, вы не можете запустить одновременно два оператора curl.

Curl создан для такой работы.Оператор Curl заставит более поздние операторы ждать, пока он не завершит свою работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...