我有这样的代码:
class Server {
private $stopper;
public function setStopper() { $this->stopper = TRUE; }
public function startServer() {
$consumer = new Consumer();
$consumer->onConsume(function($data) {
global $consumer;
// some processing
if( ?? ) { // how to access stopper here??
$consumer->stop();
// also how to access stopServer() here??
}
});
$consumer->consume();
}
public function stopServer() { ... }
}
此代码是应该永远运行下去,除非文件setStopper()
被调用。 到目前为止,我set_time_limit
一段时间后停止代码。 但我需要实现setStopper
的方式,所以我可以停止服务器时需要的,而不是“过了一会”。
我需要这个,因为,在onConsume
连接到流API和运行匿名电话回来,每当新的数据是可用的,我不想杀死超时的PHP应用程序由于一些锁的问题。 我想平稳地停止服务器。
谁能告诉如何访问stopper
或stopServer
回调里面? 我可以用下面的语法?
...(function($data) use ($this) {...
我还以为里面存储回调类值,但setStopper
的动态调用和值可能不会更新!
有没有更好的方式来处理这种情况呢?
跟进: PHP -动态更新单例类的价值
你可以创建一个封闭围绕$consumer
对象以及词法对象$this
(如果你使用PHP <5.4,则需要重命名$this
对别的东西,因为你不能use($this)
):
$self = $this;
// You may not need to do this, I cannot remember off-hand whether
// closures have access to private variables or not
$stopper = $this->stopper;
$consumer->onConsume(function($data) use($consumer, $self, $stopper) {
if( $stopper ) {
$consumer->stop();
$self->stopServer();
}
});
参见实施例#3上的链接到手册页。
我还应该注意到这里的完整性,如果这是一个长期的过程,那么对象被引用里面的关闭将在函数退出后,周围挂起的时长。 例如:
function makeAdder($x) {
return function($n) use($x) {
return $x + $n;
};
}
$adder = makeAdder(5);
echo $adder(2); // Output 7
echo $adder(5); // Output 10
echo $adder(4); // Output 9
这是一个封闭的一个典型的例子。 通常情况下,一旦makeAdder
函数返回其内部变量$x
就会掉出来的范围,并准备进行垃圾回收。 因为它不过是匿名函数的范围内的约束,它会流连无限期(直到脚本的终止) 或引用包含范围内也被释放(即通过unset($adder)
)。 这意味着,一旦你的函数被调用,额外引用$consumer
, $this
和$stopper
会保留,直到类实例本身被破坏。
没有意识到这可能会导致一些严重的性能问题。
这里同样的问题,我使用输出缓冲器从ob_start / ob_end_flush和一个功能我有应该是动态的,相关联的一个来ob_start解析器(然而参数I推入应在供以后用于解析使用$缓冲器的缓冲器使用的阵列将它们插入)时刻i有这些行的代码从一个阵列充满数据:
if(!empty($this->__b2))
array_filter ($this->__b2,function($var)use(**&$buffer**){
$buffer = preg_replace("/<\/body>/i", $var.'</body>', $buffer);
});
我使用的是只有一个类单,我用“::”了很多。 你在我的情况array_filter怎么看坏了没有&$缓冲区