Zend configをiniからyamlに変換します。 落とし穴

序文として、私は常にyamlが好きだったと言います。 私はほとんどZend Frameworkで作業していましたが、残念ながらZFは長い間yamlをサポートしていませんでした。 次に、symfonyコンポーネントsfYamlのラッパーである単純なクラスを追加し、プロジェクトでyamlを静かに使用し始めました。



最後に、ZF 1.11.12でZend_Config_Writer_Yamlが追加され、設定をiniからyamlに変換することにしました





考え直すことなく、インターネットで既製のスクリプトを見つけました。 こんな感じでした。



$inputfile = APPLICATION_PATH . '/configs/application.ini'; $outputfile = APPLICATION_PATH. '/configs/application.yml'; $config = new Zend_Config_Ini($inputfile, null, array('allowModifications' => false, 'skipExtends'=> true)); $writer = new Zend_Config_Writer_Yaml(); $writer->write($outputfile, $config, true, true);
      
      





ダックスフント、見た目はシンプルで、ZFクラスのみが使用されており、アマチュアのアクティビティはすでに十分ではありません。 変換しようとしました。 必要なすべてが判明しました。 テストを開始-すべてが機能します。 さて、今度はバトルサーバーで同じことを行います。



しばらくして、mysql一般エラーからエラーを受け取り始めました:1205 Lock wait timeout exceeded; リクエストだけを実行しようとしてロックに遭遇しました。 SHOW PROCESSLISTをよく見ると何も見えません。 問題はInnoDBテーブルのみに関係しており、90-95%がMyISAMを持っていることに注意する必要があります。 これについて少しグーグル-エンジンのinnodbステータスを表示してみてください。 開始されていないスレッドのみが表示されます。 他の要求をブロックする可能性のあるトランザクションは実行されていません。

私は管理者を引っ張ろうとします-管理者から貴重なことを何も学びませんでした。 彼らはインデックスを追加することを提案しました...まあ、eprst。



さて、あなたは何かをしなければなりません。 Gearmanを使い始めたのはそれほど前ではありません。したがって、本質的に悪魔であり、長いつながりを開いている労働者がいます。 彼らに罪を犯し始めました-私は彼らを再起動すると思います。 そして、ロックが助けました。 しかし、その理由はまだ明らかではありません。 各タスクの完了後にプリミティブなコミットを追加しました-すべてが静かに見える。



翌日、石鹸をチェックします-同じ話。 同様のエラーが定期的に発生します。



ここで、何が起こったのかをすでに推測している人に尋ねたいと思います。



朝、マネージャーはクライアントが情報を更新できないと不平を言います。 私はチェックします-本当にリクエストがありますが、データは変わりません。 すぐに昨日の強制COMMITを思い出します。 まあ、地獄は冗談ではありませんが、やってみよう

「%autocommit%」などの変数を表示します。

私はすべてが正しいと思います、同じことは彼らのPHPと...ドラムロールオフです。 (この時点まで、管理者はすべての悪い言葉で管理者を思い出しましたが、それは彼自身に過失がないことが判明しました)



その結果、すべてが装飾的でシンプルであることが判明しました。



ダックスフンド...ええと、これはどうしたらいいのでしょう?結局のところ、うまくいったので、構成を調べて、取るに足らない詳細を見つけます。



resources.multidb.dbname.adapter =“ pdo_mysql”

resources.multidb.dbname.host =“ localhost”

resources.multidb.dbname.username =“ user”

resources.multidb.dbname.password =“ pass”

resources.multidb.dbname.dbname =“ dbname”

resources.multidb.dbname.driver_options.1002 =「名前の設定utf8;」



変換された



リソース: 
   multidb: 
     dbname: 
      アダプター:pdo_mysql
      ホスト:localhost
      ユーザー名:ユーザー
      パスワード:パス
       dbname:dbname
       driver_options: 
         -名前の設定utf8;




ご覧のとおり、1002を変換すると、実際には0になります。さらに、もう少し詳しく見ると、

Zend_Dbで

//このスクリプトの結果によって検出されたPDO定数値:

const ATTR_AUTOCOMMIT = 0;

...



さて、最後に、 機会のヒーロー-Zend_Config_Writer_Yaml

 /** * Service function for encoding YAML * * @param int $indent Current indent level * @param array $data Data to encode * @return string */ protected static function _encodeYaml($indent, $data) { reset($data); $result = ""; $numeric = is_numeric(key($data)); // look here foreach($data as $key => $value) { if(is_array($value)) { $encoded = "\n".self::_encodeYaml($indent+1, $value); } else { $encoded = (string)$value."\n"; } $result .= str_repeat(" ", $indent).($numeric?"- ":"$key: ").$encoded; // and look here } return $result; }
      
      







記事の冒頭で述べたSymfonyComponents / YAML / sfYaml.phpを使用する場合(ZFで便利に使用するために単純なラッパーを作成しました)、それを追加します。

$ writer-> setYamlEncoder(array( 'App_Yaml'、 'dump'));

その後、すべてが正しく変換されます。



友だち、設定に関しては注意してください。



厳密に判断しないでください-ハブの最初の投稿



All Articles