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

server/2024/9/29 23:51:50/

<?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.ppmy.cn/server/124704.html

相关文章

亚信安全发布第34期《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件91起&#xff0c;近三周勒索事件数量较为稳定。从整体上看&#xff0c;Ransomhub是影响最严重的勒索家族&#xff1b;Play和ElDorado恶意家族也是两个活动频繁的恶意家族&#xff0c;需要注意防范。本周&#xff0c;土耳其公司巴克皮…

深入探讨AI 神经网络:类型、特点与创新应用

一、引言 1.1 背景 随着科技的飞速发展,人工智能已经成为当今社会的热门领域。在人工智能的发展过程中,神经网络扮演着至关重要的角色。神经网络是一种模拟人类大脑神经元结构的计算模型,它通过大量的神经元相互连接并进行信息处理,从而实现对数据的分析和预测。不同类型…

图像增强论文精读笔记-Deep Retinex Decomposition for Low-Light Enhancement(Retinex-Net)

1. 论文基本信息 论文标题&#xff1a;Deep Retinex Decomposition for Low-Light Enhancement 作者&#xff1a;Chen Wei等 发表时间和期刊&#xff1a;2018&#xff1b;BMVC 论文链接&#xff1a;https://arxiv.org/abs/1808.04560 2. 研究背景和动机 低光照条件下拍摄的…

笔记整理—内核!启动!—linux应用编程、网络编程部分(5)系统时间与信息

两个时钟名词的概念&#xff0c;GMT为格林尼治时间&#xff0c;以格林尼治时间为全球统一时间。UTC为协调时间&#xff0c;按照市区进行不同地区时间的换算。 对于计算机而言&#xff0c;时间分点时间与段时间。点时间精确到某一时间&#xff1b;段时间顾名思义为一段时间&…

微商伙伴软件功能介绍

微商伙伴软件功能介绍 这款软件名为微商伙伴 MICRO BUSINESS PARTNER 9.0&#xff0c;具有以下功能&#xff1a; 一、新增功能 新消息提醒功能&#xff08;所有消息完美接收&#xff0c;包括红包消息&#xff09;。主程序升级为 6.5.5 版本&#xff08;图片编辑/小程序/大视…

【hot100-java】【划分字母区间】

R9-贪心算法篇 印象题&#xff1a; 我记得&#xff0c;先用字典记录每个字母出现的下标&#xff0c;取出首个字母的下标j,然后我们for循环遍历一次&#xff0c;如果该下标大于 j&#xff0c;就要变化新的首字母&#xff0c;如果相等就说明一个字符串完成&#xff0c;如果小于就…

一钉多用:自攻螺钉在家居与工业领域的广泛应用

自攻螺钉的结构要素有哪些重要特点&#xff1f; 自攻螺钉适用于非金属或软金属&#xff0c;不需要配合预先开好的孔和攻牙。自攻螺钉的尖头设计使其能够“自我攻入”材料中&#xff1b;而普通螺丝通常是平头&#xff0c;规格一致。自攻螺钉的关键在于&#xff0c;打孔时不需要进…

物联网系统中基于IIC通信的数字温度传感器测温方案

01 物联网系统中为什么要使用数字式温度传感器芯片 物联网系统中使用数字式温度传感器芯片的原因主要有以下几点&#xff1a; 高精度与稳定性 高精度测量&#xff1a;数字式温度传感器芯片&#xff0c;如DS18B20&#xff0c;采用芯片集成技术&#xff0c;能够有效抑制外界不…