file_get_contents ()에 시간 초과 설정이 있습니까?


152

file_get_contents()루프 에서 메소드를 사용하여 일련의 링크를 호출하고 있습니다. 각 링크를 처리하는 데 15 분 이상 걸릴 수 있습니다. 이제 PHP file_get_contents()에 시간 초과 기간이 있는지에 대해 걱정하고 있습니까?

그렇다면 통화 시간이 초과되고 다음 링크로 이동합니다. 이전 링크를 끝내지 않고 다음 링크를 호출하고 싶지 않습니다.

file_get_contents()타임 아웃 기간이 있는지 알려주세요 . 를 포함하는 파일 file_get_contents()set_time_limit()0 (무제한)으로 설정됩니다 .



Visual Studio 확장 용 PHP 도구를 사용하는 Visual Studio PHP 프로젝트 내에서 동일한 "서버"에서 URL을 쿼리 할 때 시간 초과가 발생했습니다. 자세한 내용은 여기를 참조하십시오 .
Uwe Keim

내장 된 PHP 서버를 사용하여 동일한 웹 사이트 에서 URL을 쿼리 할 때도 단일 스레드 웹 서버이기 때문에 이런 일이 발생 합니다.
Uwe Keim

답변:


298

기본 시간 초과는 default_socket_timeoutini-setting에 의해 정의되며 60 초입니다. 즉시 변경할 수도 있습니다.

ini_set('default_socket_timeout', 900); // 900 Seconds = 15 Minutes

시간 초과를 설정하는 다른 방법 은 사용중인 HTTP 스트림 래퍼HTTP 컨텍스트 옵션 으로 stream_context_create시간 초과를 설정하는 데 사용 하는 것입니다.

$ctx = stream_context_create(array('http'=>
    array(
        'timeout' => 1200,  //1200 Seconds is 20 Minutes
    )
));

echo file_get_contents('http://example.com/', false, $ctx);

8
https URL의 시간 초과를 설정하는 방법에 대한 정보를 제공 할 수 있습니까?
Vinay

11
이 것이 완벽하게 작동하지 않습니다. 값이 1200이면 실제로 2400입니다. 방금 테스트합니다.
TomSawyer

15
default_socket_timeout, stream_set_timeout 및 stream_context_create 제한 시간은 전체 연결 제한 시간이 아니라 모든 행 읽기 / 쓰기의 제한 시간입니다.
diyism

32

@diyism에서 언급했듯이 " default_socket_timeout, stream_set_timeout 및 stream_context_create timeout은 전체 연결 시간 초과가 아니라 모든 행 읽기 / 쓰기의 시간 초과입니다. "@stewe의 최고 답변이 실패했습니다.

을 사용하는 대신 file_get_contents항상 curl시간 초과와 함께 사용할 수 있습니다 .

링크 호출에 작동하는 작동 코드가 있습니다.

$url='http://example.com/';
$ch=curl_init();
$timeout=5;

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

$result=curl_exec($ch);
curl_close($ch);
echo $result;

1
이 답변은 연결 시간 제한을 제어하는 ​​또 다른 방법을 제공합니다 ( fsockopen대신 대신 사용 curl) : stackoverflow.com/a/3690321/1869825
stevo

2
CURLOPT_CONNECTTIMEOUT 및 CURLOPT_TIMEOUT을 모두 컬로 설정해야합니다. 참조 stackoverflow.com/a/27776164/1863432
bhelm

2
올바른 응답이 아닙니다. 질문은 "file_get_contents"에 대한 것입니다. 응답은 훌륭하지만 부적절합니다.
e-info128

8

예! 세 번째 매개 변수에 스트림 컨텍스트 를 전달하면 다음과 같습니다.

시간 제한이 1 초입니다 .

file_get_contents("https://abcedef.com", 0, stream_context_create(["http"=>["timeout"=>1]]));

https://www.php.net/manual/en/function.file-get-contents.php의 주석 섹션에있는 소스

HTTP 컨텍스트 옵션 :

method
header
user_agent
content
request_fulluri
follow_location
max_redirects
protocol_version
timeout

다른 상황 : https://www.php.net/manual/en/context.php


1
286 명의 답변이 효과가 없었지만 귀하의 답변은 다음과
같습니다.)

에 지정된 시간 초과 stream_context_create는 연결 시간 초과에만 적용됩니다. 서버가 주어진 시간 초과 내에 응답 (일부 데이터 전송)하지만 나머지 페이로드를 전송하는 데 시간이 오래 걸리더라도이 시간 초과는 느린 전송을 중단하지 않습니다.
z80crew

6

default_socket_timeout 을 즉시 변경하면 file_get_contents 호출 후 해당 값을 복원하는 것이 유용 할 수 있습니다 .

$default_socket_timeout = ini_get('default_socket_timeout');
....
ini_set('default_socket_timeout', 10);
file_get_contents($url);
...
ini_set('default_socket_timeout', $default_socket_timeout);

1
하지만 당신은 ini_set가 그 것들을 영구적으로 설정하지 않는다는 것을 알고 있습니다. 따라서 기본적으로 스크립트의 절반이 쓸모가 없습니다
Flash Thunder

2
@FlashThunder 이전 타임 아웃이 필요한 코드에서 나중에 file_get_contents에 대한 다른 호출이 있으면 아닙니다. 해당 코드가 실행 된 후 특정 코드 비트에 대해 즉시 변경된 설정을 복원하는 것이 좋습니다.
레이 Bicknell

1
@FlashThunder 동일한 스크립트 실행에서 동일한 함수 에 대한 후속 호출이 전역 설정을 사용 하도록 호출 후 socket_timeout 값을 복원하는 것이 좋습니다 .
파스칼 로제트

1

내 호스트에서 php.ini를 변경하면 작동합니다.

; Default timeout for socket based streams (seconds)
default_socket_timeout = 300
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.