2010-10-28 3 views
0

D'abord; Sur mon serveur de développement (localhost, par défaut XAMPP sur OSX), tout fonctionne bien, mais quand je déploie exactement le même code (et les mêmes données) sur le serveur de transfert (géré par Apache2 sur Redhat), il se casse.Zend_Cache: Après le chargement des données mises en cache, l'encodage des caractères semble foiré

Je cache certaines données en utilisant Zend_Cache en utilisant le backend File et l'auto-sérialisation. Les caractères spéciaux utilisés dans l'affichage des données d'origine sont corrects, mais lorsqu'ils sont chargés depuis le cache, ils sont tous tronqués.

Quelqu'un a-t-il une idée?

PS. Au lieu de juste une solution de contournement, je suis à la recherche d'un moyen de comprendre ce qui pourrait aller "mal" sur le serveur de transfert. Qu'est-ce qui pourrait gâcher ça?

MISE À JOUR Les données que je mets en cache sont codées en UTF-8.

MISE À JOUR Lorsque vous regardez les fichiers de cache bruts (d'un tableau sérialisé) il y a une grande différence; Les données mises en cache sur mon hôte local ne présentent pas de saut de ligne lorsque les données (identiques) mises en cache sur le serveur de transfert affichent des retours à la ligne.

MISE À JOUR exécute serveur local PHP 5.3, serveur mise en scène fonctionne PHP 5.2.10

MISE À JOUR Fonctionnant sur Zend FW 1.10.8

+0

Les deux environnements exécutent-ils la même version de Zend Framework? – Phil

+0

oui, tout le code est exactement le même - y compris les bibliothèques utilisées. (Version ZF; 1.10.8) – Maurice

Répondre

3

J'ai presque état identique comme vous,

machine de développement

est windows + php 5.3

machine de développement

est Linux + PHP 5.2.14

Version ZF est 1.10

le seul différence que j'avais était: je l'habitude d'ajouter mb_internal_encoding("UTF-8"); dans la classe bootstrap

FYI, je l'habitude de cache t ext (langue arabe) de la base de données tous codés UTF8 quand j'ouvre le fichier je vois le texte arabe comme prévu.

MISE À JOUR: 1 ici est ma fonction complète initCache juste pour préciser

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); 
    } 

Explication: 1 Toute version php plus tôt que PHP 6 ne pas prise en charge native UTF8, https://stackoverflow.com/questions/716703/what-is-coming-in-php-6

2-faire php 5.3 ou 5.2 accord avec UTF8 en utilisant ICONV ou MB_STRING

simplement en utilisant var_dump(mb_internal_encoding());

vous pouvez dire que PHP en utilisant ISO-8859-1 interne,

vous pouvez la remplacer par var_dump(mb_internal_encoding("UTF-8"));

il serait sortie vrai (il succès à la dérogation l'encodage interne)

pour être honnête je ne sais pas s'il y a une meilleure solution ou how bad it is ??,

si vous aviez mieux je serais heureux de l'adopter :)

MISE À JOUR 2 dans le cas où vous ne voulez pas utiliser cette fonction, ouvrir ce fichier "Zend/Cache/Backend/File.php" et aller à la ligne 976 changer ceci:

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; 
} 

être le suivant:

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; 
} 

je ne l'ai pas Té st manuellement, mais il devrait fonctionner comme prévu

Glad it helps!

+0

J'ai ajouté le paramètre de mb_internal_encoding au bootstrap sur le serveur de transfert et j'ai vidé le cache. Maintenant, toutes les données chargées depuis le cache ne sont plus déformées. La chose étrange est, après avoir supprimé mb_internal_encoding et vider à nouveau le cache, le problème est toujours résolu. Je vais attendre et voir si ça résiste. Peut-être serait-il une bonne idée de l'ajouter au bootstrap par défaut de toute façon. – Maurice

+0

+1 bonne idée ...! – Max

+0

Je l'ai ajouté à la classe d'amorçage par défaut et il semble être en attente. Plus de garbles dans les données. Merci pour votre réponse! – Maurice

0

Pouvez-vous vérifier LC_LANG et d'autres variables linguistiques? En dehors de votre problème:

J'ai problème avec mes fichiers cache, entre mon hébergement et le serveur local (un debian, ubuntu un) j'ai découvert le problème, lors de la sérialisation \ r causes des problèmes. Un système enregistre mais ignore le comptage.

Donc, avant la sérialisation, retirez tout de la chaîne. Cela a été enlevé!

Questions connexes