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



我正在尝试在我的类中异步运行一些代码(请参阅:https://github.com/duncan3dc/fork-helper(。我需要调用一系列将修改属性值的方法。我似乎不能这样做。我正在尝试使用此页面上 call(( 方法的最后一个示例: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 duncan3dcForkerFork;
$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方法中修改成员。

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

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

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

但是,这对于您共享的简单任务是不切实际的。在您的情况下,您需要使用真正的线程库,例如pthreads.与进程不同,线程是父进程的一部分,共享相同的内存和数据结构,并且在上下文切换时具有显着较低的开销。

注意:以上所有概念都是相当低级的概念,所以也许PHP不是实现这些概念的最佳语言选择。

最新更新