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

相关推荐
m0_738120727 小时前
CTFshow系列——PHP特性Web93-96
开发语言·安全·web安全·php·ctfshow
@CLoudbays_Martin119 小时前
为什么动态视频业务内容不可以被CDN静态缓存?
java·运维·服务器·javascript·网络·python·php
learning_tom10 小时前
HTML图片标签及路径详解
linux·服务器·php
魔道不误砍柴功1 天前
Mac 能够连Wife,但是不能上网问题解决
网络·macos·php
搬码临时工1 天前
怎样让外网计算机访问局域网计算机?通过公网地址访问不同内网服务的设置方法
开发语言·php
Fortinet_CHINA2 天前
案例精述 | 防护即智能 Fortinet赋能英科全栈安全重构实践
安全·重构·php
BingoGo2 天前
PHP Swoole/WebMan/Laravel Octane 等长驻进程框架内存泄露诊断与解决方案
后端·php
站长朋友3 天前
香港主机支持PHP版本吗
开发语言·php·香港主机php版本·php 8.4支持·wordpress主机配置·香港主机性能对比·php版本兼容性测试
腾科张老师3 天前
Telnet 原理与配置
网络·智能路由器·php
lskblog3 天前
使用 PHP Imagick 扩展实现高质量 PDF 转图片功能
android·开发语言·前端·pdf·word·php·laravel