workerman 接入文心一言的流式输出

<?php

use Workerman\Worker;

use Workerman\Connection\TcpConnection;

require_once DIR . '/vendor/autoload.php';

// 注意:这里与上个例子不同,使用的是websocket协议

$ws_worker = new Worker("websocket://0.0.0.0:2000");

// 启动4个进程对外提供服务

$ws_worker->count = 4;

// 当收到客户端发来的数据后返回hello $data给客户端

ws_worker-\>onMessage = function(TcpConnection connection, $data)

{

// 向客户端发送hello $data

connection-\>send('hello ' . data);

$token = getAccessToken();

url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=".token;

/*$map = '{

"messages": [

{

"role": "user",

"content": "给我推荐一些自驾游路线"

}

],

"stream":"True"

}';*/

//$maparr = 'messages'=\>\['role'=\>'user','content'=\>'hello','stream'=>true];

$maparr = "messages" =\> \[\["role" =\> "user", "content" =\> 'hello'],"stream" => true];

curlStreamRequest(

$url, // 替换为实际的 API URL

'Content-Type: application/json', // 替换为实际的请求头

json_encode($maparr), // 替换为实际的 POST 数据(如果需要)

'handleResponseData' // 传递回调函数名作为字符串(如果回调函数在全局作用域中)

// 或者直接传递闭包函数

// function($data) {

// handleResponseData($data);

// }

);

};

function getAccessToken(){

$curl = curl_init();

$postData1 = array(

'grant_type' => 'client_credentials',

'client_id' => '****', //接入文心一言key

'client_secret' =>'****' 接入文心一言的secret

);

curl_setopt_array($curl, array(

CURLOPT_URL => 'https://aip.baidubce.com/oauth/2.0/token',

CURLOPT_CUSTOMREQUEST => 'POST',

CURLOPT_SSL_VERIFYPEER => false,

CURLOPT_SSL_VERIFYHOST => false,

CURLOPT_RETURNTRANSFER => true,

CURLOPT_POSTFIELDS => http_build_query($postData1)

));

response = curl_exec(curl);

curl_close($curl);

rtn = json_decode(response);

return $rtn->access_token;

}

function curlStreamRequest(string url, array headers = \[\], postData = null, callable callback) {

echo $postData;

$ch = curl_init();

curl_setopt(ch, CURLOPT_URL, url);

curl_setopt(ch, CURLOPT_HTTPHEADER, headers);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); // 不将响应保存为字符串,直接处理

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 注意:在生产环境中应启用 SSL 验证

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 注意:同上

curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

curl_setopt(ch, CURLOPT_POST, is_array(postData) || !empty($postData));

curl_setopt(ch, CURLOPT_POSTFIELDS, postData);

curl_setopt(ch, CURLOPT_WRITEFUNCTION, function (ch, data) use (callback) {

// 调用回调函数处理数据

callback(data);

return strlen($data); // 返回接收到的数据长度

});

// 执行请求并获取响应

curl_exec($ch);

// 检查是否有错误发生

if (curl_errno($ch)) {

throw new \Exception(curl_error($ch));

}

// 关闭 cURL 句柄

curl_close($ch);

}

/**

* 示例回调函数,用于处理接收到的数据并返回给客户端

*

* @param string $data 接收到的数据片段

*/

function handleResponseData($data) {

// 在这里,你可以将数据写入输出缓冲区或直接发送给客户端

// 例如,使用 echo 或 SSE 发送数据

echo $data; // 假设这里直接将数据发送给客户端

flush(); // 刷新输出缓冲区

}

// 使用示例

/*curlStreamRequest(

'https://example.com/api/stream', // 替换为实际的 API URL

'Content-Type: application/json', // 替换为实际的请求头

json_encode('key' =\> 'value'), // 替换为实际的 POST 数据(如果需要)

'handleResponseData' // 传递回调函数名作为字符串(如果回调函数在全局作用域中)

// 或者直接传递闭包函数

// function($data) {

// handleResponseData($data);

// }

);

*/

// 运行worker

Worker::runAll();

相关推荐
DFT计算杂谈13 小时前
SCIENTIFIC REPORTS 非 van der Waals可调二维磁性材料设计平台
开发语言·php
凡尘——雨落凡尘13 小时前
PHP实战复盘:高并发限流、防刷、验证码、会话安全、CSRF防护导致站点稳定性与安全加固实战
php·csrf 防护·csrf 攻击
2601_9657984713 小时前
Bostami Portfolio Template Review: Speed, Code & SEO Test
php
AC赳赳老秦16 小时前
开源组件版本数据监控:OpenClaw 抓取公开版本信息,自动提醒更新与安全风险
前端·python·安全·开源·github·php·openclaw
漏刻有时1 天前
PHP GeoJSON转PNG地图渲染程序开发笔记、源码解读、问题复盘与整改方案
android·笔记·php
always_TT1 天前
【Python 日志记录:logging 模块入门】
开发语言·python·php
Immortal__y1 天前
Upload-Labs 关卡防御方式
php
JonLee20201 天前
适配 Yii 3.0,php-casbin/yii-permission 3.0 正式发布
安全·php·rbac·yii·权限·casbin
QH139292318801 天前
# R&S ZNB43 ZNA43 ZNA67矢量网络分析仪
开发语言·网络·php
名字还没想好☜2 天前
Python concurrent.futures 实战:用 ThreadPoolExecutor 并发处理 + as_completed 收结果
数据库·python·php·并发