2017-11-14 17 views
5

私は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のその結果:

ipcs -m result

タスクが数ヶ月のために実行されているが、前にこれをやって起動するので、この問題を回避するための1つの方法は、私は、コマンド

ipcrm --all=shm 

と、すべての共有メモリ識別子を削除しかし、私はそれは静かに成長していると思うし、確かにそれは、Agを起きようain。

どうすればいいですか?

+0

すべてのプロセスが 'shm_detach'と' shm_remove'を持つ行に行き、これらの行の前にクラッシュしたり終了したりすることはありませんか? –

答えて

1

私は、プロセスがオブジェクトが作成され、プロセスのメモリ内で破壊されていないためにメモリがリークしている可能性があると思います。これを分析する1つの方法は、プロセスのメモリー使用量とどの問題が発生しているかを確認し、メモリーの作成とリークを再現できる場合は、作成されたオブジェクトを削除します。これは、他の要素の中に開いたままのカーソルのために起こっている可能性があります。 非同期PHPタスクにRabbitMQを使用することを検討しましたか?

+0

RabbitMQを使用すると、非同期タスクの方が優れたソリューションになる可能性がありますが、アプリケーションインフラストラクチャに新しいサービスが必要です。私はそれが解決策に合っているかどうかを知るために少しGoogleにします。 しかし、添付されたメモリに関する主な質問には答えません。 – LeonanCarvalho

+0

質問を編集して、最終的にどのように解決したのか、質問の下でお知らせください。 –

関連する問題