vitux2 / phpari
用于Asterisk ARI的PHP类库
Requires
- php: >=7.0.0
- devristo/phpws: dev-master
- educoder/pest: 1.0.0
- wyrihaximus/react-guzzle: >=1.0.0
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修复和安全更新
- 将主分支Fork到您的个人GitHub账户
- 更新您本地的Fork
- 从您的Fork生成一个pull request到我们的主分支
针对新特性和改进
- 将开发分支Fork到您的个人GitHub账户
- 更新您本地的Fork
- 从您的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