Intereting Posts

Zend_Cache: после загрузки кэшированных данных кодировка символов кажется испорченной

Первый; На моем сервере разработки (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 из строки. Это удалено!