14

我一直在使用 get_meta_tags() 和 get_headers() PHP 函数,并且需要设置超时值以防网站运行缓慢或无响应。有谁知道该怎么做?

4

4 回答 4

19

您应该能够使用default_socket_timeoutini 设置来影响这一点(因为它是通过 URL 包装器)。

尝试将其设置在php.ini文件中或执行类似的操作

ini_set('default_socket_timeout', 10);

设置 10 秒超时(默认值为 60)

于 2011-05-18T20:12:15.790 回答
7

get_headersand函数在下面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);
于 2012-10-28T11:42:46.110 回答
0

正如@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
    }
}
于 2019-10-05T18:15:44.777 回答
0

@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;
于 2020-05-04T10:33:24.487 回答