我一直在使用 get_meta_tags() 和 get_headers() PHP 函数,并且需要设置超时值以防网站运行缓慢或无响应。有谁知道该怎么做?
4 回答
您应该能够使用default_socket_timeout
ini 设置来影响这一点(因为它是通过 URL 包装器)。
尝试将其设置在php.ini
文件中或执行类似的操作
ini_set('default_socket_timeout', 10);
设置 10 秒超时(默认值为 60)
get_headers
and函数在下面get_meta_tags
使用默认的HTTP Stream Wrapper。您可以更改本页其他地方所示的 ini 设置,也可以修改该包装器的行为并设置特定的超时:
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 还将自动填充当前范围内的变量$http_response_header
,因此您不必get_headers
另外调用,例如
$originalDefaults = stream_context_set_default( … );
$meta = get_meta_tags( … );
stream_context_set_default($originalDefaults);
var_dump($http_response_header);
正如@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;