2010-10-28 48 views
0

首先;在我的開發服務器(localhost; OSX上的默認XAMPP)上,一切正常,但是當我將相同的代碼(和數據)部署到暫存服務器(Redhat上託管的Apache2)時,它會中斷。Zend_Cache:加載高速緩存的數據後,字符編碼似乎搞砸了

我使用Zend_Cache緩存一些數據,使用文件後端和自動序列化。 在原始數據顯示中使用的特殊字符很好,但是當它們從緩存中加載時,它們都會變成亂碼。

任何人都有線索?

PS。而不是只是解決方法,我正在尋找一種方法來了解登臺服務器上可能出現「錯誤」的情況。什麼可能搞砸了?

UPDATE 我正在緩存的數據是UTF-8編碼的。

UPDATE 當在原始緩存文件尋找(序列化數組)在那裏,我見一個很大的區別; 當登臺服務器確實緩存的(相同)數據顯示換行符時,緩存在本地主機上的數據顯示無新行。

UPDATE 本地服務器運行PHP 5.3,分期服務器運行PHP 5.2.10

UPDATE 運行在Zend的FW 1.10.8

+0

運行Zend框架的同一版本兩種環境? – Phil 2010-10-28 11:10:13

+0

是的,所有代碼都是完全一樣的 - 包括使用的任何庫。 (ZF版本; 1.10.8) – Maurice 2010-10-28 11:22:49

回答

3

我幾乎等同的狀態和你一樣,

開發機器是windows + PHP 5.3

開發機就是Linux + PHP 5.2.14

ZF版本是1.10

唯一我曾經的差異是:我曾經在引導類中添加mb_internal_encoding("UTF-8");

僅供參考,我用來緩存t ext(阿拉伯語言)從數據庫所有編碼UTF8 當我打開文件,我看到預期的阿拉伯文本。

UPDATE: 1 - 這裏是我的完整initCache功能只是爲了說清楚

public function _initCache() { 
     mb_internal_encoding("UTF-8"); 
     $frontendOptions = array(
      'automatic_serialization' => TRUE, 
      'lifetime' => 86400 
     ); 
     $backendOptions = array(
      'cache_dir' => APPLICATION_PATH . "/configs/cache/", 
       ///'cache_dir' => sys_get_temp_dir(), 
     ); 
     $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions); 
     Zend_Db_Table_Abstract::setDefaultMetadataCache($cache); 
     Zend_Registry::set("cache", $cache); 
    } 

說明:比PHP 6早些時候 1-任何PHP版本不具備原生支持UTF8, https://stackoverflow.com/questions/716703/what-is-coming-in-php-6

2製作PHP 5.3或5.2處理UTF8通過使用ICONVMB_STRING

只需使用var_dump(mb_internal_encoding());

你可以告訴使用ISO-8859-1內部在PHP,

您可以通過var_dump(mb_internal_encoding("UTF-8"));

它會輸出真(它的成功覆蓋重寫它內部編碼)

說實話我不知道有沒有更好的解決方案或者how bad it is ??,

如果您有任何更好,我會很樂意接受它:)萬一

更新2 你不想使用該功能, 打開此文件"Zend/Cache/Backend/File.php"並轉到線976 更改此設置:

protected function _filePutContents($file, $string) 
{ 

    $result = false; 
    $f = @fopen($file, 'ab+'); 
    if ($f) { 
     if ($this->_options['file_locking']) @flock($f, LOCK_EX); 
     fseek($f, 0); 
     ftruncate($f, 0); 
     $tmp = @fwrite($f, $string); 
     if (!($tmp === FALSE)) { 
      $result = true; 
     } 
     @fclose($f); 
    } 
    @chmod($file, $this->_options['cache_file_umask']); 
    return $result; 
} 

是這樣的:

protected function _filePutContents($file, $string) 
{ 
    $string = mb_convert_encoding($string , "UTF-8" , "ISO-8859-1"); // i didn't test it , use it at your own risk and i'd rather stick with the first solution 
    $result = false; 
    $f = @fopen($file, 'ab+'); 
    if ($f) { 
     if ($this->_options['file_locking']) @flock($f, LOCK_EX); 
     fseek($f, 0); 
     ftruncate($f, 0); 
     $tmp = @fwrite($f, $string); 
     if (!($tmp === FALSE)) { 
      $result = true; 
     } 
     @fclose($f); 
    } 
    @chmod($file, $this->_options['cache_file_umask']); 
    return $result; 
} 

我沒有てST手動,但它應該按預期工作

高興它幫助!

+0

我已經添加mb_internal_encoding臨時服務器上引導的設置和刷新緩存。現在,所有從緩存中加載的數據都不再亂碼了。 奇怪的是,在刪除mb_internal_encoding和刷新緩存後,問題仍然是固定的。 我會拭目以待。無論如何,將它添加到默認引導可能是一個好主意。 – Maurice 2010-10-28 14:38:57

+0

+1好主意......! – Max 2010-10-28 16:18:01

+0

我已經將它添加到默認的bootstrapping類,它似乎在等待。數據中沒有更多的垃圾。 謝謝你的回答! – Maurice 2010-10-29 07:01:21

0

你可以檢查LC_LANG和其他語言的變量? 除了您的問題:

我有問題,我的緩存文件,我的主機和本地服務器(一個Debian的,Ubuntu的一個) 之間我發現了這個問題,序列化\ r時引起的問題。一個系統保存\ r但忽略計數。

所以我在序列化之前,從字符串中刪除所有\ r。刪除!