PHPを使用して.jsファイルをGZIPしようとすると、何らかの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スクリプトとして実行します。 2行目には、次のページが含まれます。
<?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");
}
?>
ヘッダー<!> quot; text / css <!> quotを送信します。 .cssファイルと<!> quot; text / javascript <!> quot; 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ファイルにアクセスし、<!> quot;エラーを修正する<!> quot;そのphpは気に入らない。しかし、それは簡単な解決策ではありませんか?
解決
このエラーが発生する理由は、スクリプトに<?
が含まれているためです。
たとえば、prettify.jsでは次のようになります。
/^[^<?]+/
これをPHPに渡しているため、PHPエンジンが再び起動し、予期しない]
が表示されます。
@jonstjohnのメソッド、またはさらに制御が必要な場合は@cletusのメソッドを使用します。
他のヒント
Apache Mod_Deflate を使用し、そこに示されている設定例を使用します。 。 PHPでハッキングしなくても問題なく動作します。
実際には、PHPスクリプトからJSファイルを提供しています。この問題が原因ではなく、expiresヘッダーとキャッシュを制御できます。一般的なモデルは次のとおりです。
- URLは/script/blah.1234567890.jsのようなものです
- そのURLはblah.jsファイルのmtimeから生成されます。
- そのURLは、.htaccessの書き換えルールを介してjs.phpスクリプトに送信されます。
- スクリプトは、渡されたmtimeをチェックします。キャッシュバージョンのmtimeよりも新しい場合、すべてのJSファイル(単一ファイルに照合されてからJSMinで縮小された)から新しいキャッシュバージョンを生成します。
- mtimeがスクリプトよりも新しいものではない場合、キャッシュされたバージョンが提供されます;
- すべての場合において、コンテンツは今から1年後に期限切れになるように設定されています。
URLのタイムスタンプにより、スクリプトファイルを更新できます。
今、これはgzipにどのように関係していますか?シンプル。私のjs.phpスクリプトの一番上にあるのは:
ob_start("ob_gzhandler")
クライアントがサポートしている場合、gzip圧縮を有効にします(出力バッファリングを使用します)。
これは本当に効果的です。
試してみて、JSファイルとCSSファイルを1つだけに制限してください。必要に応じてそれらを組み合わせます。 CSSファイルでも同じトリックを行います(もちろん縮小化はしません)。
このソリューションの利点は、mod_rewriteの有効化のみに依存していることです。他の拡張機能は必要ありません(ob_gzhandlerはPHPの標準部分です)。さらに、ファイルを結合するにはスクリプトが必要です(ビルドプロセスの一部としてそれを行う場合を除き、これはもう少し面倒だと思います)。