php中的子进程执行父进程中创建的类对象的析构函数

php中的子进程执行父进程中创建的类对象的析构函数,php,fork,pcntl,Php,Fork,Pcntl,在下面的代码中。我正在努力理解这种行为 class ForkManager { private $_max_workers = 3; private $_open_processes = 0; private $_tasks = array(); public function setMaxWorkers($num) { $this->_max_workers = $num; } public function

在下面的代码中。我正在努力理解这种行为

class ForkManager 
{
    private $_max_workers = 3;
    private $_open_processes = 0;
    private $_tasks = array();

    public function setMaxWorkers($num)
    {
        $this->_max_workers = $num;
    }

    public function addTask($command)
    {
        $this->_tasks[] = $command;
    }

    public function execute()
    {
        while($this->_tasks) {
            $command = array_shift($this->_tasks);
            $pid = pcntl_fork();
            if(!$pid) {
                /* Execute in child process start */
                echo "$command\n";
                exec($command, $return, $out);
                exit(0);
                /* Execute in child process end */
            } else {
                ++$this->_open_processes;
                //var_dump($this->_open_processes, $this->_max_workers);
                if($this->_open_processes >= $this->_max_workers) {
                    (pcntl_wait($status));
                    --$this->_open_processes;
                }
            }
        }
    }

    public function getOpenProcess()
    {
        return $this->_open_processes;
    }

    public function isAllTaskCompleted()
    {
        return $this->_open_processes;
    }
}


class Scheduler {

    public function __construct() {
        var_dump("Waking up...");
    }

    private function getTasksForCurrentHour() {
        //static for now
        return array(
            'startmusic',
            'logintohris',
            'checkforerrorsemail',
            'startcoffeemachine'
        );
    }

    public function run() {
        $fm = new ForkManager();
        $tasks = $this->getTasksForCurrentHour();
        foreach ($tasks as $key => $task) {
            $fm->addTask('php UnversalWorker.php ' . $task);
        }
        $fm->execute();
    }

    public function __destruct() {
        var_dump("All tasks done... Going to sleep for an hour");
    }
}


$s = new Scheduler();
$s->run();
现在,我认为代码的输出应该是

string(12) "Waking up..."
php UnversalWorker.php startmusic
php UnversalWorker.php logintohris
php UnversalWorker.php checkforerrorsemail
php UnversalWorker.php startcoffeemachine
string(44) "All tasks done... Going to sleep for an hour"
但实际产出是

string(12) "Waking up..."
php UnversalWorker.php startmusic
php UnversalWorker.php logintohris
php UnversalWorker.php checkforerrorsemail
string(44) "All tasks done... Going to sleep for an hour"
php UnversalWorker.php startcoffeemachine
string(44) "All tasks done... Going to sleep for an hour"
string(44) "All tasks done... Going to sleep for an hour"
string(44) "All tasks done... Going to sleep for an hour"
string(44) "All tasks done... Going to sleep for an hour"

似乎每个子进程都在调用父进程的析构函数,即调度程序类。我想知道这是默认行为吗?如果是,请说明具体原因。如果没有,那么我的实现中肯定有一些bug。有人能给我指出这一点吗。

unversalWorker.php
中有调用类的东西吗?没有。如果我将其替换为
$fm->addTask('echo'.$task'),则会产生影响仍然相同的结果在
unversalWorker.php
中是否有调用类的内容?没有。如果我将其替换为
$fm->addTask('echo'.$task'),则会产生影响仍然是相同的结果