Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 返回预压缩的静态内容,而不是动态压缩_Php_Database_Json_Gzip - Fatal编程技术网

Php 返回预压缩的静态内容,而不是动态压缩

Php 返回预压缩的静态内容,而不是动态压缩,php,database,json,gzip,Php,Database,Json,Gzip,我在数据库中索引了很多静态JSON文本内容。有些内容大于20K。网页通过Ajax和调用PHP文件来获取数据库中的数据来请求这些内容 当然,可以动态地gzip返回的内容,但是我想知道是否可以获取预gzip的内容并直接从PHP返回它。换句话说,我可以预处理gzip条目并将它们存储在数据库本身中,而不是全文 这可能吗?如果是,我如何在PHP中指出返回的内容是gzip二进制文件?我对纯文本使用echo,但对二进制数据应该使用哪个命令?我不是PHP方面的专家。谢谢。是的,这是可能的 您需要通过函数修改HT

我在数据库中索引了很多静态JSON文本内容。有些内容大于20K。网页通过Ajax和调用PHP文件来获取数据库中的数据来请求这些内容

当然,可以动态地gzip返回的内容,但是我想知道是否可以获取预gzip的内容并直接从PHP返回它。换句话说,我可以预处理gzip条目并将它们存储在数据库本身中,而不是全文

这可能吗?如果是,我如何在PHP中指出返回的内容是gzip二进制文件?我对纯文本使用
echo
,但对二进制数据应该使用哪个命令?我不是PHP方面的专家。谢谢。

是的,这是可能的

您需要通过函数修改HTTP头(内容类型、内容长度、传输编码)

但是请注意,您需要解析客户机提出的已接受的传输编码(deflate、gzip等),并处理所有这些编码。如果您将deflate发送到gzip客户端,或者反之亦然,它将无法按预期工作

另外,请记住gzip传输编码和gzip文件格式之间存在差异。您可能需要找到一个在php中实现这一点的库,或者自己做一些脏活


不管怎样,祝你好运

您还将回显gzip数据。echo只是“将这些字节写入输出缓冲区”。如果需要,您可以回显图像。有趣的是,您告诉浏览器如何处理数据。这就是HTTP响应头的作用。您需要发送一个内容编码头。但是您需要确保,客户机能够理解gzip,这样才能工作。您还应该知道,有两种不同的压缩算法在使用:DEFLATE和GZIP

<?php
$data = fetchGzippedDataFromDatabase();
if (stripos($_SERVER["HTTP_ACCEPT_ENCODING"], 'gzip') !== false) {
  header('Content-Encoding: gzip');
  header('Content-Length: ' . strlen($data));
  echo $data;
} else {
  // client does not accept gzipped data
  echo gzdecode($data);
  // or gzinflate() or gzuncompress() 
  // depending on what you used to compress in the first place
}

由于内容是静态的,我建议您完全绕过“从db获取”步骤,尝试一种支持gzip编码响应或缓存gzip版本的缓存机制


给为阿帕奇做这件事的人。另一个解决方案是。

Apache Web服务器替代方案

首先,如果您正在使用,您可能需要启用和配置。它将在将内容发送到客户端之前处理内容压缩

PHP备选方案#1

如果没有,那么您可以使用(PHP4>=4.0.4,PHP5)来激活gzip输出缓冲区

if(!ob_start("ob_gzhandler")) ob_start();
echo $json;
PHP备选方案#2

另一种可能性(未测试)是缓存磁盘上的内容,而不是将gzip内容放入数据库,如果这些内容更多地以未压缩格式使用的话。使用

这种方式可能只用于输出gzip内容,而不是像在所有浏览器中那样工作

PHP替代方案#2.5

当浏览器仅接受Gzip内容时,从磁盘缓存输出Gzip内容

$json = array('id' => $id, 'content' => $content);
if( strpos($_SERVER["HTTP_ACCEPT_ENCODING"],'gzip') !== false ) {
  $file = '/tmp/' . $json['id'] . '.json';
  if(!file_exists($file)) {
    $gzip = gzencode($json['content']);
    file_put_contents($file, $gzip);
  } else {
    $gzip = file_get_contents($file);
  }
  header('Content-Encoding: gzip');
  header('Content-Length: '.strlen($gzip));
  echo $gzip;
} else {
  echo $json['content'];
}

谢谢,我一定会调查的。
$json = array('id' => $id, 'content' => $content);
if( strpos($_SERVER["HTTP_ACCEPT_ENCODING"],'gzip') !== false ) {
  $file = '/tmp/' . $json['id'] . '.json';
  if(!file_exists($file)) {
    $gzip = gzencode($json['content']);
    file_put_contents($file, $gzip);
  } else {
    $gzip = file_get_contents($file);
  }
  header('Content-Encoding: gzip');
  header('Content-Length: '.strlen($gzip));
  echo $gzip;
} else {
  echo $json['content'];
}