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 可能不是实现这些概念的最佳语言选择。
我正在尝试 运行 在我的 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 可能不是实现这些概念的最佳语言选择。