【发布时间】:2011-08-28 08:50:12
【问题描述】:
我一直在使用 get_meta_tags() 和 get_headers() PHP 函数,并且需要设置超时值以防网站缓慢或无响应。有谁知道该怎么做?
【问题讨论】:
标签: php timeout get-headers
我一直在使用 get_meta_tags() 和 get_headers() PHP 函数,并且需要设置超时值以防网站缓慢或无响应。有谁知道该怎么做?
【问题讨论】:
标签: php timeout get-headers
您应该能够使用default_socket_timeout ini 设置来影响这一点(因为它是通过 URL 包装器)。
尝试将其设置在 php.ini 文件中或执行类似的操作
ini_set('default_socket_timeout', 10);
设置 10 秒超时(默认值为 60)
【讨论】:
get_headers 和get_meta_tags 函数在下面使用默认的HTTP Stream Wrapper。您可以将 change the ini setting 作为该包装器的 shown elsewhere on this page 或 modify the behavior 并设置特定的超时时间:
stream_context_set_default(
array(
'http' => array(
'timeout' => 5
)
)
);
请注意,更改默认 HTTP 流上下文将应用于所有使用它的函数。如果要将超时恢复为原始默认设置,请执行以下操作:
$originalDefaults = stream_context_set_default( … );
$meta = get_meta_tags( … );
stream_context_set_default($originalDefaults);
附带说明,如果您使用 HTTP Stream Wrapper 调用任何函数,PHP 也会在当前范围内自动填充 variable $http_response_header,因此您不必另外调用 get_headers,例如
$originalDefaults = stream_context_set_default( … );
$meta = get_meta_tags( … );
stream_context_set_default($originalDefaults);
var_dump($http_response_header);
【讨论】:
stream_context_set_default 返回 ressource 类型并采用 array(我收到错误)所以我应该将 ressource 转换为数组以将其放回吗?
正如@Gordon 发布的那样,只使用 get_headers 但stream_context_set_default 返回ressource 而不是数组,所以我不确定我应该如何将它反馈到同一个函数中。它期望一个数组。
$originalDefaults = stream_context_set_default( … );
$meta = get_meta_tags( … );
stream_context_set_default($originalDefaults);
var_dump($http_response_header);
在 php 7.1 中,get_headers 添加了第三个参数。所以我想出了这个。在未过时的 PHP 版本上,该选项仅添加到 get headers 调用中,否则默认值将适用于脚本执行的其余部分,直到有人向我解释如何在较旧的 php 版本上执行此操作。
function ngt_headers( $url ) {
$opts['http']['timeout'] = 2;
if ( version_compare(PHP_VERSION, '7.1.0', '>=') ) {
$context = stream_context_create( $opts );
return @get_headers( $url, 0, $context ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
} else {
stream_context_set_default( $opts );
return @get_headers( $url ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
}
}
【讨论】:
@redanimalwar,如何获取默认选项并将其设置回上下文,如下所示:
$opts['http']['timeout'] = 2;
$headers = null;
if (version_compare(PHP_VERSION, '7.1.0', '>=')) {
$context = stream_context_create($opts);
$headers = @get_headers($url, 0, $context);
} else {
$defaultOptions = stream_context_get_options(stream_context_get_default());
stream_context_set_default($opts);
$headers = @get_headers($url);
stream_context_set_default($defaultOptions);
}
return $headers;
【讨论】: