2017-05-03 90 views
2

我使用PHP 7.1,我用下面的僞代碼來生成我的網站:PHP ob_start(「ob_gzhandler」)與ob_clean錯誤

<?php 

    ob_start("ob_gzhandler", 0, PHP_OUTPUT_HANDLER_CLEANABLE); 

    try{   
     echo "<h1>My awesome webpage!</h1>"; 
     ... more code that can throw exceptions... 
     echo "<h2>Welcome to my awesome webpage!</h2>"; 
    }catch(\Throwable $e){ 
     ob_clean(); 
     echo "My awesome webpage crashed :(("; 
    } 

如果沒有異常被拋出,所有作品預期:網站被輸出並壓縮。 You can see the result here

但是,當異常被拋出時,意想不到的事情發生(link to the result):根據需要,只有文本後ob_clean輸出()被髮送到瀏覽器,但它可以在不正確解碼。

這個問題似乎與瀏覽器無法識別壓縮頁面的輸出有關。

深入研究這個問題,看起來,當調用ob_clean時,標題content-encoding不會發送到瀏覽器。爲了證實這一假設,我試圖手動設置該標題,並且一切按預期工作(link)。

<?php 

    ob_start("ob_gzhandler", 0, PHP_OUTPUT_HANDLER_CLEANABLE); 

    try{   
     echo "<h1>My awesome webpage!</h1>"; 
     throw new \Exception("Whops"); 
     echo "<h2>Welcome to my awesome webpage!</h2>"; 
    }catch(\Throwable $e){ 
     ob_clean(); 
     header('content-encoding:gzip'); //Why PHP?... WHYYY?!?!? 
     echo "My awesome webpage crashed :(("; 
    } 

我的問題是這樣的:因爲ob_start(「ob_gzhandler」)並不總是使用gzip壓縮(例如,當瀏覽器不支持的話),我的工作圍繞手動設置標題是不可行。我怎樣才能達到相同的結果,而不使用一些可怕的黑客?

+0

你有沒有報告過這是一個錯誤? – Andrea

+2

「我怎樣才能達到同樣的結果,而不使用一些可怕的黑客?」說實話,如果我在你的鞋子裏,我根本不會使用ob_gzhandler。我會配置你的httpd/proxy來爲你做gzip,而不是試圖用PHP來處理它。 –

+0

@Andrea我不知道這是否是一個錯誤,如果我做錯了 – Spotlight

回答

0

我想了一個quickfix將

if(false!==stripos($_SERVER['HTTP_ACCEPT_ENCODING'] ??'','gzip')){ 
    header('content-encoding:gzip'); //Why PHP?... WHYYY?!?!? 
} 

,或者如果你擔心一(理論)不兼容的壓縮,恰好在名稱gzip

if(in_array('gzip',array_map('strtolower',array_map('trim',explode(',',$_SERVER['HTTP_ACCEPT_ENCODING']??''))),true)) 

仍然感覺的hackish,雖然...