php - pasa - si borro el cache de whatsapp se borran las conversaciones
Zend_Cache: después de cargar datos en caché, la codificación de caracteres parece enredada (2)
¿Puedes verificar LC_LANG y otras variables de lenguaje? Aparte de tu problema:
Tengo un problema con mis archivos de caché, entre mi servidor de hosting y local (uno de Debian, uno de Ubuntu). Descubrí el problema, cuando la serialización causa problemas. Un sistema guarda / r pero ignora el conteo.
Entonces, antes de serializar, eliminar todo / r de la cadena. Eso eliminado!
Primero; En mi servidor de desarrollo (localhost, XAMPP predeterminado en OSX) todo funciona bien, aunque cuando despliego exactamente el mismo código (y datos) en el servidor de transferencia (Apache2 administrado en Redhat) se rompe.
Estoy almacenando en caché algunos datos usando Zend_Cache usando el back-end de archivo y la serialización automática. Los caracteres especiales utilizados en los datos originales se muestran bien, aunque cuando se cargan desde la memoria caché se confunden.
Alguien tiene una pista?
PD. En lugar de solo una solución alternativa, estoy buscando una forma de entender qué podría salir "mal" en el servidor de transferencia. ¿Qué podría estropear esto?
ACTUALIZAR Los datos que estoy almacenando en la memoria caché están codificados en UTF-8.
ACTUALIZACIÓN Cuando miro los archivos de caché sin procesar (de una matriz serializada) veo una gran diferencia; Los datos almacenados en caché en mi servidor local no muestran líneas nuevas cuando los datos (idénticos) almacenados en caché en el servidor de transición muestran líneas nuevas.
ACTUALIZACIÓN El servidor local ejecuta PHP 5.3
, el servidor de PHP 5.2.10
ejecuta PHP 5.2.10
ACTUALIZACIÓN Ejecución en Zend FW 1.10.8
Tengo un estado casi idéntico al tuyo,
máquina de desarrollo es windows + php 5.3
la máquina de desarrollo es Linux + php 5.2.14
La versión de ZF es 1.10
la única diferencia que tuve fue: solía agregar mb_internal_encoding("UTF-8");
en la clase de arranque
FYI, solía guardar el texto en caché (idioma árabe) de la base de datos codificada UTF8 cuando abro el archivo veo el texto árabe como se esperaba.
ACTUALIZACIÓN : 1- Aquí está mi función completa de inicio de página para dejarlo en claro
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);
}
Explicación: 1-Cualquier versión de PHP anterior a PHP 6 no tiene soporte nativo para UTF-8, https://.com/questions/716703/what-is-coming-in-php-6
2-making php 5.3 o 5.2 tratan con UTF8 usando ICONV o MB_STRING
simplemente usando var_dump(mb_internal_encoding());
puedes decir que php usando ISO-8859-1 internamente,
puede anularlo mediante var_dump(mb_internal_encoding("UTF-8"));
daría salida verdadero (éxito para anular la codificación interna)
para ser sincero, no sé si hay una mejor solución o qué tan malo es? ,
si tuvieras algo mejor, me encantaría adoptarlo :)
ACTUALIZA 2 en caso de que no quieras usar esa función, abre este archivo "Zend/Cache/Backend/File.php"
y ve a la línea 976 cambia esto:
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;
}
para ser esto:
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;
}
No probé manualmente pero debería funcionar como se esperaba
Me alegro de que ayudó!