@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 не запускается в главном процессе, а класс абстрактного шелла используется только для парсинга аргументов. Как это отдебажить? Воспроизводится изредка.
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Aristos Москва
от 105 000 до 128 000 руб.
IMAGINWEB Москва
от 55 000 до 85 000 руб.
27 июн. 2019, в 01:26
50000 руб./за проект
27 июн. 2019, в 00:27
250000 руб./за проект