0

初め; 私の開発サーバー (localhost; OSX のデフォルト XAMPP) ではすべて正常に動作しますが、まったく同じコード (およびデータ) をステージング サーバー (Redhat で管理された Apache2) にデプロイすると、サーバーが壊れます。

ファイル バックエンドと自動シリアル化を使用して、Zend_Cache を使用して一部のデータをキャッシュしています。元のデータで使用されている特殊文字は正常に表示されますが、キャッシュから読み込まれると文字化けします。

誰でも手がかりを得ましたか?

PS。単なる回避策ではなく、ステージング サーバーで何が「うまくいかない」のかを理解する方法を探しています。何がこれを台無しにする可能性がありますか?

UPDATE キャッシュしているデータは UTF-8 でエンコードされています。

UPDATE 生のキャッシュファイル(シリアル化された配列の)を見ると、大きな違いが1つあります。ステージング サーバーにキャッシュされた (同一の) データに改行が表示される場合、ローカルホストにキャッシュされたデータには改行が表示されません

UPDATE ローカル サーバーの実行PHP 5.3、ステージング サーバーの実行PHP 5.2.10

Zend FW 1.10.8で実行されている更新

4

2 に答える 2

3

私はあなたとほぼ同じ状態を持っています、

開発マシンはwindows+php5.3

開発マシンは Linux + php 5.2.14

ZF のバージョンは 1.10 です

私が持っていた唯一の違いは次のとおりです。以前はmb_internal_encoding("UTF-8");ブートストラップクラスに追加していました

参考までに、データベースからテキスト (アラビア語) をキャッシュしていましたが、ファイルを開くと、アラビア語のテキストが期待どおりに表示されます。

更新 : 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- ICONVまたはMB_STRINGを使用して、PHP 5.3または5.2をUTF8で処理する

使うだけで var_dump(mb_internal_encoding());

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

私は手動でテストしませんでしたが、期待どおりに動作するはずです

役に立ってよかった!

于 2010-10-28T12:50:06.830 に答える
0

LC_LANGやその他の言語変数を確認できますか?あなたの問題は別として:

ホスティングとローカルサーバー(1つのDebian、1つのubuntu)の間で、キャッシュファイルに問題があります。\ rをシリアル化すると問題が発生するときに、問題を発見しました。1つのシステムは\rを節約しますが、カウントを無視します。

したがって、シリアル化する前に、文字列からすべての\rを削除します。それは削除されました!

于 2010-10-28T12:23:52.010 に答える