Asterisk ARI 的 PHP 类库

3.1 2015-02-17 06:08 UTC

This package is not auto-updated.

Last update: 2024-09-28 16:17:30 UTC


README

一个使 PHP 能够使用 Asterisk ARI 功能的类库

依赖关系

以下是安装 phpari 至您的服务器的最低要求

** PHP >= 5.3.9

** Composer

** PHP OpenSSL 模块以使用 SSL (wss:// uris) 连接

其他依赖项将通过 Composer 安装,包括

** Reactphp (http://reactphp.org/)

** ZF2 Logger (http://framework.zend.com/manual/2.0/en/modules/zend.log.overview.html)

安装

建议使用 Composer 进行安装。将以下内容添加到您的 composer.json 文件中

{
    "require": {
        "php": ">=5.3.9",
        "educoder/pest": "1.0.0",
        "devristo/phpws": "dev-master",
        "greenfieldtech-nirs/phpari": "dev-master"
    }
}

目前我们仍处于开发和测试阶段,因此建议使用 "dev-master" 版本。

配置 phpari.ini

phpari.ini 文件是我们的主要配置文件。您可以定义自己的配置,只需确保正确初始化您的 phpari 对象。文件内容如下

[general]
debug=0
logfile=console ; console for direct console output, filename for file based logging

[asterisk_ari]
username=testuser
password=testing
host=your_asterisk_server_ip_or_fqdn
port=your_asterisk_http_port
endpoint=/ari
transport=ws ; ws for none encrypted, wss for encrypted (currently, only ws is supported)

[asterisk_manager]
username=amiuser
password=amipassword
host=127.0.0.1
port=5038

如您所注意到的,我们已经在其中包含了 Asterisk Manager 的配置,这将在未来用于提供 Asterisk 管理器连接器对象。

验证功能

验证 phpari 是否正确安装的最简单方法是使用它。以下是一个最小化脚本,以确保您已正确安装

require_once("vendor/autoload.php");

echo "Starting ARI Connection\n";
$ariConnector = new phpari();
echo "Active Channels: " . json_encode($ariConnector->channels()->channel_list()) . "\n";
echo "Ending ARI Connection\n";

输出应类似于以下内容

[root@ari agi-bin]# php test.php
Starting ARI Connection
Active Channels: []
Ending ARI Connection

PHPARI 中的错误处理

为了允许更好的错误处理,我们决定在初始化的 phpari 对象中保留两个变量,分别是 "lasterror" 和 "lasttrace"。当任何 phpari 模块请求发生错误时,无论是 PEST 错误还是其他错误,都会在内部抛出异常。为了不破坏您的应用程序,我们将返回一个 FALSE 值,同时填充 "lasterror" 和 "lasttrace" 变量。

例如

    try {
        $conn = new phpari("hello-world"); //create new object
        $app  = new applications($conn);

        $result=$app->applications_list();

        if ((!$result) && (count($result)))
            throw new Exception("phpari error occured", 503);

        echo json_encode($result);
        exit(0);

    } catch (Exception $e) {
        echo "Error: " . $conn->lasterror. "\n";
        echo "Trace: " . $conn->lasttrace. "\n";
    }

在上面的例子中,我们尝试向我们的 Asterisk 服务器发出 "applications" GET 请求。如果发生错误,则应用程序对象将返回一个 FALSE 值,同时填充 "lasterror" 和 "lasttrace" 变量。以下是一个示例输出,其中 phpari.ini 中的 "port" 配置错误

$ php ApplicationList.php
Error: Failed connect to 178.62.XXX.XXX:8080; No error
Trace: #0 C:\Users\nirsi_000\Documents\phpari\vendor\educoder\pest\Pest.php(128): Pest->doRequest(Resource id #60)
#1 C:\Users\nirsi_000\Documents\phpari\src\interfaces\applications.php(58): Pest->get('/applications')
#2 C:\Users\nirsi_000\Documents\phpari\examples\ApplicationList.php(33): applications->applications_list()
#3 {main}

基本 Stasis 应用程序编程

Stasis 是一个事件驱动环境,这并不是 PHP 的原生环境。然而,由于 PHP 5.3 和 React 库,我们可以编写一个基于 "callback" 的 WebSocket 客户端。以下示例展示了如何实现这一点 - 完整示例位于 examples/BasicStasisApplication.php。

首先,我们需要设置我们的基本 Stasis 连接到 Asterisk

    class BasicStasisApplication
    {

        private $ariEndpoint;
        private $stasisClient;
        private $stasisLoop;
        private $phpariObject;
        private $stasisChannelID;
        private $dtmfSequence = "";

        public $stasisLogger;

        public function __construct($appname = NULL)
        {
            try {
                if (is_null($appname))
                    throw new Exception("[" . __FILE__ . ":" . __LINE__ . "] Stasis application name must be defined!", 500);

                $this->phpariObject = new phpari($appname);

                $this->ariEndpoint  = $this->phpariObject->ariEndpoint;
                $this->stasisClient = $this->phpariObject->stasisClient;
                $this->stasisLoop   = $this->phpariObject->stasisLoop;
                $this->stasisLogger = $this->phpariObject->stasisLogger;
                $this->stasisEvents = $this->phpariObject->stasisEvents;
            } catch (Exception $e) {
                echo $e->getMessage();
                exit(99);
            }
        }

请注意,构造函数通常在这个阶段不会返回错误,因为我们只是构建所需的对象,而不是连接到 Asterisk。现在,我们需要定义我们的 Stasis 连接处理程序

        public function StasisAppConnectionHandlers()
        {
            try {
                $this->stasisClient->on("request", function ($headers) {
                    $this->stasisLogger->notice("Request received!");
                });

                $this->stasisClient->on("handshake", function () {
                    $this->stasisLogger->notice("Handshake received!");
                });

                $this->stasisClient->on("message", function ($message) {
                    $event = json_decode($message->getData());
                    $this->stasisLogger->notice('Received event: ' . $event->type);
                    $this->stasisEvents->emit($event->type, array($event));
                });

            } catch (Exception $e) {
                echo $e->getMessage();
                exit(99);
            }
        }

请注意,我们将忽略任何额外的 Asterisk Stasis "message" 事件。现在,我们需要实际建立到 Asterisk 的连接

        public function execute()
        {
            try {
                $this->stasisClient->open();
                $this->stasisLoop->run();
            } catch (Exception $e) {
                echo $e->getMessage();
                exit(99);
            }
        }

我们的主要脚本主体如下

    $basicAriClient = new BasicStasisApplication("hello-world");

    $basicAriClient->stasisLogger->info("Starting Stasis Program... Waiting for handshake...");
    $basicAriClient->StasisAppEventHandler();

    $basicAriClient->stasisLogger->info("Connecting... Waiting for handshake...");
    $basicAriClient->execute();

这就完成了 - 这是最基本的 Stasis 应用程序。我们建议您现在查看 examples/BasicStasisApplication.php,以查看整个代码的实际效果。

报告问题

请直接通过 Github 项目页面报告问题。

代码贡献

我们对人们向本项目贡献代码非常开放。为了使生活更简单,这里是我们推荐的代码贡献方法

针对Master分支中的错误修复和安全更新

  1. 将Master分支Fork到您自己的个人GitHub账户
  2. 更新您的本地Fork
  3. 从您的Fork生成一个拉取请求到我们的Master分支

针对新功能和改进

  1. 将开发分支Fork到您自己的个人GitHub账户
  2. 更新您的本地Fork
  3. 从您的Fork生成一个拉取请求到我们的开发分支

我们将尽最大努力尽快审查各种贡献。错误修复和安全更新将得到更快处理 - 功能改进将被添加到下一个主要版本。

我们首选的IDE是来自JetBrains的phpStorm(http://www.jetbrains.com/phpstorm/) - 我们使用默认样式,所以不需要更改。如果您使用不同的IDE,请确保您更新IDE以支持项目的内部样式,这样您就不会破坏通用代码样式。

请确保记录您的代码 - 一旦合并,我们还需要继续您的代码,所以请确保您的文档清晰简洁,这样我们才能继续您的工作(如需)。

我们的目标是尽可能多地涉及社区,所以请随时加入并协助。对项目的贡献将自动将您的名字放入README.md文件中,这样每个人都能看到您的酷炫和伟大,支持开源运动和本项目的发展。

发布策略

将代码发布到开源总是具有挑战性,它可能既令人困惑又令人沮丧。为了使版本号更简单,以下是我们计划中的发布策略(未来可能会改变)。

每个版本都将使用主.次.补丁的版本号方案进行标记。

主版本将在库的代码稳定且经过实战测试后发布。这需要多长时间?这是一个好问题,我们不知道。目前,我们的主版本号是0 - 我们仍在积极开发中。

次版本将在库的代码稳定,并且引入了大量修复和修改,并且被社区中的几个成员回归后发布。

补丁版本将在库的代码稳定,并且引入了小修改后发布。这些修改通常包括错误修复和安全更新。

功能增强只会合并到次版本中,而不是补丁版本中。

团队成员和贡献者

以下列表包括与该库的创建/维护有关的人员的姓名和别名。维护一个开源项目需要很多资源,因此,我们将尽最大努力确保贡献和测试尽快合并。

Nir Simionovich, https://github.com/greenfieldtech-nirs
Leonid Notik, https://github.com/lnotik
Scott Griepentrog, https://github.com/stgnet
Matak, https://github.com/matak