@artzwinger

Возможно ли пересечение памяти в форках PCNTL PHP?

Есть PHP демон который запускает в форках Magento для печати PDF (кастомный функционал, который работает нормально при печати вручную из админки).
class Generate_Pdf_Command extends Mage_Shell_Abstract
{
    const SLEEP_TIME_SEC = 0.2;
    const TIME_LIMIT = 600;
    protected $_startTime;
    protected $_childProcessList = [];

    public function __construct()
    {
        $this->_parseArgs();
        $this->_validate();
    }

    public function run()
    {
        $this->_startTime = time();
        while (true) {
            usleep(self::SLEEP_TIME_SEC * 1000);
            $current = time();
            if ($current - $this->_startTime >= self::TIME_LIMIT) {
                exit(0);
            }

            $pid = pcntl_fork();
            if ($pid === -1) {
                $this->_printErr('Can\'t use forks.');
                exit(0);
            }

            if ($pid) {
                $this->_processMain($pid);
                continue;
            }

            $this->_processChild();
            exit(0);
        }
    }

    protected function _processMain($pid)
    {
        $this->_childProcessList[$pid] = true;
        if ($this->_canFork()) {
            return;
        }
        $signPid = pcntl_wait($status);
        if (isset($this->_childProcessList[$signPid])) {
            unset($this->_childProcessList[$signPid]);
        } else {
            $this->_childProcessList = [];
        }
    }

    protected function _processChild()
    {
        try {
            (new Generate_Pdf)->run();
        } catch (Throwable $e) {
            $this->_printErr($e->getMessage());
        }
    }

    protected function _canFork()
    {
        return count($this->_childProcessList) < $this->getArg('children');
    }

    protected function _printLn($msg)
    {
        fwrite(STDOUT, $msg.PHP_EOL);
    }

    protected function _printErr($msg)
    {
        fwrite(STDERR, $msg.PHP_EOL);
    }
}

Как видно Magento не запускается в главном процессе, а класс абстрактного шелла используется только для парсинга аргументов. Как это отдебажить? Воспроизводится изредка.
  • Вопрос задан
  • 74 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы