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();

相关推荐
酷爱码28 分钟前
单页图床HTML源码+本地API接口图床系统修复版源码
php·图床源码
酷爱码1 小时前
2025 PHP授权系统网站源码
开发语言·php
人间打气筒(Ada)6 小时前
ubuntu网络及软件包管理
网络·ubuntu·php
wapicn999 小时前
‌挖数据平台对接DeepSeek推出一键云端部署功能:API接口驱动金融、汽车等行业智能化升级
java·人工智能·python·金融·汽车·php
Hacker_Nightrain10 小时前
内网网络安全的解决之道
安全·web安全·php
坚毅不拔的柠檬柠檬21 小时前
AI革命下的多元生态:DeepSeek、ChatGPT、XAI、文心一言与通义千问的行业渗透与场景重构
人工智能·chatgpt·文心一言
猫头虎-人工智能1 天前
NVIDIA A100 SXM4与NVIDIA A100 PCIe版本区别深度对比:架构、性能与场景解析
gpt·架构·机器人·aigc·文心一言·palm
狂野小青年1 天前
在PHP Web开发中,实现异步处理有几种常见方式的优缺点,以及最佳实践推荐方法
消息队列·php·最佳实践·异步任务
张鱼小丸子1 天前
【无标题】云原生作业六
开发语言·php
哥坐11路2 天前
网络IP跳动问题解决详
开发语言·php