【问题标题】:How to properly detach and remove shared memory between 2 processes in PHP?如何在 PHP 中正确分离和删除 2 个进程之间的共享内存?
【发布时间】:2018-04-27 11:56:29
【问题描述】:

我开发了一种使用 PHP 制作异步任务的方法,并且到目前为止它运行良好。

基于PCNTLPOSIXSemaphore三个扩展的逻辑。

要完全控制主进程和子进程,我必须在它们之间共享任务的状态和 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_detachshm_remove,进程有时也会返回错误 当我尝试附加新的共享内存时。

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

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

ipcrm --all=shm

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

如何预防?

【问题讨论】:

  • 您确定所有进程都运行到具有shm_detachshm_remove 的行并且它们不会在这些行之前崩溃或退出吗?

标签: php multithreading asynchronous pthreads shared-memory


【解决方案1】:

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

【讨论】:

  • 使用 RabbitMQ 可能是异步任务的更好解决方案,但它需要为应用程序基础架构提供新服务。我会用谷歌搜索一下,不知道它是否适合解决方案。但它没有回答有关附加内存的主要问题。
  • 那么,您能否在问题下方编辑您的问题并告诉我们您最终是如何解决的?
猜你喜欢
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
相关资源
最近更新 更多