【问题标题】:how to send zipped (ASCII) data in an HTTP response from PHP如何在 PHP 的 HTTP 响应中发送压缩(ASCII)数据
【发布时间】:2010-12-13 21:27:56
【问题描述】:

我正在编写一个将数据作为响应发送给客户端的服务。

我正在发送文本(PLAIN ASCII)数据,但我想先压缩数据(使用任何标准压缩例程),然后使用 header() 函数等将压缩数据发送回服务器。

我对 PHP 比较陌生,所以在收集了数据后,我知道我需要知道如何在 HTTP 响应中将(压缩的)数据发送给用户

这是我目前所拥有的伪代码:

<?php
   function createResponse($args)
   {
      if ( ($data = fetch_data($args)) !== NULL)
      {
         /* Assumption is that $data is a string consisting of comma separated
            values (for the columns) and each "row" is separated by a CRLF
            so $data looks like this:

            18-Oct-2009, 100.2, -10.5, 15.66, 34.2, 99.2, 88.2, 'c', 'it1', 1000342\r\n
            19-Oct-2009, -33.72, 47.5, 24.76, 8.2, 89.2, 88.2, 'c', 'it2', 304342\r\n

            etc ..
         */


         //1. OPTIONAL - need to encrypt $data here (how?)
         //2. Need to compress (encrypted?) $data here (how?)
         //3. Need to send HTTP Status 200 OK and mime/type (zip/compressed here)
         //4. Need to send data

      }
      else
      {
         //5. Need to send HTTP error code (say 404) here
      }
   }
?>

有经验丰富的 PHP 程序员可以告诉我上面的 1 -5 使用哪些语句吗?

【问题讨论】:

  • 您希望您的数据像在 ZIP 存档中一样被压缩,还是只是为了传输而压缩?
  • Gumbo:只是为了传输而压缩(数据已经作为字符串从数据库读取到内存中 - 格式如上面的伪代码所示)

标签: php encryption compression http-headers http-compression


【解决方案1】:

您可以使用ob_gzhandler 对其进行压缩(这样您的浏览器将自行解压缩),或者您可以使用ZipArchive 存档您的数据并将其像真正的.zip 文件一样传输给用户 - 您需要类似以下内容:

// Headers for an download:
header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="yourarchive.zip"');
header('Content-Transfer-Encoding: binary');
// load the file to send:
readfile('yourarchive.zip');

请注意,标头必须在任何输出之前发送。

【讨论】:

  • 您好静默,感谢您的及时回复。这几乎是我正在寻找的 - 唯一的问题是我已经将数据保存在内存中,它已经从数据库中读取了,我不想先将它保存到文件中(磁盘 I/ O 是一个主要的瓶颈)。那么:如何直接从内存中的字符串数据变量中压缩数据?另外:1.(我知道这是可选的),但是我如何加密 $data 变量(在压缩之前?我想我知道如何使用 header() 函数设置状态代码 - 这样就可以回答问题 3 和 5
  • 最后但并非最不重要的一点是,是否有明确的函数/命令来发送我将创建的数据?我在想代码看起来像这样: $comp_data = some_compression_func($data) // 在此处执行 HTTP 标头内容 ... echo $comp_data; // 嗯,不确定你可以用压缩数据做到这一点吗?!返回;
  • 最后但并非最不重要的一点是,它不是将使用发送数据的浏览器,我将其编写为 RESTful 服务的一部分 - 我将使用 Curl 和另一种语言(C++ 绑定) 在客户端。
  • 可以使用 addFromString 方法 (php.net/manual/en/function.ziparchive-addfromstring.php)
猜你喜欢
  • 2020-02-25
  • 1970-01-01
  • 2013-12-02
  • 2023-04-09
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多