나는 클라이언트의 요청에 응답하는 간단한 REST 서비스를 작성 중이다. PHP의 모든 것.응답을 기다리지 않고 POST 요청을 보내시겠습니까?
제 관심은 내 서버가 요청에 응답 할 때 클라이언트 측에서 너무 느려 "ok"응답을 보내면 리소스가 끊길 수 있다는 것입니다.
lib_curl을 통해 POST 요청을 보내면 응답을 기다리지 않고 POST 데이터가 전송 된 후 즉시 종료됩니다.
이것도 가능합니까? 고맙습니다 !
나는 클라이언트의 요청에 응답하는 간단한 REST 서비스를 작성 중이다. PHP의 모든 것.응답을 기다리지 않고 POST 요청을 보내시겠습니까?
제 관심은 내 서버가 요청에 응답 할 때 클라이언트 측에서 너무 느려 "ok"응답을 보내면 리소스가 끊길 수 있다는 것입니다.
lib_curl을 통해 POST 요청을 보내면 응답을 기다리지 않고 POST 데이터가 전송 된 후 즉시 종료됩니다.
이것도 가능합니까? 고맙습니다 !
당신은 단지 HTTP와 답변을받지 않고 데이터를 보낼 수 없습니다. HTTP는 항상 request -> response로 간다. 응답이 매우 짧지 만 (텍스트가없는 간단한 200처럼) 응답이 있어야합니다. 그리고 모든 HTTP 소켓은 그 응답을 기다릴 것입니다.
당신이 응답을 걱정하지 않으면, 당신은 당신의 요청을 만드는 서버 프로세스를 추가 할 수 있습니다, 당신은 단지 푸시 요청 데이터에 그 (백그라운드에서 실행되는 서비스, 체크 등 요청 데이터베이스 및 새 항목이 추가 될 때마다 항상 요청 시작). 그렇게하면 요청을 비동기 적으로 수행하고 스택에 요청을 추가하자마자 종료 할 수 있습니다..
meouw는 말했듯이, 클라이언트는 PHP로하고있는 어떤 의사 소통의 일부가 아닙니다. PHP는 서버 측 언어이므로 클라이언트가 웹 페이지 (PHP 파일)를 요청하면 서버이 해당 파일을 실행하고 PHP 파일이 요청하는 모든 요청을 수행 한 다음 그 결과를 클라이언트에 반환합니다.
나는 이것을 시도한 적이 없지만 CURLOPT_TIMEOUT
을 매우 낮은 값으로 설정하면 트릭을 수행 할 수 있습니다. 0
또는 0.1
을 시도해보십시오.
그러나 연결이 이미 설정된 경우 연결이 적극적으로 취소되고 시간 제한에 도달했는지 여부에 관계없이 cURL과 클라이언트가 어떻게 동작하는지 알 수 없습니다. 너는 밖으로 시험해야 할텐데. PHP 스크립트를 호출하는 경우 ignore_user_abort()
일 경우 스크립트가 어느 쪽이든 실행될 수 있습니다.
컬 (curl) 0 시간 초과로 인해 더 오래 실행됩니다. – Boy
시간 제한을 낮추려면 millisecond 변형을 사용하십시오. curl_setopt ($ curl, CURLOPT_TIMEOUT_MS, 1); –
http://curl.haxx.se/mail/lib-2002-05/0090.html
libcurl에 더 비동기 인터페이스가 없습니다. 스레드를 사용하거나 nonblocking "멀티 인터페이스"( libcurl 제공)를 사용하여 직접 처리 할 수 있습니다. 여기에 멀티 인터페이스에 최대 읽기 : 멀티 인터페이스의
http://curl.haxx.se/libcurl/c/libcurl-multi.html
PHP 예제는 여기에 있습니다 :
http://www.phpied.com/simultaneuos-http-requests-in-php-with-curl/
:
ob_end_clean();
header("Connection: close\r\n");
header("Content-Encoding: none\r\n");
header("Content-Length: 1");
ignore_user_abort(true);
와 컬 : 당신은 당신이 응답을 기다릴 필요가 HTTP 요청을 할 때 다른 사람으로
curl_setopt($curl, CURLOPT_TIMEOUT_MS, 1);
curl_setopt($curl, CURLOPT_NOSIGNAL, 1);
이유에 대한 설명을 제공해 주시겠습니까 –
출력 버퍼 부분을 포함하고있는 몇 가지 솔루션을 찾았지만 그 컬 옵션을 추가하기 전까지는 계속 작동하지 않았습니다. 감사! –
는 말한다.
PHP에서는 exec 함수를 사용하여 요청을 할 수 있습니다.
확인이 링크 : php exec command (or similar) to not wait for result
당신이 정말로 당신이 wget을 명령을 -ing 아마 exec
오프 최고야 응답 걱정하지 마십시오. 이것은 다른 답변의 일부를 전달 언급, 그러나 여기 (1-2ms을 비동기 및 소요)이 방법을 통해 _POST
패키지를 전송하는 아주 쉽게 기능입니다된다
function wget_request($url, $post_array, $check_ssl=true) {
$cmd = "curl -X POST -H 'Content-Type: application/json'";
$cmd.= " -d '" . json_encode($post_array) . "' '" . $url . "'";
if (!$check_ssl){
$cmd.= "' --insecure"; // this can speed things up, though it's not secure
}
$cmd .= " > /dev/null 2>&1 &"; //just dismiss the response
exec($cmd, $output, $exit);
return $exit == 0;
}
크레딧 : 기능에서 적응했다 https://segment.com/blog/how-to-make-async-requests-in-php/
200 OK 응답을 보내는 클라이언트가 아니라 서버입니다. 클라이언트가 요청을하고 서버가 응답합니다. 서버는 클라이언트에서 어떤 일이 일어나는지 신경 쓰지 않습니다 (REST의 정의에 따라 상태 비 저장). 너 뭐하려고하니, 정교 할 수있어? – meouw