当前位置: 首页 > article >正文

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


http://www.kler.cn/a/325317.html

相关文章:

  • LabVIEW中的UDP与TCP比较
  • spring-cache concurrentHashMap 自定义过期时间
  • Python如何获取request response body
  • 概率论公式整理
  • 【机器学习】机器学习中用到的高等数学知识-1.线性代数 (Linear Algebra)
  • web——sqliabs靶场——第六关——报错注入和布尔盲注
  • 解决错误Cloning failed using an ssh key for authentication
  • android system_server进程
  • 【QT 开发日志】QT 基础控件详解:按钮、文本框与标签的使用
  • AlmaLinux 安裝JDK8
  • 嵌入式学习--LinuxDay04
  • 设计模式之模版方法模式
  • 低代码可视化-uniapp蓝牙标签打印-代码生成器
  • 天龙八部怀旧单机微改人面桃花+安装教程+GM工具+虚拟机一键端
  • @overload实际并无作用
  • C# 调用虚拟打印,尝试隐藏进度窗体
  • AfuseKt1.3.6-10110功能强大的安卓网络视频播放器,支持多种在线存储和媒体管理平台!
  • The First项目报告:解读跨链互操作性平台Wormhole
  • 点餐小程序实战教程13餐桌管理
  • 雷池 WAF 如何配置才能正确获取到源 IP
  • GAMES101(作业8)
  • MySQL 加字段锁表怎么解决??
  • 情感短视频素材上哪里找?推荐几个热门情感视频素材资源网站
  • CEPH的写入流程
  • @JsonFormat与@DateTimeFormat的区别
  • 智能监控,守护绿色能源:EasyCVR在电站视频监控中心的一站式解决方案