2

並列タスク用の Zend Framework ベースの cron サービスを作成しましたが、子スレッドが親スレッドとリソースを共有するという問題に遭遇しましたデータベース接続の問題は解決しましたがZend_Db_Table_Abstract、テーブルのメタデータをメタデータ キャッシュに保存できないという定期的な問題が発生しています。

メタデータを metadataCache に保存できませんでした

ブートストラップ中にメタデータ キャッシュを初期化します。ブートストラップから自分のコードをコピーして fork してから実行するよりもBootstrap->_init[...]$application->bootstrap('[...]').


アップデート

はシングルトンであるためZend_Controller_Front::getInstance()、それを使用してブートストラップ インスタンスを取得し、その方法で関数を呼び出すと、既に解決済みの共有リソースに関する同じ問題に戻ります。

フォーク後の共有リソースの問題を回避しながら、何とかこの DRY を維持したいと考えています。

4

4 に答える 4

3

Zend_Controller_Frontシングルトンはブートストラップのインスタンスを保持します

$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
$bootstrap->bootstrap('db')
于 2011-06-14T07:45:11.957 に答える
1

Zend_Controller_Front はシングルトンですが、そのコンストラクターは保護されているため、App_Controller_Front というクラスを作成するだけで拡張できます。

その中で、存在をチェックせずにコンストラクターを呼び出すことができる getNewInstance() のメソッドを作成します。このようにして、シングルトンの動作をオーバーライドできます。

于 2011-06-22T06:22:23.227 に答える
0

各子スレッドが構成を読み取り、db メタデータをキャッシュするのはなぜですか? マスター/ワーカー階層を使用します。共通の考え:

$pid = pcntl_fork();

if ($pid == -1) {        
    // Fork failed            
    exit(1); 
} elseif ($pid) { 
    // We are the parent 
    // prepare common data, cache it, etc.
} else { 
    // We are the child 
    // create new db connection, use cached data
    // if there is no data in cache yet - sleep
    exit(0); 
}
于 2011-06-20T20:37:41.137 に答える
0

これらの並列プロセスを pcntl_fork ではなく、crobjob を介して複数回実行するだけで「フォーク」していますね。これは、それらが互いに別のプロセスとして実行されており、共有リソース (およびその後の競合) がシステムリソース (特にファイル) のみであることを意味します。

表示されているエラーは、キャッシュが書き込まれているファイルに関連するさまざまな原因で発生する可能性があります。たとえば、メタデータ ファイルが別のプロセスによってロックされている場合、このエラーが表示されることがあります。この問題は、実行している並列プロセスの数がかなり多くなるまで表示されない可能性があります。

このエラーは、メタデータ キャッシュ ファイルが存在するパーティションのディスク領域が不足している、またはファイルのアクセス許可が正しく設定されていないなど、他の理由でメタデータ キャッシュ ファイルに書き込めない場合にも発生する可能性があります。

おそらく、メタデータ キャッシュをどのように構成したか、およびスクリプトの並列化がどのように機能するかについて、さらに詳しく説明していただけますか。また、実行している Zend Framework のバージョンは何ですか?

于 2011-06-19T23:35:03.547 に答える