【发布时间】:2018-04-27 11:56:29
【问题描述】:
我开发了一种使用 PHP 制作异步任务的方法,并且到目前为止它运行良好。
基于PCNTL、POSIX和Semaphore三个扩展的逻辑。
要完全控制主进程和子进程,我必须在它们之间共享任务的状态和 PID。这2个变量使用shm_attach共享,fork使用pcntl_fork。
本题题目描述的问题与任务的状态和它们之间的PID有关。这 2 个变量使用 shm_attach 方法共享,因为没有更多空间可用于共享创建 shared memory。
我用了 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;
}
在 fork 进程后的 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
我认为我做错了什么,因为即使我使用shm_detach 和shm_remove,进程有时也会返回错误 当我尝试附加新的共享内存时。
这是因为一些共享内存被分离而不是从共享内存段中删除,这是命令ipcs -m 的结果:
这些任务在开始执行此操作之前已经运行了几个月,因此解决此问题的一种方法是使用命令删除所有共享内存标识符
ipcrm --all=shm
但我认为它正在悄然成长,并且肯定会再次发生。
如何预防?
【问题讨论】:
-
您确定所有进程都运行到具有
shm_detach和shm_remove的行并且它们不会在这些行之前崩溃或退出吗?
标签: php multithreading asynchronous pthreads shared-memory