Первый; На моем сервере разработки (localhost, по умолчанию XAMPP на OSX) все работает отлично, хотя при развертывании того же кода (и данных) на промежуточном сервере (управляемый Apache2 на Redhat) он ломается.
Я кэширую некоторые данные с помощью Zend_Cache с использованием файловой системы и автоматической сериализации. Специальные символы, используемые в исходном представлении данных, хорошо, хотя, когда они загружаются из кеша, все они искажены.
Кто-нибудь понял?
PS. Вместо того, чтобы обходной путь, я ищу способ понять, что может пойти «неправильно» на промежуточном сервере. Что может это испортить?
ОБНОВЛЕНИЕ Кэширование данных, кодируемое UTF-8.
ОБНОВЛЕНИЕ При просмотре необработанных кеш-файлов (сериализованного массива) я вижу одну большую разницу; Данные, кэшированные на моем локальном хосте, не показывают новых строк, когда (идентичные) данные, кэшированные на промежуточном сервере , показывают новые строки.
ОБНОВЛЕНИЕ Локальный сервер запускает PHP 5.3
, на промежуточном сервере работает PHP 5.2.10
ОБНОВЛЕНИЕ Запуск на Zend FW 1.10.8
У меня почти такое же состояние, как вы,
машина разработки – это Windows + php 5.3
машиной разработки Linux + php 5.2.14
Версия ZF – 1.10
Единственное различие, которое у меня было: я использовал для добавления mb_internal_encoding("UTF-8");
в классе начальной загрузки
FYI, я использовал для кэширования текста (арабский язык) из базы данных все кодированные 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); }
Объяснение: 1-Любая версия php раньше, чем PHP 6, не имеет встроенной поддержки UTF-8, https://stackoverflow.com/questions/716703/what-is-coming-in-php-6
2-создание php 5.3 или 5.2 связано с UTF8 с помощью ICONV или MB_STRING
просто используя var_dump(mb_internal_encoding());
вы можете сказать, что php с использованием ISO-8859-1 внутренне,
вы можете переопределить его var_dump(mb_internal_encoding("UTF-8"));
он будет выдавать true (это означает, что он отменяет внутреннюю кодировку)
Честно говоря, я не знаю, есть ли лучшее решение или как это плохо? ,
если бы у вас было лучше, я был бы рад принять его 🙂
UPDATE 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; }
я не тестировал вручную, но он должен работать как ожидалось
Рад, что это помогло!
Можете ли вы проверить LC_LANG и другие языковые переменные? Помимо вашей проблемы:
У меня проблемы с файлами кеша, между моим хостингом и локальным сервером (один debian, один ubuntu). Я обнаружил проблему, когда сериализация \ r вызывает проблему. Одна система сохраняет \ r, но игнорирует подсчет.
Поэтому я перед сериализацией удаляю все \ r из строки. Это удалено!