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

相关推荐
疯狂打码的少年18 小时前
【计算机网络】子网掩码与子网划分计算(含CIDR表示法)
服务器·笔记·计算机网络·php
cc_yy_zh21 小时前
学习使用kali抓包
服务器·学习·php
ao-weilai1 天前
Linux网络编程:网络知识基础
linux·网络·php
clz13145211 天前
设备反欺诈的四大支柱:从设备指纹到关联图谱
开发语言·php
PHP实战开发录1 天前
PHP脚本手动能跑定时任务却失败
开发语言·php·开发
彧azz2 天前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
CRMEB系统商城2 天前
CRMEB标准版系统(Java)v3.1正式发布
java·spring·微信小程序·php·教育电商
hui-梦苑2 天前
[PHP]轻量主题函数WordPress 集成 KaTeX 数学公式渲染
开发语言·php·wordpress·katex
企查查数据服务2 天前
全军禁入下客商准入风控,关联图谱与穿透核查
大数据·开发语言·数据库·php
狗凯之家源码网2 天前
全开源 H5 棋牌对战系统修复优化与二次开发实测
开源·php·棋牌对战