pcntl_fork ve sonra pcntl_exec veya pcntl_exec ve daha sonra pcntl_fork

0 Cevap php

Explanation: Part of the app that I'm creating requires checking of thousands of records and acting on them in a timely manner. So for every record, I want to fork a new process. However, I need a DB connection to do some more checking of that record. As I understand it, the child inherits the DB connection. So subsequent forks have DB errors.

Ben ('php / yol / script.php') pcntl_exec düşündüm; ve sonra pcntl_fork çağıran süreç kaldırdı değil ki.

Yoksa pcntl_fork ve ardından alt süreçte pcntl_exec olabilir. Veya belki de exec () yerine pcntl_exec of () kullanılarak yapılmalıdır.

My question: ya sipariş için herhangi bir sakıncaları ya da avantajları var mı?

Notes: Maybe I'm imagining this issue, as I thought that the calling php process would wait for pcntl_exec to return. But that's not what the docs state:

Hata durumunda FALSE döner ve başarı dönmez.

Nasıl bir fonksiyon bazen bir değer döndürür ve hiçbiri diğer zamanlarda olabilir? Bu kötü yazılmış Docs gibi geliyor.

fahadsadah adlı kullanıcının durumu:

Idam süreci webserver sürecine, kontrol döner biter.

Bu durumda, o zaman çatal gerekiyor.

Edit: code for the confused - including me ;)

<?php

class Process
{

    public function __construct($arg = false)
    {
        if ($arg == "child")
        {
            $this->act();
        }
        else
        {
            $this->run();
        }
    }

    public function run()
    {
        echo "parent before fork:", getmypid(), PHP_EOL;
        $pid = @ pcntl_fork();
        echo $pid, PHP_EOL;

        if ($pid == -1)
        {
            throw new Exception(self::COULD_NOT_FORK);
        }
        if ($pid)
        {
        // parent
            echo "parent after fork:", getmypid(), PHP_EOL;
        }
        elseif ($pid == 0)
        {
        // child
            echo "child after fork:", getmypid(), PHP_EOL;
            //echo exec('php Process.php child');
            echo pcntl_exec('/usr/bin/php', array('Process.php', 'child'));
        }
        return 0;
    }

    private function act()
    {
        sleep(1);
        echo "forked child new process:", getmypid(), PHP_EOL;
        return 0;
    }
}

$proc = new Process($argv[1]);

Eğer exec yorumsuz ve pcntl_exec yorum ise, bu pcntl_exec süreci yerini göreceksiniz. Ben tahmin ediyorum ki bazı kaynaklar kaydeder.

0 Cevap