class 中的匿名函数以及如何影响成员

Anonymous functions in a class and how to affect members

我正在尝试 运行 在我的 class 中异步编写一些代码(参见:https://github.com/duncan3dc/fork-helper). I need to call a series of methods that will modify the values of my properties. I can't seem to do so. I'm trying to use the last example of the call() method on this page: https://duncan3dc.github.io/fork-helper/usage/getting-started/

<?php

class foobar
{
    private $x = 0;

    public function doubler(&$number_to_double)
    {
        $number_to_double = $number_to_double * 2;
    }

    public function index()
    {
        $fork = new \duncan3dc\Forker\Fork;
        $this->x    = 5;

        // outputs 5, as expected
        var_dump($this->x);

        $fork->call([$this, 'doubler'], $this->x);
        $fork->wait();

        // does not output 10, which is what I want
        var_dump($this->x);
    }
}

$my_foobar = new foobar();
$my_foobar->index();

我不必像在 doubler 中那样通过引用传递。相反,我也愿意只从 doubler 方法中修改成员。

为什么我的私人会员 x 没有在第二个 var_dump() 翻倍?

链接库似乎在内部使用 pcntl_fork,它执行 运行 PHP 进程的真正分支。图书馆提到 "threading" 但这是不正确的。分叉是一个非常低级的操作系统概念,而一个进程会在新进程中创建其内存 space 和指令的副本。该新进程成为分叉进程的子进程。

这意味着所有的东西,比如包含的代码和实例化的对象都会被复制,因此子进程不能直接修改父进程的对象。子进程与父进程通信的唯一方式是共享内存。此外,父进程可以 "wait" 让子进程终止(不这样做可能会导致子进程僵尸化)。链接库似乎没有实现真正的共享内存,但(如果必须的话)您可以使用 PHP shared memory 库。

然而,这对于像您正在共享的任务这样的简单任务来说是不切实际的。在您的情况下,您需要使用真正的线程库,例如pthreads。与进程不同,线程是父进程的一部分,共享相同的内存和数据结构,并且在上下文切换时的开销要低得多。

注意:以上所有概念都是非常低级的概念,因此 PHP 可能不是实现这些概念的最佳语言选择。