dima_yakimneko
@dima_yakimneko

Как не ждать ответа от curl в php?

PHP скрипт обращается к API почтовых сервисов через curl, время ответа очень долгое, хотя сам ответ и не нужен. Главное отправить данные.

Из за этого сайт работает медленно, работа curl занимает долгое время.

Как не ждать ответа curl?

//Отправка запроса
private function sendRequest($path, $method = "GET", $data = array(), $useToken = true) {
	$url = $this -> apiUrl . "/" . $path;
	$method = strtoupper($method);
	$curl = curl_init();
	if ($useToken && !empty($this -> token)) {
		$headers = array("Authorization: Bearer ".$this -> token);
		curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
	}
	switch ($method) {
		case "POST":
			curl_setopt($curl, CURLOPT_POST, count($data));
			curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
		break;
		case "PUT":
			curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
			curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
		break;
		case "DELETE":
			curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE");
			curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
		break;
		default:
			if (!empty($data)) {
				$url .= "?" . http_build_query($data);
			}
		break;
	}

	curl_setopt($curl, CURLOPT_URL, $url);
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($curl, CURLOPT_HEADER, 1);

	$response = curl_exec($curl);
	$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
	$headerCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
	$responseBody = substr($response, $header_size);
	curl_close($curl);
	if ($headerCode == 401 && $this -> refreshToken == 0) {
		$this -> refreshToken += 1;
		$this -> getToken();
		$return = $this -> sendRequest($path, $method, $data);
	} else {
		$return = new stdClass();
		$return -> data = json_decode($responseBody);
		$return -> http_code = $headerCode;
	}
	return $return;
}
  • Вопрос задан
  • 1612 просмотров
Пригласить эксперта
Ответы на вопрос 3
dimonchik2013
@dimonchik2013
non progredi est regredi
Multicurl тебя спасет

а не жать не получится - это TCP
Ответ написан
Комментировать
webinar
@webinar Куратор тега PHP
Учим yii: https://youtu.be/-WRMlGHLgRg
Ответ написан
Комментировать
ImidgX
@ImidgX
webmaster freelancer (full stack)
Согласен с Dimonchik не ждать не получится, иначе как быть уверенным что запрос достиг получателя.
Если поставить таймаут, запрос может не успеть отправится.

Я пришёл к такому решению, благо там куда я отправляю запрос, под моим же контролем:
на стороне получения запроса в скрипте в начале прописал следующее:
ignore_user_abort(true);
set_time_limit(0);
header("Connection: close", true);
header("Content-Encoding: none" . PHP_EOL);
header("Content-Length: 0", true);
flush(); //ob_flush();
if (session_id())
    session_write_close();
//fastcgi_finish_request();//in case fastcgi

Это позволяет быстро ответить на запрос (всё равно результат ответа не важен в моём случае) и дальше заниматься "своими делами".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы