PHP cURL требуется только для отправки и не ждать ответа
Мне нужна конфигурация PHP cURL, чтобы мой script мог отправлять запросы и игнорировать ответы, отправленные 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, поэтому мой script работает очень медленно, потому что он ждет каждого запроса.
Любая помощь приветствуется.
Ответы
Ответ 1
Пример файла отправителя. /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
EDIT 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');
Ответ 2
Если возможно, вы можете запустить wget в фоновом режиме (используя exec)
Ответ 3
Немного поздно, но решение этой проблемы для всех, кто интересуется, заключается в том, что для CURLOPT_RETURNTRANSFER
должно быть установлено значение TRUE
, а не false
. Таким образом, функция curl_exec
возвращает значение немедленно, а не ожидает завершения запроса перед возвратом, т.е. она действует асинхронно, а не синхронно.
Пример:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
Ответ 4
Как вы можете определить, удалось ли выполнить запрос? Для этого вам нужно подождать, по крайней мере, кода состояния с сервера. Если задержка возникает, обратитесь к API-интерфейсу curl для параллельного выполнения нескольких запросов. Вы должны иметь возможность установить функцию обратного вызова записи, чтобы прервать прием возвращаемых данных после возврата кода состояния.
Ответ 5
$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