【问题标题】:Why returns this curl function an undifined index at initial page load?为什么在初始页面加载时将此 curl 函数返回一个未定义的索引?
【发布时间】:2019-01-28 09:33:11
【问题描述】:

我正在使用下面的函数来获取托管在云中的图像的文件大小。 我需要在我的页面上显示这个尺寸。 当页面第一次加载时返回一个通知:Undefined index: content-length。重新加载页面时,提示消失,页面显示正常。为什么会发生这种情况,我该怎么办?

$post_id = get_the_ID();
$post_thumbnail_id = get_post_thumbnail_id( $post_id );

//retrieve the size in bytes

$filePath = get_the_post_thumbnail_url($post_id, 'full');
  if (filter_var($filePath, FILTER_VALIDATE_URL)) {
    $ch = curl_init();
    $headers = [];
    curl_setopt($ch, CURLOPT_URL, $filePath);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    // this function is called by curl for each header received
    curl_setopt($ch, CURLOPT_HEADERFUNCTION,
    function($curl, $header) use (&$headers)
     {   
     $len = strlen($header);
     $header = explode(':', $header, 2);
     if (count($header) < 2) // ignore invalid headers
     return $len;

      $name = strtolower(trim($header[0]));
      if (!array_key_exists($name, $headers))
        $headers[$name] = [trim($header[1])];
      else
        $headers[$name][] = trim($header[1]);

        return $len;
       }  
    );
 $data = curl_exec($ch);
}

//convert the size in bytes to MB
$filemb = $headers['content-length']['0'] / 1000 / 1000;
$filemb = round($filemb,2);

// do my stuff

【问题讨论】:

  • 看起来您的 CDN 没有在第一次请求时为这些图像发送 Content-Length 标头。 (但在每一个页面加载时都这样做是一个相当糟糕的主意,会减慢整个页面的速度。你应该找到一种方法来缓存这些结果。)
  • 很高兴看到我的 curl header 函数在那里使用:)。 @04FS 是正确的,服务器没有发送 Content-Length 标头,这不是强制性的。另外请注意/ 1000 / 1000 转换为 MB 是不正确的,1 KB 中有 1024 个字节,1 MB 有 1024 KB。从技术上讲,它是 MiB 和 KiB,但在文件存储方面,通用约定是 1024 而不是 1000,即使不使用较新的表示法。
  • @04FS,谢谢。我认为我的函数(和显示页面)比检索 Content-Length 运行得更快,但是由于我没有那么有经验,我可能是错的。容易地。我必须重新思考我做事的方式。都是关于产品的,从 CDN 提供服务,也许我可以在产品创建时将这个值存储在数据库中......
  • @Geoffrey。是的,确实,这是你的职责。当我发布这个问题时,我已经搜索了我从哪里获取该功能,以表扬你,但无法快速找到它。我知道 /1000/1000 不是最好的数学,但不知何故,它是使结果与我的本地系统和 Amazon S3 一致的唯一方法,以及我自己下载全尺寸图像的大小。使用 /1024/1024 给我带来了一个较小的文件,与下载的大小不一致。为什么?打败我.....
  • @All who can help: 看来毕竟不可靠。有时已设置,有时未设置,看起来 $filemb 变量在检索大小之前已设置为 0。我们该如何解决?

标签: php wordpress curl


【解决方案1】:

除此之外,我还听取了 04FS 和 Geoffrey 的建议并制定了不同的方法。我在 WooCommerce 中创建了一个自定义字段(文件大小),在创建产品时,我使用上述函数返回的值设置了该字段。

所以,我将它存储在我自己的数据库中。因此,页面速度不会降低。我认为这对带宽使用也有好处。

所以它只被检索一次。

@04FS 和@Geoffrey....谢谢!

编辑:

这似乎并不可靠。有时它已设置,有时它没有>必须弄清楚那个.....

【讨论】:

    猜你喜欢
    • 2023-01-16
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    相关资源
    最近更新 更多