【问题标题】:How big is a string in PHP?PHP中的字符串有多大?
【发布时间】:2012-01-21 02:53:26
【问题描述】:

如果我使用以下方式从网站下载文件:

$html = file_get_html($url); 

那么我如何知道 HTML 字符串的大小(以千字节为单位)?我想知道,因为我想跳过超过 100Kb 的文件。

【问题讨论】:

  • "一根绳子有多长?" :o)
  • 您不应该检索远程文件然后检查文件大小。 您应该在下载之前使用 cURL 找出文件大小。

标签: php


【解决方案1】:

如果你这样做file_get_contents,你已经得到了整个文件。

如果你的意思是“跳过处理”,而不是“跳过检索”,你可以得到字符串的长度:strlen($html)。对于千字节,除以 1024。

这是不精确的,因为字符串可能包含长度超过一个字节的 UTF-8 字符,并且非常小的文件实际上会占用一个 FS 块而不是它们的字节长度,但它可能足以满足您的任意阈值截止”正在寻找。

【讨论】:

  • 根据字符编码,这可能不正确。
  • OP 要求以 bytes 为单位的大小,字符无关紧要。 FS 块也无关紧要,因为此时字符串并未存储在磁盘上。
  • 出于兴趣,关于问题的标题,您知道PHP中变量是否有最大大小吗? $html 可以存储多少个字符?
  • @deceze:它在某个时候被存储在某个地方,这就是为什么我提到磁盘上的表示不同于文件内容的原因。回复:MattP,我认为 PHP 的限制是可用内存或 2^(地址位)-1。非常大,但是对于非平凡大小的文件来说,这种读取文件的方式当然很糟糕......
  • 是的,值得一提,但它与通过 HTTP 传输字符串完全无关。在这种情况下,由于 FS 块大小,非常小的字符串不会增长。
【解决方案2】:

要跳过获取大文件,您需要使用cURL library

<?php

function get_content_length($url) {
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_HEADER, 1);
  curl_setopt($ch, CURLOPT_NOBODY, 1);
  $hraw=explode("\r\n",curl_exec($ch));
  curl_close($ch);

  $hdrs=array();
  foreach($hraw as $hdr) {
    $a=explode(": ", trim($hdr));
    $hdrs[$a[0]]=$a[1];
  }

  return (isset($hdrs['Content-Length'])) ? $hdrs['Content-Length'] : FALSE;
}

$url="http://www.example.com/";

if (get_content_length($url) < 100000) {
  $html = file_get_contents($url);
  print "Yes.\n";
} else {
  print "No.\n";
}

?>

可能有一种更优雅的方法可以将这些信息从 curl 中提取出来,但这是最快想到的方法。 YMMV。

请注意,以这种方式设置 CURLOPT 选项会使 curl 使用“HEAD”而不是“GET”请求,因此我们实际上并没有两次获取此 URL。

【讨论】:

    【解决方案3】:

    定义,什么是字符串,PHP和直观含义不同:

    “Hällo”(注意元音变音)看起来像一个 5 字符的字符串,但对于 PHP,它实际上是一个 6 字节的数组(假设 UTF8) - PHP 没有表示文本的字符串的概念,它只是将其视为一个字节序列(PHP 的委婉说法是“二进制安全”)。

    所以 strlen("Hällo") 将是 6 (UTF8)。

    也就是说,如果您想跳过 100Kb 以上的内容,您可能不会介意将 99.5k 字符转换为 100k 字节。

    【讨论】:

    • 无论如何,OP 都在询问 bytes,他在哪里提到了 characters
    • OP 可能不记得两者并不总是相同的。不是每个人都认为遥遥领先。这就是为什么我们都在这里提供帮助非常棒。 :-)
    【解决方案4】:

    file_get_html 向您返回一个对象,此时字符串大小的信息会丢失。先获取字符串,再获取对象:

    $html = file_get_contents($url);
    echo strlen($html); // size in bytes
    $html = str_get_html($html);
    

    【讨论】:

      【解决方案5】:

      您可以使用 mb_strlen 强制 8bit 或其他什么,然后 1 个字符 = 1 个字节

      【讨论】:

      • OP 要求的是 bytes,而不是字符。
      • 你没有看我的声明,1字节=========== 1个字符。如果您不正确,请不要投反对票。
      • 对不起,但是“使用 mb_strlen 强制 latin1 或其他什么”是无稽之谈。您可能的意思是“mb_strlen 会为您提供准确的 字符数,即使对于多字节编码也是如此”。这并没有强制 latin1 或字符串上没有的内容,OP 也没有询问 characters 的开头。至少更正声明,然后我很乐意删除反对票。
      • stackoverflow.com/questions/3511106/filesize-from-a-string 阅读。我会将它从 latin1 更改为 8bit 以使您开心。在这种情况下,字符等于文件大小。
      • 阅读。它在任何地方都没有提到 latin1。无论如何,mb_strlen($str, '8bit') 等价于strlen,它会为您提供字节数。为什么这里的每个人都坚持谈论角色,而问题中没有提到?!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      • 2017-11-27
      • 2015-12-02
      • 2012-04-02
      相关资源
      最近更新 更多