当我尝试使用PHP的GZIP .js文件时,我得到某种与php相关的错误

时间:2009-03-04 21:54:04

标签: php javascript .htaccess gzip

好的,所以我用Google搜索了几页并提出了以下解决方案:

在.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文件。到现在为止还挺好。然而问题是我使用的一些缩小的javascripts我得到某种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不喜欢的错误”。但它不应该是一个更容易的解决方案吗?

3 个答案:

答案 0 :(得分:6)

我们使用Apache Mod_Deflate并使用此处显示的示例配置。在不破解PHP的情况下工作得很好。

答案 1 :(得分:2)

我实际上是从PHP脚本提供我的JS文件。不是因为这个问题,所以我可以控制expires头和缓存。一般模型是:

  • 网址类似于/script/blah.1234567890.js;
  • 该URL是从blah.js文件的mtime生成的;
  • 该URL通过.htaccess中的重写规则发送到js.php脚本;
  • 脚本检查传入的mtime。如果它比缓存版本的mtime更新,它会从我的所有JS文件生成一个新的缓存版本(整理成一个文件,然后用JSMin缩小);
  • 如果mtime不比脚本新,则只提供缓存版本;
  • 在所有情况下,内容都将设置为从现在起一年后到期。

URL中的时间戳允许刷新脚本文件。

现在这与gzipping有什么关系?简单。在我的js.php脚本的顶部是:

ob_start("ob_gzhandler")

如果客户端支持gzip压缩(以及使用输出缓冲),它会打开gzip压缩。

真的很有效。

尝试将自己限制在一个JS和一个CSS文件中。必要时将它们合并。我也用CSS文件做同样的技巧(当然没有缩小)。

此解决方案的优点是它仅依赖于启用mod_rewrite。不需要其他扩展(ob_gzhandler是PHP的标准部分)。另外,需要一个脚本来组合文件(除非你在构建过程中这样做,但我发现这有点繁琐)。

答案 2 :(得分:1)

您收到此错误的原因是脚本包含<?。 例如,在prettify.js中是这样的:

/^[^<?]+/

您将此传递给PHP,以便再次启动PHP引擎并看到意外的]

如果您需要更多控制权,我会使用@ jonstjohn的方法,或@ cletus's。