ystools/erlang-port-bundle

该包已被弃用,不再维护。未建议替代包。

Symfony 2 Erlang 端口包

安装: 11

依赖者: 0

建议者: 0

安全: 0

星星: 7

关注者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

dev-master 2013-10-02 17:00 UTC

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 端

该包提供了用于实现端口命令的PortCommandInterfaceAbstractPortCommand,应使用它们来实现端口命令。每个端口命令必须在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_portsymfony_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

如您所见,端口命令已成功执行,并返回了有效的结果。