用PHP文本编辑器压缩和合并JS文件

Compression and mergin of JS files with PHP- Text editor

本文关键字:合并 JS 文件 压缩 编辑器 PHP 文本 文本编辑      更新时间:2023-09-26

我目前正在缩小JS文件以提高页面速度。我已经找到了一个最简单的方法,除了两个之外,它几乎适用于我的所有js文件。问题是我试图在我的网站上实现的wmd编辑器的js文件。js文件wmd.jsshowdown.js没有被scripts.php中的函数压缩和缓存。我用firebug工具检查了一下,在scripts.php的响应头中,两个文件都不包括在最终压缩的js文件中。

我压缩这些js文件(wmd&摊牌)并将其合并为一个文件的过程有什么问题?示例站点

js/scripts.php-负责压缩和缓存js文件

<?php
error_reporting(E_ERROR);
// see http://web.archive.org/web/20071211140719/http://www.w3.org/2005/MWI/BPWG/techs/CachingWithPhp
// $lastModifiedDate must be a GMT Unix Timestamp
// You can use gmmktime(...) to get such a timestamp
// getlastmod() also provides this kind of timestamp for the last
// modification date of the PHP file itself
function cacheHeaders($lastModifiedDate) {
    if ($lastModifiedDate) {
        if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lastModifiedDate) {
            if (php_sapi_name()=='CGI') {
                Header("Status: 304 Not Modified");
            } else {
                Header("HTTP/1.0 304 Not Modified");
            }
            exit;
        } else {
            $gmtDate = gmdate("D, d M Y H:i:s 'G'M'T",$lastModifiedDate);
            header('Last-Modified: '.$gmtDate);
        }
    }
}
// This function uses a static variable to track the most recent
// last modification time
function lastModificationTime($time=0) {
    static $last_mod ;
    if (!isset($last_mod) || $time > $last_mod) {
        $last_mod = $time ;
    }
    return $last_mod ;
}
lastModificationTime(filemtime(__FILE__));
cacheHeaders(lastModificationTime());
header("Content-type: text/javascript; charset: UTF-8");
ob_start ("ob_gzhandler");
foreach (explode(",", $_GET['load']) as $value) {
    if (is_file("$value.js")) {
        $real_path = mb_strtolower(realpath("$value.js"));
        if (strpos($real_path, mb_strtolower(dirname(__FILE__))) !== false || strpos($real_path, mb_strtolower(dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR.'modules'.DIRECTORY_SEPARATOR)) !== false) {
            lastModificationTime(filemtime("$value.js"));
            include("$value.js");echo "'n";
        } 
    }
}
?>

我调用压缩.js的方式

<script type = "text/javascript" src = "js/scripts.php?build=12345&load=wmd,showdown"></script>

我想问题出在语句include("$value.js");echo "'n";
这样,如果包含的javascript文件至少包含一个"<?"字符串,并且您在"php.ini"配置文件中启用了"short_open_tag"选项,则从php解释器解析部分javascript代码,就好像它是php代码一样,可能会引发语法错误,从而忽略后续的include
看看我看到的"prettify.js"源代码,它有效地显示了第471行的"<?"字符串。也许将线路include("$value.js");echo "'n";改为readfile("$value.js");echo "'n";应该可以解决这个问题。

由于这是在问题的注释中请求的,下面是对问题代码的一些注释

函数cacheHeaders

使用CCD_ 9的第三个参数或函数CCD_。我强烈建议后者,因为即使使用第三个参数,header()也存在一些问题。关于4.3<=的http_response_code函数,请参见此答案PHP<=5.4和/或更多信息。

还要注意,date的格式代码r根据RFC 2822格式化日期,包括正确的时区(而不是强制为GMT)(在此处查找)

你的代码所在的页面至少有5年的历史了,即使在那时也可能是为了兼容性而写的(PHP3!天哪…!),这并不是真的错,但现在是时候继续前进了。与最初用于其他用途的功能的不良记录(或根本没有记录)相比,专用功能提供了更好的标准遵从性和向上兼容性。

输出缓冲区和HEAD请求

处理HEAD请求时,HTTP服务器必须将该请求视为GET请求进行处理,但不得返回消息正文。这是公认标准的一部分,没有办法。因此,当使用HEAD请求执行脚本时,PHP或web服务器(或者两者都有,我真的不知道)会在发送完所有标头后立即中止脚本(或者换句话说,当你试图输出一些东西时)。

然而,现在当您使用用户空间输出缓冲时,如ob_gzhandler,标头可能要到执行结束才能发送。当然,这仍然可以通过减少连接数量来减少客户端加载时间,但并没有减少服务器负载,或者说引入了无用的服务器负载,客户端仍然必须等到脚本完成,也就是最终发送头的时候。

因此,方法是在所有标头都准备好并设置好之后立即"手动"退出脚本。

// setup, header generation, etc.
if($_SERVER['REQUEST_METHOD'] == 'HEAD')
    exit();
ob_start('ob_gzhandler');
// more pretty code, includes and whatnot

如果不使用输出缓冲区,那么此时还可以将flush()与一些输出一起使用。然而(根据php手册)win32版本的apache/php在调用flush()时实际上并没有刷新缓冲区,这使得上面的代码仍然是最好的方法。