Quando tento arquivos GZIP js usando PHP eu recebo algum tipo de erro relacionados php
-
03-07-2019 - |
Pergunta
Ok, então eu pesquisei um par de páginas e chegar com a seguinte solução:
Adicione isso no .htaccess#Active GZIP for php-files
php_flag zlib.output_compression On
php_value zlib.output_compression_level 5
e isso para js e CSS:
AddHandler application/x-httpd-php .css .js
php_value auto_prepend_file /Library/WebServer/Documents/blog/code/Helpers/ContentHeader.php
Qual será executado js bem como .css como scripts PHP. A segunda linha inclui a seguinte página:
<?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");
}
?>
O que vai enviar cabeçalho "text / css" para arquivos .css e "text / javascript" para arquivos javascript. Por enquanto, tudo bem. O problema, porém, é com um par de javascripts minified que eu uso eu recebo algum tipo de erro 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 />
ou:
<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 />
Assim, há alguma maneira melhor de fazer isso? A única opção que eu posso vir acima com é ir manualmente para os arquivos .javascript e "corrigir os erros" que php não gosta. Mas não deveria ser uma solução mais fácil?
Solução
A razão que você está recebendo este erro é que os scripts contêm <?
.
Por exemplo, em prettify.js é esta:
/^[^<?]+/
Você está passando isso em PHP, assim que inicia o motor de PHP vai novamente e vê uma ]
inesperado.
Eu iria com o método de @ jonstjohn, ou @ cletus de se precisar de mais controle.
Outras dicas
Apache mod_deflate e usar a configuração de exemplo mostrado lá . Funciona muito bem sem mexer no PHP.
Na verdade, eu servir meus arquivos JS a partir de um script PHP. Não por causa deste problema, mas para que eu possa controlar o cabeçalho e cache expira. O modelo geral é:
- A URL é algo como /script/blah.1234567890.js;
- Essa URL é gerada a partir do mtime do arquivo blah.js;
- Essa URL é enviado a um script js.php através de uma regra de reescrita no .htaccess;
- O script do mtime passaram em Se a sua mais recente que o mtime da versão em cache gera uma nova versão em cache de todos os meus arquivos JS (que são agrupadas em um único arquivo e, em seguida, minified com JSMin);.
- Se o mtime não é mais recente que o roteiro, a versão em cache é simplesmente servido;
- Em todos os casos, o conteúdo é definido para expirar daqui a um ano.
O timestamp na URL permite atualizar o arquivo de script.
Agora, como isso se relaciona com gzipping? Simples. No topo do meu script js.php é:
ob_start("ob_gzhandler")
que gira em torno de compressão gzip se os suportes IT Client (bem como usando o buffer de saída).
Ele funciona realmente.
Tente e limitar-se a exatamente um JS e um arquivo CSS. Combiná-los se necessário. Eu faço o mesmo truque com arquivos CSS também (não minification é claro).
A vantagem desta solução é que só depende de ser mod_rewrite habilitado. Nenhuma outra extensão é necessária (ob_gzhandler é uma parte padrão do PHP). Além disso, um script é necessário combinar os arquivos (a menos que você fazer isso como parte de um processo de construção, mas eu acho isso um pouco mais tedioso).