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

我开发了一种使用

PHP进行异步任务的方法,它一直运行良好,直到现在.

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

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

我用了2个时间:

在构造函数中创建共享内存

//...

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;

}

并且在分叉之后运行方法

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: The code is a little extensive and I put it into a gist

07007

我认为我做错了,因为即使我正在使用shm_detach和shm_remove这个过程有时会返回错误PHP警告:“shm_attach”失败因为当我尝试连接新的共享内存时,设备上没有剩余空间.

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

ldMAr.png

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

ipcrm --all=shm

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

怎么预防呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值