1

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

在 .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 不喜欢的错误”。但它不应该是一个更简单的解决方案吗?

4

3 回答 3

6

我们使用Apache Mod_Deflate并使用那里显示的示例配置。无需在 PHP 中破解就可以很好地工作。

于 2009-03-04T21:57:28.993 回答
2

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

  • URL 类似于 /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 压缩。

它真的很有效。

尝试将自己限制在一个 JS 和一个 CSS 文件中。如有必要,将它们组合起来。我也对 CSS 文件做同样的事情(当然没有缩小)。

此解决方案的优点是它仅依赖于启用 mod_rewrite。不需要其他扩展(ob_gzhandler 是 PHP 的标准部分)。此外,还需要一个脚本来组合文件(除非您将其作为构建过程的一部分,但我觉得这有点乏味)。

于 2009-03-04T22:03:13.020 回答
1

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

/^[^<?]+/

您将其传递给 PHP,以便重新启动 PHP 引擎并看到意外的].

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

于 2009-03-04T22:08:30.230 回答