6

new_columnMySQLproduction サーバーの MyISAM テーブルにを追加しました。

/app/tmp/models フォルダーから適切なモデル キャッシュ ファイルを削除しました。

ページを再読み込みして検査すると、モデル用に新しく生成されたキャッシュ ファイルに新しい列が含まれます

fields => null で読み取った場合、新しい列は SQL クエリまたは結果に表示されません。

debug($this->read(null, $id));
  //Query generates fields: SELECT Model.column_a, Model.column_b, Model.id WHERE ...
  //Results do not include the new column

debug($this->read(array('new_column'), $id));
  //Query generates fields: SELECT Model.new_column, Model.id WHERE ...
  //Results include the new column and id

考えられる注意事項と追加情報:

  • テーブルには 39 列あります(なぜこれが問題になるのでしょうか?)
  • モデルはプラグインの EXTENDED クラスです
  • 新しい列の定義は TEXT DEFAULT null です
  • テーブルに対する以前の更新により、期待どおりの結果が得られました
  • アプリのローカル開発レプリカにはこの問題はありません
  • テスト コントローラー アクションは、Configure::write(debug => 2) を有効にします。
  • CakePHP 2.3.6、PHP 5.4.19、MySQL 5.1.70

モデルに新しいテーブル定義を認識させる方法は? 他に調査すべきキャッシュ システムはありますか?


編集#1:

debug($this->ModelName->getDataSource()->describe('table_name'));
// outputs all columns
// ...
'new_column' => array(
    'type' => 'text',
    'null' => true,
    'default' => null,
    'length' => null,
    'collate' => 'utf8_general_ci',
    'charset' => 'utf8'
)

編集#2:

キャッシュを完全に無効にしてみました。モデルは新しい列を取り上げますが、それは実際には解決策ではありません。

Configure::write('Cache.disable', true);
// new_column appears in both query and results

編集#3:

さらにデバッグすると、これら 2 つの結果の間に矛盾があることがわかります。

$this->ModelName->getDataSource()->fields($this->Model, 'ModelName');
//returns fields without new_colum
array_keys($this->ModelName->schema());
//returns fields with new_column

そして、これは一時的に問題を解決します:

$ds = $this->ModelName->getDataSource();
$ds->cacheMethods = false;
...

DboSource のメソッド キャッシュがこの問題の原因です。ゆっくりと物事の根底にたどり着く.. :D

4

3 に答える 3

8

app/tmp/cache本番環境 (デバッグが 0 に設定されている) のアプリケーションを更新するたびに、すべてのキャッシュ ファイル (ただし、ディレクトリは除く) をクリアする必要があります。

この問題で問題を引き起こした実際のキャッシュはapp/tmp/cache/persistent/_cake_core_method_cache. 私がしたように、しつこい部分にだまされないでください。

詳細については、この素晴らしい回答を参照してください。

于 2013-10-08T00:28:15.193 に答える
0

実際、プラグインを使用すると、ブートストラップ ファイルを追加できます。グローバルブートストラップファイルに次のように入れました:

CakePlugin::load('Myplugin',    array('routes' => true, 'bootstrap' => true));

そして Plugin/Myplugin/Config/bootstrap.php に私は持っています

<?php
Cache::config('_cake_core_', array(
    'engine' => 'File',
    'prefix' => 'cake_core_myplugin_',
    'path' => CACHE . 'persistent' . DS,
    'serialize' => true,
    'duration' => '+7 days',
));
?>

モデルの 1 つに 2 つの列を追加しましたが、同じ問題に直面しました。次に、すべてのモデルと永続キャッシュ ファイルを削除しブートストラップ ファイル内の期間を 1 分に変更しました。最後に、私のモデルは問題なくリロードされました。後で、最初の期間に戻ります。汚いですが、CakePHP がキャッシュを少し台無しにしているようにも見えます。

それが役立つことを願っています

于 2014-05-19T14:38:22.623 に答える
0

これはおそらくデータベース キャッシュ エンジンに関連するものです。この場合、クエリを変更するだけで問題を解決できます (たとえば、「fields」ステートメントを使用してフィールドを削除します)。CakePHP のモデル キャッシュを削除することもできます: これは app/tmp/cache/models にあります。

ハッピーコーディング!

于 2013-10-07T22:57:53.150 に答える