greenfieldtech-nirs / phpari
Asterisk ARI 的 PHP 类库
Requires
- php: >=5.3.9
- devristo/phpws: dev-master
- educoder/pest: 1.0.0
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分支中的错误修复和安全更新
- 将Master分支Fork到您自己的个人GitHub账户
- 更新您的本地Fork
- 从您的Fork生成一个拉取请求到我们的Master分支
针对新功能和改进
- 将开发分支Fork到您自己的个人GitHub账户
- 更新您的本地Fork
- 从您的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