videlalvaro / phacterl
Actor 模型,在 PHP 中
Requires
- php: >=5.3.0
This package is auto-updated.
Last update: 2024-09-17 22:16:41 UTC
README
PHP 中 Actor 模型的实现。
安装
将 "videlalvaro/phacterl": "dev-master"
添加到您的 composer.json
文件的 require
部分。
使用方法
您的 Actor 需要扩展抽象类 Actor,例如,并实现两个方法:Actor::init
和 Actor::receive
。例如
class Counter extends Actor { public function init($args) { return array( 'count' => 0 ); } public function receive() { return array('incr', 'get_count'); } }
init
方法应返回一个数组,该数组将是进程的 状态。运行时系统将负责管理进程状态。
receive
方法应返回一个包含字符串的数组,指定此进程响应哪些 消息标签。
在我们的例子中,进程 Counter
还应提供名为 handle_incr
的方法和另一个名为 handle_get_count
的方法。
实现处理器
处理器是一个函数,它接受两个参数,一个 Message
和进程的 State
,并返回一个新的状态,如下所示
class Counter extends Actor { // snip public function handle_incr($msg, $state) { $state['counter'] += $msg['amount']; return $state; } // snip }
发送消息
要发送消息,您的 Actor 可以调用函数 Actor::send
,该函数期望一个 进程 ID 和一个 Message
。当创建 Message
实例时,您需要提供一个 tag
,例如,在这种情况下,使用 'count'
,以及消息数据。此 tag 用于将消息调度到名为 handle_<tag>
的消息处理器。
class Counter extends Actor { // snip public function handle_get_count($msg, $state) { $pid = $msg['sender']; $this->send( $pid, new Message( 'count', array('sender' => $this->self(), 'count' => $state['counter']) ) ); return $state; } // snip }
然后,一旦您运行您的 Actor,首先获取 Scheduler
的实例,并通过传递类名和 Actor init 函数的初始参数来 spawn 您的 Actor。
$scheduler = new Scheduler(); $pid = $scheduler->spawn('Counter', array()); $scheduler->run();
停止系统
您可以在 Actor 内部简单地调用 $this->stop()
。否则,调用 $scheduler->stop()
。
示例
在演示文件夹中,您可以找到许多示例,这些示例是书中所提出算法的实现,书名为 Distributed Algorithms for Message-Passing Systems。
为什么?
因为在 Erlang 中实现这些算法会太简单。
为什么不呢?
这是一个愚人节玩笑吗?
根据我的儒略历,这里今天是愚人节第一天。
许可证
MIT 许可证 (MIT)
版权所有 (c) 2014 - Alvaro Videla
在此特此授予任何获得此软件及其相关文档文件(统称为“软件”)副本的任何人,免费处理该软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许向软件提供者提供软件的人这样做,前提是遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或实质性部分中。
软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论此类索赔、损害或其他责任是基于合同、侵权或其他原因,以及与软件或软件的使用或其他处置有关。