2010-02-03 7 views
20

나는 클라이언트의 요청에 응답하는 간단한 REST 서비스를 작성 중이다. PHP의 모든 것.응답을 기다리지 않고 POST 요청을 보내시겠습니까?

제 관심은 내 서버가 요청에 응답 할 때 클라이언트 측에서 너무 느려 "ok"응답을 보내면 리소스가 끊길 수 있다는 것입니다.

lib_curl을 통해 POST 요청을 보내면 응답을 기다리지 않고 POST 데이터가 전송 된 후 즉시 종료됩니다.

이것도 가능합니까? 고맙습니다 !

+1

200 OK 응답을 보내는 클라이언트가 아니라 서버입니다. 클라이언트가 요청을하고 서버가 응답합니다. 서버는 클라이언트에서 어떤 일이 일어나는지 신경 쓰지 않습니다 (REST의 정의에 따라 상태 비 저장). 너 뭐하려고하니, 정교 할 수있어? – meouw

답변

13

당신은 단지 HTTP와 답변을받지 않고 데이터를 보낼 수 없습니다. HTTP는 항상 request -> response로 간다. 응답이 매우 짧지 만 (텍스트가없는 간단한 200처럼) 응답이 있어야합니다. 그리고 모든 HTTP 소켓은 그 응답을 기다릴 것입니다.

당신이 응답을 걱정하지 않으면, 당신은 당신의 요청을 만드는 서버 프로세스를 추가 할 수 있습니다, 당신은 단지 푸시 요청 데이터에 그 (백그라운드에서 실행되는 서비스, 체크 등 요청 데이터베이스 및 새 항목이 추가 될 때마다 항상 요청 시작). 그렇게하면 요청을 비동기 적으로 수행하고 스택에 요청을 추가하자마자 종료 할 수 있습니다..

meouw는 말했듯이, 클라이언트는 PHP로하고있는 어떤 의사 소통의 일부가 아닙니다. PHP는 서버 측 언어이므로 클라이언트가 웹 페이지 (PHP 파일)를 요청하면 서버이 해당 파일을 실행하고 PHP 파일이 요청하는 모든 요청을 수행 한 다음 그 결과를 클라이언트에 반환합니다.

+0

그게 내가 알아야 할 필요가있어. 감사합니다. – Gotys

+0

@Gotys sidenote, 응답을 기다리지 않고 "요청"을 보내려는 경우, UDP 프로토콜 – chris

+0

을 살펴보십시오. "패턴"이 없습니다. asyc 요청은 요청을 실행합니다. 일단 처형되면 기다리지 않고 다른 일을 할 수 있습니다. 신뢰할 수있는 네트워크 연결이있는 시나리오에서 UDP는 옵션이지만 TCP가 패킷을 신뢰할 수 있다는 점에서 더 안정적입니다. 그러나 응답을 확인하지 않고 어떤 일이 발생했는지 알 수 없습니다. –

1

나는 이것을 시도한 적이 없지만 CURLOPT_TIMEOUT을 매우 낮은 값으로 설정하면 트릭을 수행 할 수 있습니다. 0 또는 0.1을 시도해보십시오.

그러나 연결이 이미 설정된 경우 연결이 적극적으로 취소되고 시간 제한에 도달했는지 여부에 관계없이 cURL과 클라이언트가 어떻게 동작하는지 알 수 없습니다. 너는 밖으로 시험해야 할텐데. PHP 스크립트를 호출하는 경우 ignore_user_abort() 일 경우 스크립트가 어느 쪽이든 실행될 수 있습니다.

+2

컬 (curl) 0 시간 초과로 인해 더 오래 실행됩니다. – Boy

+0

시간 제한을 낮추려면 millisecond 변형을 사용하십시오. curl_setopt ($ curl, CURLOPT_TIMEOUT_MS, 1); –

2

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/

12
여기

:

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); 
+1

이유에 대한 설명을 제공해 주시겠습니까 –

+1

출력 버퍼 부분을 포함하고있는 몇 가지 솔루션을 찾았지만 그 컬 옵션을 추가하기 전까지는 계속 작동하지 않았습니다. 감사! –

3

당신이 정말로 당신이 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/

관련 문제