PHP cURL требуется только для отправки, а не ждать ответа - PullRequest
18 голосов
/ 06 ноября 2011

Мне нужна конфигурация PHP cURL, чтобы мой скрипт мог отправлять запросы и игнорировать ответы, отправленные API.

curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
//curl_setopt($ch, CURLOPT_TIMEOUT_MS, 100);
$result = curl_exec($ch);
echo $result;
curl_close ($ch);

Я попытался добавить: // curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, false);// curl_setopt ($ ch, CURLOPT_TIMEOUT_MS, 100);

Но он не работает должным образом и веб-сервер API не получает запросы.

Причина в том, что я отправляю большое количествозапросы к API, поэтому мой скрипт очень медленный, потому что он ожидает каждого запроса.

Любая помощь приветствуется.

Ответы [ 5 ]

11 голосов
/ 05 июня 2012

Пример файла отправителя ./ajax/sender.php

Ниже мы пытаемся сделать скрипт ping to php, не дожидаясь ответа

    $url = 'https://127.0.0.1/ajax/received.php';
    $curl = curl_init();                
    $post['test'] = 'examples daata'; // our data todo in received
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt ($curl, CURLOPT_POST, TRUE);
    curl_setopt ($curl, CURLOPT_POSTFIELDS, $post); 

    curl_setopt($curl, CURLOPT_USERAGENT, 'api');

    curl_setopt($curl, CURLOPT_TIMEOUT, 1); 
    curl_setopt($curl, CURLOPT_HEADER, 0);
    curl_setopt($curl,  CURLOPT_RETURNTRANSFER, false);
    curl_setopt($curl, CURLOPT_FORBID_REUSE, true);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 1);
    curl_setopt($curl, CURLOPT_DNS_CACHE_TIMEOUT, 10); 

    curl_setopt($curl, CURLOPT_FRESH_CONNECT, true);

    curl_exec($curl);   

    curl_close($curl);  

Пример полученного файла ./ajax/received.php

РЕДАКТИРОВАТЬ 2019, если вы используете fastcgi, просто завершите fastcgi и закройте соединение с браузером, но скрипт все равно будет работать до конца.

fastcgi_finish_request(); $this->db->query('UPDATE new_hook_memory SET new=new+1 WHERE id=1');

Старая версия:

ob_end_clean(); //if our framework have turn on ob_start() we don't need bufering respond up to this script will be finish 
    header("Connection: close\r\n"); //send information to curl is close
    header("Content-Encoding: none\r\n"); //extra information 
    header("Content-Length: 1"); //extra information
    ignore_user_abort(true); //script will be exisits up to finish below query even web browser will be close before sender get respond

    //we doing here what we would like do
    $this->db->query('UPDATE new_hook_memory SET new=new+1 WHERE id=1');    
4 голосов
/ 09 ноября 2011

Если возможно, вы можете запустить wget в фоновом режиме (используя exec )

2 голосов
/ 28 января 2013

Немного поздно, но решение этой проблемы для всех, кто интересуется, заключается в том, что CURLOPT_RETURNTRANSFER необходимо установить на TRUE, а не false. Таким образом, функция curl_exec возвращает значение немедленно, а не ожидает завершения запроса перед возвратом - то есть она действует асинхронно, а не синхронно.

Пример:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
0 голосов
/ 21 сентября 2018
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1);
curl_exec($ch);
curl_close($ch);

Это хорошо работает для меня.
Протестировано на PHP 7.1.14 для Windows

0 голосов
/ 09 ноября 2011

Как узнать, был ли запрос успешным или нет? Вам нужно подождать хотя бы код состояния с сервера, чтобы определить это. Если проблема заключается в задержке, посмотрите на API curl multi для параллельного выполнения нескольких запросов. Вы должны быть в состоянии установить функцию обратного вызова записи, чтобы прервать прием возвращенных данных после возвращения кода состояния.

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