10

私は現在、ページ速度を改善するためにJSファイルの縮小に取り組んでいます。2つを除くほとんどすべてのjsファイルで機能する最も簡単な方法を見つけることができました。問題は、自分のサイトに実装しようとしているwmdエディターのjsファイルにあります。jsファイルは、の関数によって圧縮およびキャッシュされていませwmd.jsん。どちらのファイルの応答ヘッダーも最終的な圧縮されたjsファイルに含まれていないので、firebugツールで確認しました。showdown.jsscripts.phpscripts.php

これらのjsファイル(wmdとshowdown)を圧縮して1つに結合するプロセスの問題は何ですか?サンプルサイト

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";
        } 
    }
}
?>

私がcompressed.jsを呼んでいる方法

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

2 に答える 2

6

問題は次のステートメントだと思います。include("$value.js");echo "\n";
このように、含まれているjavascriptファイルに少なくとも「<? 」文字列が含まれていて、「php.ini」構成ファイルで「 short_open_tag 」オプションを有効にしている場合は、javascriptの一部です。コードはPHPインタープリターからPHPコードであるかのように解析されており、おそらく構文エラーがスローされるため、後続のインクルードは無視されます。
「prettify.js」のソースコードを見ると、「<?」が効果的に存在していることがわかりました。471行目の文字列。問題を解決するために行include("$value.js");echo "\n";を変更する必要があるかもしれません。readfile("$value.js");echo "\n";

于 2012-08-09T19:54:01.127 に答える
1

これは質問のコメントで要求されたので、ここに質問のコードへのいくつかのコメントがあります

働きcacheHeaders

header()この関数は、または関数の3番目のパラメーターを使用することで、より単純で安定したものにすることができますhttp_response_code。3番目のパラメーターを使用しても、いくつかの問題があるため、後者を強くお勧めしheader()ます。4.3 <= PHP <= 5.4の関数および/または詳細については、この回答を参照してください。http_response_code

また、RFC 2822に従って日付をフォーマットするフォーマットコードrがあり、正しいタイムゾーン(GMTに強制されていない)も含まれていることに注意してください(ここで検索してくださいdate

あなたがそのコードを持っているページは少なくとも5年前のものであり、おそらくそれでも互換性のために書かれています(PHP3!Holy ...!)、それは本当に間違っていませんが、次に進む時が来ました。専用の関数は、元々他の目的で作成された関数の動作が文書化されていないか、まったく文書化されていない場合に比べて、標準への準拠と上位の互換性が向上します。

出力バッファ、およびHEADリクエスト

リクエストを処理する場合HEAD、HTTPサーバーはリクエストをリクエストであるかのように処理する必要がありますが、メッセージ本文を返さないようにする必要GETがあります。これは受け入れられている標準の一部であり、回避する方法はありません。したがって、PHPまたはWebサーバーのいずれか(または両方、正直なところわかりません)がリクエストを使用してスクリプトを実行すると、すべてのヘッダーが送信されるとすぐに(つまり、何かを出力しようとすると)スクリプトが中止されます。HEAD

ただし、のようにユーザースペースの出力バッファリングを使用する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()、上記のコードを使用するのが最善の方法です。

于 2012-08-18T22:12:10.003 に答える