【问题标题】:How to set timeout for get_meta_tags() & get_headers()如何为 get_meta_tags() 和 get_headers() 设置超时
【发布时间】:2011-08-28 08:50:12
【问题描述】:

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

【问题讨论】:

    标签: php timeout get-headers


    【解决方案1】:

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

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

    ini_set('default_socket_timeout', 10);
    

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

    【讨论】:

    • 非常感谢您的提示,刚刚测试过,它确实有效!我现在只是担心它可能会影响其他 PHP 函数。有什么方法可以设置这两个函数的超时时间,或者监控它们运行了多长时间,然后在几秒钟后中止它们?
    【解决方案2】:

    get_headersget_meta_tags 函数在下面使用默认的HTTP Stream Wrapper。您可以将 change the ini setting 作为该包装器的 shown elsewhere on this pagemodify 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 转换为数组以将其放回吗?
    【解决方案3】:

    正如@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
        }
    }
    

    【讨论】:

      【解决方案4】:

      @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;
      

      【讨论】:

        猜你喜欢
        • 2011-09-05
        • 1970-01-01
        • 2012-01-14
        • 2021-03-28
        • 2016-06-29
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 2018-07-08
        相关资源
        最近更新 更多