我开发了一种使用
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的结果:
在开始执行此操作之前,任务正在运行数月,因此解决此问题的一种方法是使用该命令删除所有共享内存标识符
ipcrm --all=shm
但我认为它正在悄然成长,并且肯定会再次发生.
怎么预防呢?