필자는 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_detach 및 shm_remove을 사용하고 있지만 : "함수는 shm_attach"내가 연결하려고 할 때에서 장치에 남아있는 키 없음 공간 실패를 새로운 공유 메모리.
일부 공유 메모리를 분리 및 공유 메모리 세그먼트에서 제거되지 않습니다 때문에 일어나고명령 ipcs -m
의 그것의 결과 :
하는 작업 개월 동안 실행 전에이 일을 시작하기 때문에, 이 문제를 해결하는 한 가지 방법은 내가 명령
ipcrm --all=shm
모든 공유 메모리 식별자를 제거하지만 나는 그것이 자동으로 성장하고 생각하고 확실히 그것은 AG에 무슨 일이 일어날 아인.
어떻게 막으시겠습니까?
모든 프로세스가'shm_detach' 및'shm_remove'가있는 행까지 올라가고이 행들 이전에 충돌하거나 종료하지 않았습니까? –