如何在PHP中的两个进程之间正确分离和删除共享内存?

Leo*_*lho 5 php multithreading asynchronous pthreads shared-memory

我开发了一种使用PHP进行异步任务的方法,它一直运行良好,直到现在.

该逻辑基于3个扩展 PCNTL,POSIXSemaphore.

要完全控制主进程和子进程,我必须共享任务的状态和它们之间的PID.这两个变量使用shm_attach共享 ,fork使用pcntl_fork.

此问题标题中描述的问题与任务的状态和它们之间的PID有关.使用shm_attach 方法共享这两个变量, 因为没有更多可用空间可共享创建共享内存.

我用了2个时间:在构造函数中创建共享内存

<?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 Code Online (Sandbox Code Playgroud)

并且在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);
Run Code Online (Sandbox Code Playgroud)

注意:代码有点广泛,我把它放入一个要点 https://gist.github.com/LeonanCarvalho/62c6fe0b62db8a478f502f84c5734c83

我认为我做错了,因为即使我正在使用shm_detachshm_remove,该过程有时也会返回错误PHP警告:"shm_attach"因关键错误设备当我尝试连接新的共享内存时没有空间.

这是因为某些共享内存已分离而未从共享内存段中删除,这是命令的结果ipcs -m:

ipcs -m结果

在开始执行此操作之前,任务正在运行数月,因此解决此问题的一种方法是使用该命令删除所有共享内存标识符

ipcrm --all=shm
Run Code Online (Sandbox Code Playgroud)

但我认为它正在悄然增长,并且肯定会再次发生.

怎么预防呢?

Fel*_*des 1

我认为该进程可能会由于在进程内存中创建而不是销毁对象而泄漏内存。分析此问题的一种方法是检查进程的内存使用情况以及正在发送哪些查询,这可能会导致此问题,如果您可以重现内存的创建和泄漏,那么应该可以找到一种方法删除创建的对象。发生这种情况可能是由于光标保持打开状态等因素造成的。您是否考虑过使用 RabbitMQ 来执行异步 PHP 任务?