source

PHP에서 컬 타임아웃 설정

manysource 2022. 11. 5. 17:37

PHP에서 컬 타임아웃 설정

php를 통해 eXist 데이터베이스에서 컬 요청을 실행하고 있습니다.데이터 집합이 매우 크기 때문에 XML 응답을 반환하는 데 오랜 시간이 걸립니다.이를 수정하기 위해 긴 타임아웃으로 컬 요청을 설정했습니다.

$ch = curl_init();
$headers["Content-Length"] = strlen($postString);
$headers["User-Agent"] = "Curl/1.0";

curl_setopt($ch, CURLOPT_URL, $requestUrl);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, 'admin:');
curl_setopt($ch,CURLOPT_TIMEOUT,1000);
$response = curl_exec($ch);
curl_close($ch);

단, 컬 요구는 항상 요구가 완료되기 전에 종료됩니다(브라우저를 통해 요구되었을 경우 1000 미만).이게 타임아웃을 컬로 설정하는 적절한 방법인지 아는 사람 있나요?

다음 문서를 참조하십시오.http://www.php.net/manual/en/function.curl-setopt.php

CURLOPT_CONNECTTIMEOUT- 연결을 시도하는 동안 대기하는 시간(초)입니다.무기한 대기하려면 0을 사용합니다.
CURLOPT_TIMEOUT- cURL 함수를 실행할 수 있는 최대 초수.

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); 
curl_setopt($ch, CURLOPT_TIMEOUT, 400); //timeout in seconds

또한 php 스크립트 self의 실행 시간을 확대하는 것도 잊지 마십시오.

set_time_limit(0);// to infinity for example

음, 내가 보기엔CURLOPT_TIMEOUT에 cURL 함수의 실행에 필요한 시간을 나타냅니다.내 생각에 당신은 실제로 이 모든 것들을CURLOPT_CONNECTTIMEOUT대신 cURL에 접속이 완료될 때까지 대기하는 최대 시간이 나타나기 때문입니다.

어떤 사람들에게는 이런 특이한 점이 있을 수 있어PHP 문서의 코멘트로부터.

cURL이 1초 이내에 타임아웃되도록 하려면CURLOPT_TIMEOUT_MS단, "Unix-like systems"에는 오류 "cURL Error (28) : Timeout was reached"와 함께 값이 1000 ms 미만일 경우 libcurl이 즉시 타임아웃되는 오류/"feature"가 있습니다.이 동작에 대한 설명은 다음과 같습니다.

libcurl이 표준 시스템 이름 리졸바를 사용하도록 구축되어 있는 경우 전송의 그 부분은 최소 1초의 타임아웃을 허용하는 풀초 해상도를 계속 사용합니다.

이것이 PHP 개발자에게 의미하는 것은 "libcurl이 표준 시스템 이름 해결기를 사용하고 있는지 여부를 알 수 없기 때문에 먼저 테스트하지 않고는 이 함수를 사용할 수 없습니다(그러나 거의 확실합니다)"입니다.

문제는 (Li|U)nix에서 libcurl이 표준 이름 해결기를 사용하는 경우 이름 해결 중에 SIGALRM이 발생하며 libcurl이 타임아웃알람이라고 생각한다는 것입니다

해결책은 CURLOPT_NOSIGNAL을 사용하여 신호를 비활성화하는 것입니다.다음으로 타임아웃을 테스트할 수 있도록 자신에게 10초 지연을 요구하는 스크립트의 예를 나타냅니다.

if (!isset($_GET['foo'])) {
    // Client
    $ch = curl_init('http://localhost/test/test_timeout.php?foo=bar');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);
    $data = curl_exec($ch);
    $curl_errno = curl_errno($ch);
    $curl_error = curl_error($ch);
    curl_close($ch);

    if ($curl_errno > 0) {
        echo "cURL Error ($curl_errno): $curl_error\n";
    } else {
        echo "Data received: $data\n";
    }
} else {
    // Server
    sleep(10);
    echo "Done.";
}

http://www.php.net/manual/en/function.curl-setopt.php#104597 에서

코드는 타임아웃을 1000초로 설정합니다.밀리초 동안 다음 명령을 사용합니다.CURLOPT_TIMEOUT_MS.

사용자와 파일 사이의 타임아웃을 확인해야 합니다.이 경우 PHP 및 Curl.

때 하려면 Curl을 설정해야 .CURLOPT_TIMEOUT로로 합니다.0 「」가 아닌 「」1000.

curl_setopt($ch, CURLOPT_TIMEOUT, 0);

PHP에서도 시간 제한을 삭제해야 합니다.그렇지 않으면 PHP가 Curl의 요구에 따라 스크립트를 종료합니다(기본적으로 30초 후).이것만으로도 문제가 해결됩니다.
무결성이 한 경우 보안 할 수 .ignore_user_abort:

# The maximum execution time, in seconds. If set to zero, no time limit is imposed.
set_time_limit(0);

# Make sure to keep alive the script when a client disconnect.
ignore_user_abort(true);

클라이언트의 될 수 .
부분신경 도 있고 안 쓸 도 있어요신경 쓸 수도 있고 안 쓸 수도 있어요

에서 맨 에 있기 에 이 에 대답하는 은 " " "를 합니다.CURL_TIMEOUT.

브라우저에서 요청을 실행할 수 없습니다. CURL 요청을 실행하는 서버가 응답할 때까지 대기하는 동안 시간이 초과됩니다.브라우저는 디폴트 네트워크타임아웃인 1~2분 후에 타임아웃이 될 수 있습니다.

명령줄/단말기에서 실행해야 합니다.

PHP를 fast CGI 애플리케이션으로 사용하는 경우 fast CGI 타임아웃 설정을 확인하십시오.참조: PHP curl put 500 오류

언급URL : https://stackoverflow.com/questions/2582057/setting-curls-timeout-in-php