grok beta 模型转发php版本,测试通过

<?php
// 禁用输出缓冲
while (ob_get_level()) {
    ob_end_clean();
}
ob_implicit_flush(true);  // 禁止 PHP 输出缓冲

// 设置正确的响应头,告知客户端这是一个 SSE 流
header('Content-Type: text/event-stream');
header('Transfer-Encoding: chunked');


header('Cache-Control: no-cache');
header('Connection: keep-alive');

// 目标网址
$targetUrl = 'https://APi.x.ai'; // 目标 URL 替换为实际地址
// 获取原始请求数据
$requestData = file_get_contents('php://input');
// 获取原始请求头
$requestHeaders = getallheaders();
// 构建目标 URL
$targetUrl .= $_SERVER['REQUEST_URI'];
// 处理查询参数
$queryString = $_SERVER['QUERY_STRING'];
if (!empty($queryString)) {
    $targetUrl .= '?' . $queryString;
}

// 创建 cURL 句柄
$ch = curl_init();

// 设置 cURL 选项
curl_setopt($ch, CURLOPT_URL, $targetUrl); // 设置目标网址
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 不保存结果,直接输出
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $_SERVER['REQUEST_METHOD']); // 使用与原始请求相同的方法
curl_setopt($ch, CURLOPT_postFIELDS, $requestData); // 设置请求数据
curl_setopt($ch, CURLOPT_HTTPHEADER, formatRequestHeaders($requestHeaders)); // 设置请求头

// 禁用 ssl 验证
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 不验证对等证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 不验证主机名

// 启用调试信息
curl_setopt($ch, CURLOPT_VERBOSE, true);

// 设置回调函数,每次接收到数据时都输出
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $data) {
    // 每次接收到的数据都直接输出
    //echo $data;  // SSE 格式要求以 "data: " 开头,每个事件后加双换行
    
    
    // 逐字输出数据
    $chars = str_split($data); // 将数据按字符分割
    foreach ($chars as $char) {
        echo $char;
        ob_flush();  // 刷新 PHP 缓冲区
        flush();     // 刷新系统输出缓冲区
    }
    
    
    
    
    //ob_flush();  // 刷新 PHP 缓冲区
    //flush();     // 刷新系统输出缓冲区
    return strlen($data);  // 返回数据长度,告知 cURL 数据已处理
});

// 执行 cURL 请求
$response = curl_exec($ch);

// 检查是否有错误发生
if(curl_errno($ch)) {
    $error = curl_error($ch);
    http_response_code(500);
    // 处理错误
    echo 'cURL Error: ' . $error;
} else {
    // 获取响应的 HTTP 状态码
    $httpStatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    // 设置响应的 HTTP 状态码
    http_response_code($httpStatus);
}

// 关闭 cURL 句柄
curl_close($ch);

/**
 * 格式化请求头,将关联数组转换为字符串数组
 *
 * @param array $headers 关联数组的请求头
 * @return array 字符串数组的请求头
 */
function formatRequestHeaders($headers) {
    $formattedHeaders = [];
    foreach ($headers as $key => $value) {
        // 可以根据需要调整需要传递的头部字段
        if (in_array(strtolower($key), ['authorization', 'content-type'])) {
            $formattedHeaders[] = $key . ': ' . $value;
        }
    }
    return $formattedHeaders;
}

第一个版本:目前有bug就是会等待所有的内容输出完毕后才会输出。暂时可用,将就下吧。

目前这是第二版,已解决第一个版本的bug。


需要配置伪静态

if (!-e $request_filename) {

        rewrite ^(.*)$ /index.php$1 last;

    }


相关阅读

  • emeditor 配置 可以编辑 hex 16进制文件

    emeditor 配置 可以编辑 hex 16进制文件

    EmEditor 本身支持通过插件/功能配置实现 Hex 编辑功能。 实现方法:使用 EmEditor 的 Hex 模式EmEditor 内置了 Hex 编辑功能,无需安装第三方插件,只需简单配置即可启用,以下是完整的操作步骤: 步骤...

    2026.02.03 20:59:22作者:wintopTags:emeditorhex
  • RTX 3060(12GB显存)总结 PDF内容的智能大模型架构方案

    RTX 3060(12GB显存)总结 PDF内容的智能大模型架构方案

    显卡:RTX 3060(12GB显存)功能需求:“PDF文本总结”。下面是最优、效率最高的模型,同时明确部署方式和调优技巧,让总结速度和效果达到最佳平衡。 核心结论:最优模型选择对你的场景来说,Qwen2.5-7B-Instruct(通义...

    2026.01.22 20:04:09作者:wintop
  • python 多线程任务(下载)水平扩展线程

    python 多线程任务(下载)水平扩展线程

    方案架构说明这个方案由两个主要组件构成:任务分发器 (TaskDistributor)从 MySQL 数据库中获取待下载的文件将下载任务放入 Redis 队列标记文件状态为 "处理中"工作节点 (DownloadWork...

    2025.06.08 22:01:56作者:wintopTags:python
  • Python库实现PDF转HTML方法,可以提取目录TOC

    Python库实现PDF转HTML方法,可以提取目录TOC

    在Python中,要识别PDF中的目录(Table of Contents, TOC),通常有两种场景:直接提取PDF内置的书签(Bookmarks):如果PDF本身带有目录书签(例如电子书、技术文档),可以直接提取。自动分析文本结构推断目...

    2025.03.31 22:14:54作者:wintopTags:pythonpdf
  • grok beta 模型转发php版本,测试通过

    grok beta 模型转发php版本,测试通过

    <?php // 禁用输出缓冲 while (ob_get_level()) {     ob_end_clean(); } ob_implicit_fl...

    2024.11.26 20:32:33作者:wintop
  • FastAdmin如何在表单提交验证时不验证隐藏的元素

    FastAdmin如何在表单提交验证时不验证隐藏的元素

    在FastAdmin中使用的是nice-validator验证器,默认是验证表单中所有添加有验证规则的元素。如何在表单提交时不验证隐藏的元素呢?在nice-validator的选项中有一个ignore的选项。我们配置该值即可。首先打开控制器...

    2024.03.13 13:50:21作者:wintopTags:FastAdmin表单
  • php远程开机,远程唤醒(Wake-on-LAN)局域网电脑代码

    php远程开机,远程唤醒(Wake-on-LAN)局域网电脑代码

    首先要局域网电脑IP为固定IP,这样可以减少获取IP地址的步骤。要使用 PHP 来实现局域网中的远程唤醒(Wake-on-LAN),您可以通过以下步骤来完成:首先,确保您的服务器上已安装 PHP,并且具备发送网络数据包的权限。获取目标计算机...

    2024.03.10 11:33:33作者:wintopTags:php远程唤醒Wake-on-LAN局域网
  • Mysql 联合查询 主表和详细表查询方案

    Mysql 联合查询 主表和详细表查询方案

    mysql 多表联合查询示例:表aindex 为主表:CREATE TABLE `aindex` (  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,  `name` cha...

    2024.02.02 17:41:12作者:wintop

添加新评论