2017-11-14 18 views
5

필자는 PHP로 비동기 작업을 수행하는 방법을 개발했으며 현재까지는 잘 작동합니다.PHP에서 두 프로세스간에 공유 메모리를 올바르게 분리하고 제거하는 방법은 무엇입니까?

로직은 3 개의 확장자를 기반으로합니다. PCNTL, POSIXe Semaphore.

마스터 프로세스와 하위 프로세스를 완전히 제어하려면 작업 상태와 그 사이의 PID를 공유해야합니다. 이 두 변수는 shm_attach을 사용하여 공유되며 포크는 pcntl_fork을 사용합니다.

이 질문의 제목에 설명 된 문제는 작업 상태와 그 사이의 PID와 관련이 있습니다. 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); 

주 과정을 분기 이후 :

나는이 순간을 위해 그것을 사용하는 코드가있다 약간 광범위하고 나는 그것을 요점에 넣었다. https://gist.github.com/LeonanCarvalho/62c6fe0b62db8a478f502f84c5734c83

,

는 내가 뭔가 잘못하고 있다고 생각하기 때문에 심지어 내가 프로세스가 가끔 오류 PHP 경고를 반환 shm_detachshm_remove을 사용하고 있지만 : "함수는 shm_attach"내가 연결하려고 할 때에서 장치에 남아있는 키 없음 공간 실패를 새로운 공유 메모리.

일부 공유 메모리를 분리 및 공유 메모리 세그먼트에서 제거되지 않습니다 때문에 일어나고

명령 ipcs -m의 그것의 결과 :

ipcs -m result

하는 작업 개월 동안 실행 전에이 일을 시작하기 때문에, 이 문제를 해결하는 한 가지 방법은 내가 명령

ipcrm --all=shm 

모든 공유 메모리 식별자를 제거하지만 나는 그것이 자동으로 성장하고 생각하고 확실히 그것은 AG에 무슨 일이 일어날 아인.

어떻게 막으시겠습니까?

+0

모든 프로세스가'shm_detach' 및'shm_remove'가있는 행까지 올라가고이 행들 이전에 충돌하거나 종료하지 않았습니까? –

답변

1

나는 프로세스가 생성되는 객체로 인해 메모리 누수가있을 수 있으며 프로세스의 메모리 내부에서 파괴되지 않을 것이라고 생각한다. 당신이 이것을 분석 할 수있는 한 가지 방법은 프로세스의 메모리 사용량과 어떤 쿼리가 전송되는지를 검토하는 것입니다.이 문제가 원인 일 수 있습니다. 메모리 생성 및 누출을 재현 할 수 있다면 다음과 같은 방법을 찾아야합니다. 생성 된 개체를 삭제하십시오. 커서가 다른 요인들 사이에서 열려 있기 때문에 이런 일이 발생할 수 있습니다. 비동기 PHP 작업에 RabbitMQ 사용을 고려해 보셨습니까?

+0

RabbitMQ를 사용하면 비동기 작업에 더 나은 솔루션이 될 수 있지만 앱 인프라에 새로운 서비스가 필요합니다. 솔루션에 맞는지 조금이라도 Google에 알려줄 것입니다. 그러나 첨부 된 메모리에 대한 주요 질문에 대답하지 않습니다. – LeonanCarvalho

+0

그럼, 질문을 편집하고 궁금한 점을 어떻게 마침내 해결했는지 알려주십시오. –