私はPHPで非同期タスクを作成する方法を開発しましたが、今まではうまくいきました。PHPで2つのプロセス間で共有メモリを正しく切り離して削除するにはどうすればいいですか?
3つの拡張子に基づくロジックPCNTL,POSIXe Semaphore。
マスタプロセスと子プロセスを完全に制御するには、タスクのステータスとそれらの間のPIDを共有する必要があります。これらの2つの変数はshm_attachを使用して共有され、フォークはpcntl_forkを使用します。
この質問のタイトルに記載されている問題は、タスクの状態とそれらの間のPIDに関連しています。これらの2つの変数は、shared memoryを作成するための共有スペースがないため、shm_attachメソッドを使用して共有されます。共有メモリ
<?php
//...
final public function __construct() {
self::$shmId = shm_attach((int) (ftok(self::$file, 'A') . self::$line), self::SHARED_MEMORY_SIZE);
$this->var_key_pid = $this->alocatesharedMemory(getmypid(), 112112105100); //112112105100;
$this->var_key_status = $this->alocatesharedMemory('PENDING', 11511697116117115); //11511697116117115;
}
を作成するためにコンストラクタで そしてrun
法上の
<?php
final public function run($parameters) {
//...
} else { //Frok process
ignore_user_abort(); //I dont know why but must be set again.
$sid = posix_setsid();
self::$shmId = shm_attach((int) (ftok(self::$file, 'A') . self::$line), self::SHARED_MEMORY_SIZE);
NOTEプロセスをフォーク後:
私は2つの瞬間のためにそれを使用するコードがあります少し広範にして、それを要点に入れました。 https://gist.github.com/LeonanCarvalho/62c6fe0b62db8a478f502f84c5734c83
私はプロセスが時々エラーPHPの警告を返し、私はshm_detachを使用しているにもかかわらず、ので、私は何か間違ったことをやっていると思うとshm_remove:私は添付しようとすると、「shm_attachは、」キーのにデバイス上に残されたスペースを失敗しました新しい共有メモリ。
いくつかの共有メモリを取り外して、共有メモリ・セグメントから削除されませんので、それが起こっている、コマンドipcs -m
のその結果:
タスクが数ヶ月のために実行されているが、前にこれをやって起動するので、この問題を回避するための1つの方法は、私は、コマンド
ipcrm --all=shm
と、すべての共有メモリ識別子を削除しかし、私はそれは静かに成長していると思うし、確かにそれは、Agを起きようain。
どうすればいいですか?
すべてのプロセスが 'shm_detach'と' shm_remove'を持つ行に行き、これらの行の前にクラッシュしたり終了したりすることはありませんか? –