tmsolution/phpari

Asterisk ARI 的 PHP 类库

v3.2 2018-02-06 11:51 UTC

This package is not auto-updated.

Last update: 2024-09-21 16:42:59 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 库,我们可以编写一个基于 "回调" 的 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分支的bug修复和安全更新

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

针对新功能和改进

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

我们将尽力尽快处理各种贡献。bug修复和安全更新将得到更快处理 - 功能改进将添加到下一个主要版本中。

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

请确保记录您的代码 - 一旦合并,我们将需要继续您的代码,因此请确保您的文档清晰简洁,以便我们继续您的工作(如需)。

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

发布策略

将代码发布到开源总是一个挑战,它可能会同时让人困惑和沮丧。为了使版本号简单易懂,以下是我们的预计发布策略(未来可能会更改)。

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

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

次版本将在库的代码稳定,并引入了大量的修复和修改,并由社区成员进行了回归测试后发布。

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

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

团队成员和贡献者

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

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