PHP를 사용하여 .js 파일을 gzip하려고 할 때 어떤 종류의 PHP 관련 오류가 발생합니다.

StackOverflow https://stackoverflow.com/questions/612628

문제

좋아, 그래서 나는 두 페이지를 봤고 다음 솔루션을 생각해 냈습니다.

.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

PHP 스크립트로 .css뿐만 아니라 .js를 실행합니다. 두 번째 행에는 다음 페이지가 포함됩니다.

<?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가 좋아하지 않는 "오류를 수정"하는 것입니다. 그러나 더 쉬운 해결책이되어서는 안됩니까?

도움이 되었습니까?

해결책

이 오류를 얻는 이유는 스크립트에 포함되기 때문입니다. <?. 예를 들어, prettify.js는 다음과 같습니다.

/^[^<?]+/

이것을 PHP로 전달하므로 PHP 엔진이 다시 시작되고 예상치 못한 것을 볼 수 있습니다. ].

나는 @jonstjohn의 방법 또는 @cletus 's를 더 많이 제어해야한다면 갈 것입니다.

다른 팁

우리는 사용 Apache mod_deflate 표시된 예제 구성을 사용하십시오. PHP에서 해킹하지 않고 잘 작동합니다.

실제로 PHP 스크립트에서 JS 파일을 제공합니다. 이 문제 때문에가 아니라 만료 헤더와 캐싱을 제어 할 수 있습니다. 일반 모델은 다음과 같습니다.

  • URL은 /script/blah.1234567890.js와 같은 것입니다.
  • 해당 URL은 blah.js 파일의 mtime에서 생성됩니다.
  • 해당 URL은 .htaccess의 다시 쓰기 규칙을 통해 js.php 스크립트로 전송됩니다.
  • 스크립트는 MTIME을 통과 한 것을 확인합니다. 캐시 된 버전의 MTIME보다 새롭면 모든 JS 파일에서 새 캐시 된 버전을 생성합니다 (단일 파일로 수집 한 다음 JSMIN으로 조정).
  • MTIME이 스크립트보다 새롭지 않은 경우 캐시 된 버전은 간단하게 제공됩니다.
  • 모든 경우에 컨텐츠는 1 년 후에 만료되도록 설정됩니다.

URL의 타임 스탬프를 사용하면 스크립트 파일을 새로 고칠 수 있습니다.

이제 이것은 Gziping과 어떤 관련이 있습니까? 단순한. 내 js.php 스크립트의 상단은 다음과 같습니다.

ob_start("ob_gzhandler")

클라이언트가 지원하는 경우 (출력 버퍼링을 사용하는 경우) GZIP 압축이 켜집니다.

정말 잘 작동합니다.

정확히 하나의 JS와 하나의 CSS 파일로 자신을 제한하십시오. 필요한 경우 결합하십시오. 나는 CSS 파일도 같은 트릭을 수행합니다 (물론 미니는 없음).

이 솔루션의 장점은 Mod_rewrite가 활성화되는 것만 의존한다는 것입니다. 다른 확장이 필요하지 않습니다 (OB_GZHANDLER는 PHP의 표준 부분입니다). 또한 파일을 결합하려면 스크립트가 필요합니다 (빌드 프로세스의 일부로 그렇게하지 않는 한 조금 더 지루하다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top