ystools / erlang-port-bundle
Symfony 2 Erlang 端口包
Requires
- php: >=5.3.0
- symfony/symfony: 2.*
This package is auto-updated.
Last update: 2023-03-28 18:49:05 UTC
README
此包提供了允许使用 Erlang 端口在 Erlang 程序和 Symfony 应用之间交互的功能。包包含从 Erlang 端口端进行操作的函数库,以及用于从 Symfony 端处理已注册端口命令的 CLI 命令和端口命令注册表。
安装
要安装此包,您需要在 Symfony 的 main composer.json 的 require 部分添加字符串 "ystools/erlang-port-bundle": "dev-master"
并运行 composer update
。
Erlang 端
库
存在一个名为 symfony_port.erl 的库,提供了与 Symfony 端口交互时应使用的函数列表
- open() - 创建并打开 Symfony 端口,向端口发送 "init" 命令,返回进程标识符;
- execute_command(Process, Name, Parameters) - 执行端口命令 Name 的函数,对于进程 Process,带有参数列表 Parameters(参数是可选的),返回命令执行结果字符串;
- close(Process) - 停止并关闭由进程 Process 标识的端口,向端口发送 "exit" 命令。
默认情况下,所有 Erlang 文件都位于目录 erl 中,但安装后应将所需文件复制到其他位置,以便编译和使用。
配置
端口配置存储在文件 symfony_port_config.hrl 中,包含以下参数(宏)
- PORT_CLI_COMMAND - 在 Symfony 端启动 Erlang 端口的完整命令行(例如
php /opt/www/symfony/app/console ystools:erlang-port
); - PORT_TIMEOUT - 端口命令执行超时(最大执行时间),当此时间到达时,端口将被关闭,默认值为 60 秒;
- INIT_COMMAND - 在端口打开后立即发送到端口的命令名称,默认值为
init
; - EXIT_COMMAND - 在端口关闭前发送到端口的命令名称,默认值为
exit
; - RESPONSE_PREFIX_OK - 用来标识成功响应的响应前缀,默认值为
ok:
; - RESPONSE_PREFIX_ERROR - 用来标识失败响应的响应前缀,默认值为
error:
;
Symfony 端
该包提供了用于实现端口命令的PortCommandInterface
和AbstractPortCommand
,应使用它们来实现端口命令。每个端口命令必须在DI容器中以标签ys_tools.erlang_port.port_command
注册为服务——标签别名是命令名称。
Erlang的主要入口点是控制台命令ystools:erlang-port
,应在Erlang端指定为CLI命令。此命令还可以用于调试现有命令——您只需要启动它并输入命令名称和参数。
使用示例
假设我们需要实现一个端口命令,该命令将计算指定字符串的SHA-1哈希。我们需要遵循几个步骤。
1. 创建端口命令类
端口命令类必须实现PortCommandInterface。让我们使用已实现此接口的现有AbstractPortCommand来创建命令类
use YsTools\ErlangPortBundle\PortCommand\AbstractPortCommand; class Sha1Calculator extends AbstractPortCommand { /** * @param string $string * @return string */ public function processCommand($string) { return sha1($string); } }
在这里processCommand是用于执行命令的默认函数名。如果您想更改它,应该重写常量CALLBACK_METHOD。
2. 将端口命令注册为DI服务并指定标签
现在我们需要告诉这个类应作为Erlang端口命令使用。为此,我们需要将其注册为具有特定标签的服务,别名将用作命令名称
parameters:
acme.demo.port_command.sha1_calculator.class: Acme\DemoBundle\PortCommand\Sha1Calculator
services:
acme.demo.port_command.sha1_calculator:
class: %acme.demo.port_command.sha1_calculator.class%
tags:
- { name: ys_tools.erlang_port.port_command, alias: calculate_sha1 }
让我们检查命令是否可用并正常工作。为此,我们可以手动启动端口命令并输入所需数据
login@host:/opt/www/symfony$ app/console ystools:erlang-port
calculate_sha1 qwerty
ok:b1b3773a05c0ed0176787a4f1574ff0075f7521e
exit
ok:exit
如您所见,命令返回带有响应状态前缀的结果。命令exit
用于停止端口进程。
3. 编译Erlang库
要处理Erlang代码,我们需要编译现有的库。此外,包还提供了库symfony_port_demo.erl
,它允许我们在不添加额外的Erlang代码的情况下测试命令。让我们编译库symfony_port
和symfony_port_demo
login@host:/opt/www/symfony/src/YsTools/ErlangPortBundle/erl$ erl
Eshell V5.10.3 (abort with ^G)
1> c(symfony_port).
{ok,symfony_port}
2> c(symfony_port_demo).
{ok,symfony_port_demo}
编译每个库后,必须出现扩展名为*.beam的文件——这些是编译后的库。
4. 启动端口并执行命令
库symfony_port_demo
提供了函数execute(Name, Parameters)
,该函数可以自动打开端口,执行带有Parameters的命令Name,打印结果并关闭端口。让我们试试这个
login@host:/opt/www/symfony/src/YsTools/ErlangPortBundle/erl$ erl
Eshell V5.10.3 (abort with ^G)
1> symfony_port_demo:execute("calculate_sha1", ["qwerty"]).
b1b3773a05c0ed0176787a4f1574ff0075f7521e
stop
如您所见,端口命令已成功执行,并返回了有效的结果。