vitux2/phpari

用于Asterisk ARI的PHP类库

dev-master 2023-08-08 09:47 UTC

This package is auto-updated.

Last update: 2024-09-08 12:12:10 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"变量。以下是一个示例输出,其中"port"配置在phpari.ini中错误

$ 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项目页面直接报告问题。

代码贡献

我们非常欢迎人们为此项目贡献代码。为了使生活更容易,以下是贡献代码的首选方法

针对主分支的bug修复和安全更新

  1. 将主分支Fork到您的个人GitHub账户
  2. 更新您本地的Fork
  3. 从您的Fork生成一个pull request到我们的主分支

针对新特性和改进

  1. 将开发分支Fork到您的个人GitHub账户
  2. 更新您本地的Fork
  3. 从您的Fork生成一个pull request到我们的开发分支

我们将尽最大努力尽快审查各种贡献。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