首先;在我的开发服务器上(localhost; OSX上的默认XAMPP)一切正常,但是当我将完全相同的代码(和数据)部署到登台服务器(Redhat上的托管Apache2)时,它会中断。
我使用文件后端和自动序列化使用Zend_Cache缓存一些数据。 原始数据中使用的特殊字符显示正常,但是当它们从缓存中加载时,它们都会出现乱码。
任何人都有线索?
PS。而不是只是一种解决方法,我正在寻找一种方法来了解登台服务器上可能出现的“错误”。什么可能弄乱这个?
更新 我正在缓存的数据是UTF-8编码的。
更新 在查看原始缓存文件(序列化数组)时,我看到了一个很大的区别; 当登台服务器上缓存的(相同)数据显示换行符时,我本地主机上缓存的数据不显示换行符。
更新
本地服务器运行PHP 5.3
,登台服务器运行PHP 5.2.10
更新 在Zend FW 1.10.8上运行
答案 0 :(得分:3)
我的状态几乎和你一样,
开发机器是windows + php 5.3
开发机器是Linux + php 5.2.14
ZF版本是1.10
我唯一的区别是:我曾经在引导类
中添加mb_internal_encoding("UTF-8");
仅供参考,我曾经从数据库中缓存文本(阿拉伯语)所有编码的UTF8 当我打开文件时,我按预期看到阿拉伯语文本。
更新: 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);
}
说明: 1-PHP 6之前的任何PHP版本都不支持UTF-8, https://stackoverflow.com/questions/716703/what-is-coming-in-php-6
2-make php 5.3或5.2使用ICONV或MB_STRING处理UTF8
只需使用var_dump(mb_internal_encoding());
你可以在内部使用 ISO-8859-1 告诉php,
您可以按var_dump(mb_internal_encoding("UTF-8"));
它将输出true(成功覆盖内部编码)
老实说,我不知道是否有更好的解决方案或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;
}
我没有手动测试,但它应该按预期工作
很高兴它有所帮助!
答案 1 :(得分:0)
您可以查看LC_LANG和其他语言变量吗? 除了你的问题:
我的缓存文件有问题,我的托管和本地服务器之间(一个debian,一个ubuntu) 当序列化\ r导致问题时,我发现了这个问题。一个系统保存\ r \ n但忽略计数。
所以我在序列化之前,从字符串中删除所有\ r \ n。那删除了!