This commit is contained in:
2024-07-13 00:47:07 +08:00
parent 44d6a1df3c
commit 2190367dff
12 changed files with 889 additions and 247 deletions

View File

@@ -102,7 +102,7 @@ class AudioRevertLogic extends BaseLogic
function revert_test($client_id,$audioData){
$xunfei_record_config = config('xunfei_record_config');
$appId = $xunfei_record_config['appid'];
$secretKey = $xunfei_record_config['secretKey'];
$secretKey = $xunfei_record_config['APIKey'];
dump($xunfei_record_config);
$client = new LfasrClient($appId, $secretKey);

View File

@@ -0,0 +1,78 @@
<?php
namespace app\api\logic;
use React\EventLoop\Factory;
use React\Socket\Connector;
use React\Http\Browser;
use React\Promise\Timer\Timeout;
use React\Stream\ThroughStream;
use React\WebSocket\ConnectionContext;
use React\WebSocket\WebSocketFactory;
class RealTimeASRClient
{
/**
* 根据所提供信息返回签名
*
* @param string $appId appid
* @param string $secretKey secretKey
* @param string $timestamp 时间戳,不传的话使用系统时间
* @return string
*/
function sign_V1($appId, $secretKey, $timestamp = null){
$timestamp = $timestamp ?: time();
$baseString = $appId . $timestamp;
$signa_origin = hash_hmac('sha1', md5($baseString), $secretKey, true);
return base64_encode($signa_origin);
}
function req(){
$loop = Factory::create();
$connector = new Connector($loop);
$browser = new Browser($connector);
$appid = 'your_appid';
$ts = strval(time());
$apiKey = 'your_apiKey';
// 生成signa
$baseString = $appid . $ts;
$md5BaseString = md5($baseString);
$signa = base64_encode(hash_hmac('sha1', $md5BaseString, $apiKey, true));
$url = "ws://rtasr.xfyun.cn/v1/ws?appid={$appid}&ts={$ts}&signa={$signa}";
$browser->request('GET', $url)
->then(function ($request) use ($loop) {
$request->on('response', function ($response) use ($loop) {
$response->on('data', function ($chunk) {
echo "Received: " . $chunk . PHP_EOL;
});
$response->on('close', function () {
echo "Connection closed." . PHP_EOL;
});
// 创建一个通过流,用于发送音频数据
$stream = new ThroughStream();
$stream->pipe($response);
// 这里可以发送音频数据,假设你有一个音频文件
// 注意:这只是一个示例,你需要根据实际情况发送数据
// $audioData = file_get_contents('/path/to/audio.pcm');
// $stream->write($audioData);
// 发送结束标志
$stream->end(json_encode(["end" => true]));
});
})
->then(null, function ($e) {
echo "Error: " . $e->getMessage() . PHP_EOL;
});
$loop->run();
}
}

View File

@@ -11,6 +11,7 @@ namespace app\index\controller;
use app\api\controller\BaseCommonController;
use app\api\logic\AudioRevertLogic;
use app\api\logic\RealTimeASRClient;
use app\api\logic\UserLogic;
use IFlytek\Xfyun\Speech\LfasrClient;
use think\Controller;
@@ -22,39 +23,17 @@ use wanghua\general_utility_tools_php\tool\Bank;
use wanghua\general_utility_tools_php\tool\Tools;
/**
*
* @deprecated
*/
class Test extends BasePublicController
{
function test()
{
//ws://rtasr.xfyun.cn/v1/ws?appid=595f23df&ts=1512041814&signa=IrrzsJeOFk1NGfJHW6SkHUoN9CU=&pd=edu
$obj = new AudioRevertLogic();
$obj->revert_test(1,1);
//(new AudioRevertLogic())->revert('asdsssssssssss','');
//(new AudioRevertLogic())->revert_test('asdsssssssssss','');
//revert_test
// 使用mt_rand()生成随机数
//$randomNumber = mt_rand(0, 2);
//
//echo $randomNumber;
//(new UserLogic())->offline(input('client_id','asdsssssssssss'));
//$res = Db::table('fa_users')->find();
//dump($res);
//$res = Db::connect('mysql://cup_defense:z8PMXE3PGsy7WiFP@127.0.0.1:3306/cup_defense#utf8')->table('fa_users')->find();
//dump($res);
//$res = Curl::curl_get('https://qifu.baidu.com/ip/geo/v1/district?ip=183.227.88.8');
//dump($res);die;
//$res = (new Bank())->getBankSimpleInfoByBankNo('6217003760019611401');
//
//dump($res);
//dump(Request::host());
}
function testwss(){

View File

@@ -60,43 +60,10 @@ class Events extends \think\worker\Events
public static function onWorkerStart(Worker $businessWorker)
{
$app = new Application;
//config([
// 'database' => [
// // 数据库类型
// 'type' => 'mysql',
// // 服务器地址
// 'hostname' => '127.0.0.1',//,
// // 数据库名
// 'database' => 'cup_defense',
// // 数据库用户名
// 'username' => 'cup_defense',
// // 数据库密码
// 'password' => 'z8PMXE3PGsy7WiFP',
// // 数据库连接端口
// 'hostport' => 3306,
// // 数据库编码默认采用utf8
// 'charset' => 'utf8',
// // 连接dsn
// 'dsn' => '',
// // 数据库连接参数
// 'params' => [],
// // 数据库表前缀
// 'prefix' => '',
// ],
//]);
$app->initialize();
// 输出数据库配置
//Tools::log_to_write_txt(['onWorkerStart_database'=>config('database.')]);
//// 加载数据库配置
// 输出数据库配置
//Tools::log_to_write_txt(['onWorkerStart_database'=>config('database.')]);
// 初始化数据库连接
//Db::init();
//Db::connect();
// 在工作进程开始时,可以在这里执行一次数据库查询
//Db::table('fa_users')->find();
}
/**
@@ -116,44 +83,6 @@ class Events extends \think\worker\Events
Gateway::sendToCurrentClient($json);
}
/**
* onWebSocketConnect 事件回调
* 当客户端连接上gateway完成websocket握手时触发
*
* @param integer $client_id 断开连接的客户端client_id
* @param mixed $data {
"get":[
],
"server":{
"REQUEST_METHOD":"GET",
"REQUEST_URI":"/wss",
"SERVER_PROTOCOL":"HTTP/1.1",
"HTTP_UPGRADE":"websocket",
"HTTP_CONNECTION":"Upgrade",
"HTTP_X_REAL_IP":"183.227.89.107",
"HTTP_HOST":"127.0.0.1:2000",
"SERVER_NAME":"127.0.0.1",
"SERVER_PORT":"2000",
"HTTP_PRAGMA":"no-cache",
"HTTP_CACHE_CONTROL":"no-cache",
"HTTP_USER_AGENT":"wechatdevtools desktopapp appservice port/62717 token/589065e467011760c777411fca2cd0aa runtime/2 MicroMessenger",
"HTTP_ORIGIN":"https://boomim.playone.cn",
"HTTP_SEC_WEBSOCKET_VERSION":"13",
"HTTP_ACCEPT_ENCODING":"gzip, deflate, br",
"HTTP_ACCEPT_LANGUAGE":"zh-CN,zh;q=0.9",
"HTTP_CONTENT_TYPE":"application/json",
"HTTP_REFERER":"https://servicewechat.com/wx55e10fb2834803d5/devtools/page-frame.html",
"HTTP_SEC_WEBSOCKET_KEY":"uWOWC1AZahJOpS18hN3ZHA==",
"HTTP_SEC_WEBSOCKET_EXTENSIONS":"permessage-deflate; client_max_window_bits",
"QUERY_STRING":""
},
"cookie":[
]
}
* @return void
*/
public static function onWebSocketConnect($client_id, $data)
{
@@ -191,65 +120,20 @@ class Events extends \think\worker\Events
return ;
}
//解析消息
$xunfei_record_config = config('xunfei_record_config');
$appId = $xunfei_record_config['appid'];
$secretKey = $xunfei_record_config['secretKey'];
//解析action
//调用业务逻辑&响应处理结果
//(new WssMessageLogic())->domsg($client_id,$data);
//$client = new VmsClient('YOUR_APPID', 'YOUR_SECRET_KEY');
// 音频数据接收处理
//$audioData = $data;
//// 将音频数据转换为文件以便传递给iFLYTEK SDK
//$tempFile = tempnam(sys_get_temp_dir(), 'audio');
//Tools::log_to_write_txt(['tempFile:',$tempFile]);
//file_put_contents($tempFile, $audioData);
//
//// 设置转写参数
//$lfasrConfig = [
// 'hasParticiple' => 'true',
// //'sample_rate' => 16000, // 采样率
// 'language' => 'zh_cn', // 语言
// //...
//];
//$xunfei_record_config = config('xunfei_record_config');
//$appId = $xunfei_record_config['appid'];
//$secretKey = $xunfei_record_config['secretKey'];
//
//Tools::log_to_write_txt(['app_id:',$appId]);
//Tools::log_to_write_txt(['secret_key:',$secretKey]);
//
//$filePath = $tempFile;//'/Users/wh/Desktop/test.wav';
//// 这里的$appId、$secretKey是在开放平台控制台获得
//$client = new LfasrClient($appId, $secretKey, $lfasrConfig);
//Tools::log_to_write_txt(['初始化$client:'=>$client]);
//if(empty($client)){
// Tools::log_to_write_txt(['初始化client初始化失败:$client为空。'=>$client]);
// return;
//}
//
//// $filePath为待转写的本地文件路径返回taskId作为后续查询进度、获取结果操作的参数
//$taskId = $client->combineUpload($filePath);
//Tools::log_to_write_txt(['taskId'=>$taskId]);
//
//// 查询进度json格式
//$progress = $client->getProgress($taskId)->getBody()->getContents();
//Tools::log_to_write_txt(['查询进度json格式:'=>$progress]);
//// 获取结果json格式
//$result = $client->getResult($taskId)->getBody()->getContents();
//Tools::log_to_write_txt(['获取结果json格式:'=>$result]);
//// 清理临时文件
//unlink($tempFile);
(new AudioRevertLogic())->revert($client_id,$data);
//sleep(5);
//} while (true);
//// 处理翻译结果,例如保存到数据库或返回给前端
//Gateway::sendToClient($client_id, $result);
// 处理接收到的语音数据
// 这里需要将二进制数据转换为讯飞API所需的格式
// 以下代码仅为示例具体实现需要根据讯飞API文档进行调整
$lfasrClient = new LfasrClient($appId, $secretKey);
$lfasrClient->sendBinaryData($data, function ($result) use ($client_id) {
// 处理讯飞API返回的实时转写结果
// 将结果发送回客户端
Gateway::sendToClient($client_id, json_encode(['type' => 'transcription', 'data' => $result]));
});
}

View File

@@ -24,7 +24,9 @@
"ext-json": "*",
"ext-mbstring": "*",
"doing/phpqrcode": "dev-master",
"iflytekop/xfyun-sdk": "^2.0"
"iflytekop/xfyun-sdk": "^2.0",
"react/socket": "^1.15",
"react/http": "^1.10"
},
"autoload": {
"psr-4": {
@@ -43,7 +45,7 @@
"repositories": {
"packagist": {
"type": "composer",
"url": "https://mirrors.aliyun.com/composer/"
"url": "https://mirrors.cloud.tencent.com/composer/"
}
}
}

View File

@@ -198,8 +198,12 @@ return [
],
//讯飞录音接口
'xunfei_record_config'=>[
//优一
'appid'=>'de02dasd',
'APIKey'=>'31ce3f96c062958df3c426da4903540c',
'secretKey'=>'MjcyOGE5ODg3ODM2ZWU5MTNiODc0M2Zl',
//测试
//'appid'=>'d482af59',
//'APIKey'=>'0d20dab630904ad8676d9075375a1914',
//'secretKey'=>'Yjg0YTAyNmE5OGUwNDE3YjU4NWE4NmZh',

View File

@@ -1,87 +1,9 @@
<?php
//use Xfyun\XfyunSDK;
class Client
{
private $ws;
private $end_tag = "{\"end\": true}";
// 示例使用
$appId = '595f23df';
$ts = '1512041814';
$apiKey = 'd9f4aa7ea6d94faca62cd88a28fd5234';
public function __construct($app_id,$api_key)
{
$base_url = "ws://rtasr.xfyun.cn/v1/ws";
$ts = strval(time());
$tt = ($app_id . $ts);
$md5 = hash('md5', $tt, true);
$baseString = bin2hex($md5);
$apiKey = $api_key;
$signa = hash_hmac('sha1', $baseString, $apiKey, true);
$signa = base64_encode($signa);
$signa = urlencode($signa);
$this->ws = new \WebSocket\Client($base_url . "?appid=" . $app_id . "&ts=" . $ts . "&signa=" . $signa);
}
public function send($file_path)
{
$file_object = fopen($file_path, 'rb');
try {
$index = 1;
while (!feof($file_object)) {
$chunk = fread($file_object, 1280);
if (!$chunk) {
break;
}
$this->ws->send($chunk);
$index += 1;
sleep(0.04);
}
} finally {
fclose($file_object);
}
$this->ws->send($this->end_tag);
echo "send end tag success";
}
public function recv()
{
while ($this->ws->isConnected()) {
$result = $this->ws->receive();
if (strlen($result) == 0) {
echo "receive result end";
break;
}
$result_dict = json_decode($result, true);
// 解析结果
if ($result_dict["action"] == "started") {
echo "handshake success, result: " . $result;
}
if ($result_dict["action"] == "result") {
$result_1 = $result_dict;
echo "rtasr result: " . $result_1["data"];
}
if ($result_dict["action"] == "error") {
echo "rtasr error: " . $result;
$this->ws->close();
return;
}
}
}
public function close()
{
$this->ws->close();
echo "connection closed";
}
}
$app_id = 'de02dasd';
$api_key = '31ce3f96c062958df3c426da4903540c';
$file_path = "/www/wwwroot/digital_doctor/digital_doctor/public/iseTest.mp3";
$client = new Client($app_id,$api_key);
$client->send($file_path);
$signa = sign_V1($appId, $apiKey, $ts);
echo $signa; // 输出: IrrzsJeOFk1NGfJHW6SkHUoN9CU=

View File

@@ -8,6 +8,7 @@ $baseDir = dirname($vendorDir);
return array(
'7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
'ad155f8f1cf0d418fe49e248db8c661b' => $vendorDir . '/react/promise/src/functions_include.php',
'6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
'37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
'ffc1d7141d4fcbaeb47a6929f0811ed1' => $vendorDir . '/topthink/think-worker/src/command.php',

View File

@@ -12,8 +12,15 @@ return array(
'app\\' => array($baseDir . '/application'),
'Workerman\\' => array($vendorDir . '/workerman/workerman'),
'WebSocket\\' => array($vendorDir . '/textalk/websocket/lib'),
'React\\Stream\\' => array($vendorDir . '/react/stream/src'),
'React\\Socket\\' => array($vendorDir . '/react/socket/src'),
'React\\Promise\\' => array($vendorDir . '/react/promise/src'),
'React\\Http\\' => array($vendorDir . '/react/http/src'),
'React\\EventLoop\\' => array($vendorDir . '/react/event-loop/src'),
'React\\Dns\\' => array($vendorDir . '/react/dns/src'),
'React\\Cache\\' => array($vendorDir . '/react/cache/src'),
'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src', $vendorDir . '/psr/http-factory/src'),
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'),
'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'),
'Phrity\\Util\\' => array($vendorDir . '/phrity/util-errorhandler/src'),
'Phrity\\Net\\' => array($vendorDir . '/phrity/net-uri/src'),
@@ -25,4 +32,6 @@ return array(
'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
'GatewayWorker\\' => array($vendorDir . '/workerman/gateway-worker/src'),
'Fig\\Http\\Message\\' => array($vendorDir . '/fig/http-message-util/src'),
'Evenement\\' => array($vendorDir . '/evenement/evenement/src'),
);

View File

@@ -9,6 +9,7 @@ class ComposerStaticInit296bd8a1d28e39d56dcd80ce7be249f3
public static $files = array (
'7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php',
'6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
'37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
'ffc1d7141d4fcbaeb47a6929f0811ed1' => __DIR__ . '/..' . '/topthink/think-worker/src/command.php',
@@ -33,6 +34,16 @@ class ComposerStaticInit296bd8a1d28e39d56dcd80ce7be249f3
'Workerman\\' => 10,
'WebSocket\\' => 10,
),
'R' =>
array (
'React\\Stream\\' => 13,
'React\\Socket\\' => 13,
'React\\Promise\\' => 14,
'React\\Http\\' => 11,
'React\\EventLoop\\' => 16,
'React\\Dns\\' => 10,
'React\\Cache\\' => 12,
),
'P' =>
array (
'Psr\\Log\\' => 8,
@@ -58,6 +69,14 @@ class ComposerStaticInit296bd8a1d28e39d56dcd80ce7be249f3
'GuzzleHttp\\' => 11,
'GatewayWorker\\' => 14,
),
'F' =>
array (
'Fig\\Http\\Message\\' => 17,
),
'E' =>
array (
'Evenement\\' => 10,
),
);
public static $prefixDirsPsr4 = array (
@@ -85,14 +104,42 @@ class ComposerStaticInit296bd8a1d28e39d56dcd80ce7be249f3
array (
0 => __DIR__ . '/..' . '/textalk/websocket/lib',
),
'React\\Stream\\' =>
array (
0 => __DIR__ . '/..' . '/react/stream/src',
),
'React\\Socket\\' =>
array (
0 => __DIR__ . '/..' . '/react/socket/src',
),
'React\\Promise\\' =>
array (
0 => __DIR__ . '/..' . '/react/promise/src',
),
'React\\Http\\' =>
array (
0 => __DIR__ . '/..' . '/react/http/src',
),
'React\\EventLoop\\' =>
array (
0 => __DIR__ . '/..' . '/react/event-loop/src',
),
'React\\Dns\\' =>
array (
0 => __DIR__ . '/..' . '/react/dns/src',
),
'React\\Cache\\' =>
array (
0 => __DIR__ . '/..' . '/react/cache/src',
),
'Psr\\Log\\' =>
array (
0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
),
'Psr\\Http\\Message\\' =>
array (
0 => __DIR__ . '/..' . '/psr/http-message/src',
1 => __DIR__ . '/..' . '/psr/http-factory/src',
0 => __DIR__ . '/..' . '/psr/http-factory/src',
1 => __DIR__ . '/..' . '/psr/http-message/src',
),
'Psr\\Http\\Client\\' =>
array (
@@ -138,6 +185,14 @@ class ComposerStaticInit296bd8a1d28e39d56dcd80ce7be249f3
array (
0 => __DIR__ . '/..' . '/workerman/gateway-worker/src',
),
'Fig\\Http\\Message\\' =>
array (
0 => __DIR__ . '/..' . '/fig/http-message-util/src',
),
'Evenement\\' =>
array (
0 => __DIR__ . '/..' . '/evenement/evenement/src',
),
);
public static $classMap = array (

View File

@@ -54,6 +54,105 @@
},
"install-path": "../doing/phpqrcode"
},
{
"name": "evenement/evenement",
"version": "v3.0.2",
"version_normalized": "3.0.2.0",
"source": {
"type": "git",
"url": "https://github.com/igorw/evenement.git",
"reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc"
},
"dist": {
"type": "zip",
"url": "https://mirrors.huaweicloud.com/repository/php/evenement/evenement/v3.0.2/evenement-evenement-v3.0.2.zip",
"reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc",
"shasum": ""
},
"require": {
"php": ">=7.0"
},
"require-dev": {
"phpunit/phpunit": "^9 || ^6"
},
"time": "2023-08-08T05:53:35+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-4": {
"Evenement\\": "src/"
}
},
"license": [
"MIT"
],
"authors": [
{
"name": "Igor Wiedler",
"email": "igor@wiedler.ch"
}
],
"description": "Événement is a very simple event dispatching library for PHP",
"keywords": [
"event-dispatcher",
"event-emitter"
],
"install-path": "../evenement/evenement"
},
{
"name": "fig/http-message-util",
"version": "1.1.5",
"version_normalized": "1.1.5.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-message-util.git",
"reference": "9d94dc0154230ac39e5bf89398b324a86f63f765"
},
"dist": {
"type": "zip",
"url": "https://mirrors.huaweicloud.com/repository/php/fig/http-message-util/1.1.5/fig-http-message-util-1.1.5.zip",
"reference": "9d94dc0154230ac39e5bf89398b324a86f63f765",
"shasum": ""
},
"require": {
"php": "^5.3 || ^7.0 || ^8.0"
},
"suggest": {
"psr/http-message": "The package containing the PSR-7 interfaces"
},
"time": "2020-11-24T22:02:12+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.1.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"Fig\\Http\\Message\\": "src/"
}
},
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "https://www.php-fig.org/"
}
],
"description": "Utility classes and constants for use with PSR-7 (psr/http-message)",
"keywords": [
"http",
"http-message",
"psr",
"psr-7",
"request",
"response"
],
"install-path": "../fig/http-message-util"
},
{
"name": "guzzlehttp/guzzle",
"version": "7.8.1",
@@ -897,6 +996,534 @@
"description": "A polyfill for getallheaders.",
"install-path": "../ralouphie/getallheaders"
},
{
"name": "react/cache",
"version": "v1.2.0",
"version_normalized": "1.2.0.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/cache.git",
"reference": "d47c472b64aa5608225f47965a484b75c7817d5b"
},
"dist": {
"type": "zip",
"url": "https://mirrors.huaweicloud.com/repository/php/react/cache/v1.2.0/react-cache-v1.2.0.zip",
"reference": "d47c472b64aa5608225f47965a484b75c7817d5b",
"shasum": ""
},
"require": {
"php": ">=5.3.0",
"react/promise": "^3.0 || ^2.0 || ^1.1"
},
"require-dev": {
"phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35"
},
"time": "2022-11-30T15:59:55+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-4": {
"React\\Cache\\": "src/"
}
},
"license": [
"MIT"
],
"authors": [
{
"name": "Christian Lück",
"email": "christian@clue.engineering",
"homepage": "https://clue.engineering/"
},
{
"name": "Cees-Jan Kiewiet",
"email": "reactphp@ceesjankiewiet.nl",
"homepage": "https://wyrihaximus.net/"
},
{
"name": "Jan Sorgalla",
"email": "jsorgalla@gmail.com",
"homepage": "https://sorgalla.com/"
},
{
"name": "Chris Boden",
"email": "cboden@gmail.com",
"homepage": "https://cboden.dev/"
}
],
"description": "Async, Promise-based cache interface for ReactPHP",
"keywords": [
"cache",
"caching",
"promise",
"reactphp"
],
"funding": [
{
"url": "https://opencollective.com/reactphp",
"type": "open_collective"
}
],
"install-path": "../react/cache"
},
{
"name": "react/dns",
"version": "v1.13.0",
"version_normalized": "1.13.0.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/dns.git",
"reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5"
},
"dist": {
"type": "zip",
"url": "https://mirrors.huaweicloud.com/repository/php/react/dns/v1.13.0/react-dns-v1.13.0.zip",
"reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5",
"shasum": ""
},
"require": {
"php": ">=5.3.0",
"react/cache": "^1.0 || ^0.6 || ^0.5",
"react/event-loop": "^1.2",
"react/promise": "^3.2 || ^2.7 || ^1.2.1"
},
"require-dev": {
"phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
"react/async": "^4.3 || ^3 || ^2",
"react/promise-timer": "^1.11"
},
"time": "2024-06-13T14:18:03+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-4": {
"React\\Dns\\": "src/"
}
},
"license": [
"MIT"
],
"authors": [
{
"name": "Christian Lück",
"email": "christian@clue.engineering",
"homepage": "https://clue.engineering/"
},
{
"name": "Cees-Jan Kiewiet",
"email": "reactphp@ceesjankiewiet.nl",
"homepage": "https://wyrihaximus.net/"
},
{
"name": "Jan Sorgalla",
"email": "jsorgalla@gmail.com",
"homepage": "https://sorgalla.com/"
},
{
"name": "Chris Boden",
"email": "cboden@gmail.com",
"homepage": "https://cboden.dev/"
}
],
"description": "Async DNS resolver for ReactPHP",
"keywords": [
"async",
"dns",
"dns-resolver",
"reactphp"
],
"funding": [
{
"url": "https://opencollective.com/reactphp",
"type": "open_collective"
}
],
"install-path": "../react/dns"
},
{
"name": "react/event-loop",
"version": "v1.5.0",
"version_normalized": "1.5.0.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/event-loop.git",
"reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354"
},
"dist": {
"type": "zip",
"url": "https://mirrors.huaweicloud.com/repository/php/react/event-loop/v1.5.0/react-event-loop-v1.5.0.zip",
"reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"require-dev": {
"phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
},
"suggest": {
"ext-pcntl": "For signal handling support when using the StreamSelectLoop"
},
"time": "2023-11-13T13:48:05+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-4": {
"React\\EventLoop\\": "src/"
}
},
"license": [
"MIT"
],
"authors": [
{
"name": "Christian Lück",
"email": "christian@clue.engineering",
"homepage": "https://clue.engineering/"
},
{
"name": "Cees-Jan Kiewiet",
"email": "reactphp@ceesjankiewiet.nl",
"homepage": "https://wyrihaximus.net/"
},
{
"name": "Jan Sorgalla",
"email": "jsorgalla@gmail.com",
"homepage": "https://sorgalla.com/"
},
{
"name": "Chris Boden",
"email": "cboden@gmail.com",
"homepage": "https://cboden.dev/"
}
],
"description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.",
"keywords": [
"asynchronous",
"event-loop"
],
"funding": [
{
"url": "https://opencollective.com/reactphp",
"type": "open_collective"
}
],
"install-path": "../react/event-loop"
},
{
"name": "react/http",
"version": "v1.10.0",
"version_normalized": "1.10.0.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/http.git",
"reference": "8111281ee57f22b7194f5dba225e609ba7ce4d20"
},
"dist": {
"type": "zip",
"url": "https://mirrors.huaweicloud.com/repository/php/react/http/v1.10.0/react-http-v1.10.0.zip",
"reference": "8111281ee57f22b7194f5dba225e609ba7ce4d20",
"shasum": ""
},
"require": {
"evenement/evenement": "^3.0 || ^2.0 || ^1.0",
"fig/http-message-util": "^1.1",
"php": ">=5.3.0",
"psr/http-message": "^1.0",
"react/event-loop": "^1.2",
"react/promise": "^3 || ^2.3 || ^1.2.1",
"react/socket": "^1.12",
"react/stream": "^1.2"
},
"require-dev": {
"clue/http-proxy-react": "^1.8",
"clue/reactphp-ssh-proxy": "^1.4",
"clue/socks-react": "^1.4",
"phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
"react/async": "^4 || ^3 || ^2",
"react/promise-stream": "^1.4",
"react/promise-timer": "^1.9"
},
"time": "2024-03-27T17:20:46+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-4": {
"React\\Http\\": "src/"
}
},
"license": [
"MIT"
],
"authors": [
{
"name": "Christian Lück",
"email": "christian@clue.engineering",
"homepage": "https://clue.engineering/"
},
{
"name": "Cees-Jan Kiewiet",
"email": "reactphp@ceesjankiewiet.nl",
"homepage": "https://wyrihaximus.net/"
},
{
"name": "Jan Sorgalla",
"email": "jsorgalla@gmail.com",
"homepage": "https://sorgalla.com/"
},
{
"name": "Chris Boden",
"email": "cboden@gmail.com",
"homepage": "https://cboden.dev/"
}
],
"description": "Event-driven, streaming HTTP client and server implementation for ReactPHP",
"keywords": [
"async",
"client",
"event-driven",
"http",
"http client",
"http server",
"https",
"psr-7",
"reactphp",
"server",
"streaming"
],
"funding": [
{
"url": "https://opencollective.com/reactphp",
"type": "open_collective"
}
],
"install-path": "../react/http"
},
{
"name": "react/promise",
"version": "v3.2.0",
"version_normalized": "3.2.0.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/promise.git",
"reference": "8a164643313c71354582dc850b42b33fa12a4b63"
},
"dist": {
"type": "zip",
"url": "https://mirrors.huaweicloud.com/repository/php/react/promise/v3.2.0/react-promise-v3.2.0.zip",
"reference": "8a164643313c71354582dc850b42b33fa12a4b63",
"shasum": ""
},
"require": {
"php": ">=7.1.0"
},
"require-dev": {
"phpstan/phpstan": "1.10.39 || 1.4.10",
"phpunit/phpunit": "^9.6 || ^7.5"
},
"time": "2024-05-24T10:39:05+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
"files": [
"src/functions_include.php"
],
"psr-4": {
"React\\Promise\\": "src/"
}
},
"license": [
"MIT"
],
"authors": [
{
"name": "Jan Sorgalla",
"email": "jsorgalla@gmail.com",
"homepage": "https://sorgalla.com/"
},
{
"name": "Christian Lück",
"email": "christian@clue.engineering",
"homepage": "https://clue.engineering/"
},
{
"name": "Cees-Jan Kiewiet",
"email": "reactphp@ceesjankiewiet.nl",
"homepage": "https://wyrihaximus.net/"
},
{
"name": "Chris Boden",
"email": "cboden@gmail.com",
"homepage": "https://cboden.dev/"
}
],
"description": "A lightweight implementation of CommonJS Promises/A for PHP",
"keywords": [
"promise",
"promises"
],
"funding": [
{
"url": "https://opencollective.com/reactphp",
"type": "open_collective"
}
],
"install-path": "../react/promise"
},
{
"name": "react/socket",
"version": "v1.15.0",
"version_normalized": "1.15.0.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/socket.git",
"reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038"
},
"dist": {
"type": "zip",
"url": "https://mirrors.huaweicloud.com/repository/php/react/socket/v1.15.0/react-socket-v1.15.0.zip",
"reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038",
"shasum": ""
},
"require": {
"evenement/evenement": "^3.0 || ^2.0 || ^1.0",
"php": ">=5.3.0",
"react/dns": "^1.11",
"react/event-loop": "^1.2",
"react/promise": "^3 || ^2.6 || ^1.2.1",
"react/stream": "^1.2"
},
"require-dev": {
"phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
"react/async": "^4 || ^3 || ^2",
"react/promise-stream": "^1.4",
"react/promise-timer": "^1.10"
},
"time": "2023-12-15T11:02:10+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-4": {
"React\\Socket\\": "src/"
}
},
"license": [
"MIT"
],
"authors": [
{
"name": "Christian Lück",
"email": "christian@clue.engineering",
"homepage": "https://clue.engineering/"
},
{
"name": "Cees-Jan Kiewiet",
"email": "reactphp@ceesjankiewiet.nl",
"homepage": "https://wyrihaximus.net/"
},
{
"name": "Jan Sorgalla",
"email": "jsorgalla@gmail.com",
"homepage": "https://sorgalla.com/"
},
{
"name": "Chris Boden",
"email": "cboden@gmail.com",
"homepage": "https://cboden.dev/"
}
],
"description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP",
"keywords": [
"Connection",
"Socket",
"async",
"reactphp",
"stream"
],
"funding": [
{
"url": "https://opencollective.com/reactphp",
"type": "open_collective"
}
],
"install-path": "../react/socket"
},
{
"name": "react/stream",
"version": "v1.4.0",
"version_normalized": "1.4.0.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/stream.git",
"reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d"
},
"dist": {
"type": "zip",
"url": "https://mirrors.huaweicloud.com/repository/php/react/stream/v1.4.0/react-stream-v1.4.0.zip",
"reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d",
"shasum": ""
},
"require": {
"evenement/evenement": "^3.0 || ^2.0 || ^1.0",
"php": ">=5.3.8",
"react/event-loop": "^1.2"
},
"require-dev": {
"clue/stream-filter": "~1.2",
"phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
},
"time": "2024-06-11T12:45:25+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-4": {
"React\\Stream\\": "src/"
}
},
"license": [
"MIT"
],
"authors": [
{
"name": "Christian Lück",
"email": "christian@clue.engineering",
"homepage": "https://clue.engineering/"
},
{
"name": "Cees-Jan Kiewiet",
"email": "reactphp@ceesjankiewiet.nl",
"homepage": "https://wyrihaximus.net/"
},
{
"name": "Jan Sorgalla",
"email": "jsorgalla@gmail.com",
"homepage": "https://sorgalla.com/"
},
{
"name": "Chris Boden",
"email": "cboden@gmail.com",
"homepage": "https://cboden.dev/"
}
],
"description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP",
"keywords": [
"event-driven",
"io",
"non-blocking",
"pipe",
"reactphp",
"readable",
"stream",
"writable"
],
"funding": [
{
"url": "https://opencollective.com/reactphp",
"type": "open_collective"
}
],
"install-path": "../react/stream"
},
{
"name": "symfony/deprecation-contracts",
"version": "v2.5.3",

View File

@@ -5,7 +5,7 @@
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'reference' => '0f25829d6a3abf7353ffa5d5bf4e01aa18dbbeaa',
'reference' => '44d6a1df3c31fcf14c6c0dffd72b11b14c6d40bf',
'name' => 'topthink/think',
'dev' => true,
),
@@ -21,6 +21,24 @@
'reference' => '600baab04cd4dfe2b307a321775ec5a66e330560',
'dev_requirement' => false,
),
'evenement/evenement' => array(
'pretty_version' => 'v3.0.2',
'version' => '3.0.2.0',
'type' => 'library',
'install_path' => __DIR__ . '/../evenement/evenement',
'aliases' => array(),
'reference' => '0a16b0d71ab13284339abb99d9d2bd813640efbc',
'dev_requirement' => false,
),
'fig/http-message-util' => array(
'pretty_version' => '1.1.5',
'version' => '1.1.5.0',
'type' => 'library',
'install_path' => __DIR__ . '/../fig/http-message-util',
'aliases' => array(),
'reference' => '9d94dc0154230ac39e5bf89398b324a86f63f765',
'dev_requirement' => false,
),
'guzzlehttp/guzzle' => array(
'pretty_version' => '7.8.1',
'version' => '7.8.1.0',
@@ -156,6 +174,69 @@
'reference' => '120b605dfeb996808c31b6477290a714d356e822',
'dev_requirement' => false,
),
'react/cache' => array(
'pretty_version' => 'v1.2.0',
'version' => '1.2.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../react/cache',
'aliases' => array(),
'reference' => 'd47c472b64aa5608225f47965a484b75c7817d5b',
'dev_requirement' => false,
),
'react/dns' => array(
'pretty_version' => 'v1.13.0',
'version' => '1.13.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../react/dns',
'aliases' => array(),
'reference' => 'eb8ae001b5a455665c89c1df97f6fb682f8fb0f5',
'dev_requirement' => false,
),
'react/event-loop' => array(
'pretty_version' => 'v1.5.0',
'version' => '1.5.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../react/event-loop',
'aliases' => array(),
'reference' => 'bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354',
'dev_requirement' => false,
),
'react/http' => array(
'pretty_version' => 'v1.10.0',
'version' => '1.10.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../react/http',
'aliases' => array(),
'reference' => '8111281ee57f22b7194f5dba225e609ba7ce4d20',
'dev_requirement' => false,
),
'react/promise' => array(
'pretty_version' => 'v3.2.0',
'version' => '3.2.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../react/promise',
'aliases' => array(),
'reference' => '8a164643313c71354582dc850b42b33fa12a4b63',
'dev_requirement' => false,
),
'react/socket' => array(
'pretty_version' => 'v1.15.0',
'version' => '1.15.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../react/socket',
'aliases' => array(),
'reference' => '216d3aec0b87f04a40ca04f481e6af01bdd1d038',
'dev_requirement' => false,
),
'react/stream' => array(
'pretty_version' => 'v1.4.0',
'version' => '1.4.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../react/stream',
'aliases' => array(),
'reference' => '1e5b0acb8fe55143b5b426817155190eb6f5b18d',
'dev_requirement' => false,
),
'symfony/deprecation-contracts' => array(
'pretty_version' => 'v2.5.3',
'version' => '2.5.3.0',
@@ -189,7 +270,7 @@
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'reference' => '0f25829d6a3abf7353ffa5d5bf4e01aa18dbbeaa',
'reference' => '44d6a1df3c31fcf14c6c0dffd72b11b14c6d40bf',
'dev_requirement' => false,
),
'topthink/think-installer' => array(