当我尝试使用 PHP GZIP .js 文件时,出现某种与 php 相关的错误
-
03-07-2019 - |
题
好的,所以我用谷歌搜索了几页并提出了以下解决方案:
将其添加到 .htaccess 中#Active GZIP for php-files
php_flag zlib.output_compression On
php_value zlib.output_compression_level 5
对于 .js 和 .css:
AddHandler application/x-httpd-php .css .js
php_value auto_prepend_file /Library/WebServer/Documents/blog/code/Helpers/ContentHeader.php
它将执行 .js 和 .css 作为 php 脚本。第二行包括以下页面:
<?php
$pathInfo = pathinfo($_SERVER['PHP_SELF']);
$extension = $pathInfo['extension'];
if($extension == "css")
{
header("Content-type: text/css");
}
if($extension == "js")
{
header("Content-type: text/javascript");
}
?>
这会将标头“text/css”发送到 .css 文件,将“text/javascript”发送到 javascript 文件。到目前为止,一切都很好。然而问题是我使用的几个缩小的 javascript 出现了某种 php 错误:
<br />
<b>Parse error</b>: syntax error, unexpected ']' in <b>/Library/WebServer/Documents/blog/public/scripts/prettify/prettify.js</b> on line <b>18</b><br />
或者:
<br />
<b>Warning</b>: Unexpected character in input: '\' (ASCII=92) state=1 in <b>/Library/WebServer/Documents/blog/public/scripts/showdown.js</b> on line <b>29</b><br />
<br />
<b>Parse error</b>: syntax error, unexpected '?' in <b>/Library/WebServer/Documents/blog/public/scripts/showdown.js</b> on line <b>29</b><br />
那么,有没有更好的方法来做到这一点呢?我能想到的唯一选择是手动进入 .javascript 文件并“纠正 php 不喜欢的错误”。但这不应该是一个更简单的解决方案吗?
解决方案
您收到此错误的原因是脚本包含<?
。
例如,在prettify.js中是这样的:
/^[^<?]+/
你将它传递给PHP,这样就可以再次启动PHP引擎并看到意外的]
。
如果您需要更多控制权,我会使用@ jonstjohn的方法,或@ cletus's。
其他提示
我们使用 Apache Mod_Deflate 并使用此处显示的示例配置。在不破解PHP的情况下工作得很好。
我实际上是通过 PHP 脚本提供 JS 文件的。不是因为这个问题,而是因为我可以控制过期标头和缓存。通用模型为:
- URL 类似于 /script/blah.1234567890.js;
- 该 URL 是根据 blah.js 文件的 mtime 生成的;
- 该 URL 通过 .htaccess 中的重写规则发送到 js.php 脚本;
- 该脚本检查传入的 mtime。如果它比缓存版本的 mtime 新,它会从我的所有 JS 文件(整理成单个文件,然后使用 JSMin 缩小)生成一个新的缓存版本;
- 如果 mtime 不比脚本新,则仅提供缓存版本;
- 在所有情况下,内容都将在一年后过期。
URL 中的时间戳允许刷新脚本文件。
现在这与 gzip 有何关系?简单的。我的 js.php 脚本的顶部是:
ob_start("ob_gzhandler")
如果客户端支持 gzip 压缩(以及使用输出缓冲),它将打开 gzip 压缩。
它确实有效。
尝试将自己限制为仅使用一个 JS 和一个 CSS 文件。如有必要,将它们组合起来。我也对 CSS 文件做了同样的技巧(当然没有缩小)。
此解决方案的优点是它仅依赖于启用 mod_rewrite。不需要其他扩展(ob_gzhandler 是 PHP 的标准部分)。另外,需要一个脚本来组合文件(除非您将其作为构建过程的一部分来执行,但我发现这有点乏味)。