IIS 配置 PHP 流式输出不生效

| 选择喜欢的代码风格  

IIS 流式 PHP 配置增加节点 :


在调用 ob_flush()flush() 不生效(页面总是一直等,等 Load 到 100% 一次性渲染出来,而不似乎 Stream 流方式输出到浏览器),请检查 IIS 中是否有 web.config 里加入类似配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers>
            <remove name="PHP_FastCGI" />
            <add name="PHP_FastCGI" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="[path .. ]\php-cgi.exe" responseBufferLimit="0"/>
        </handlers>
        ...
    </system.webServer>
</configuration>

IIS 流式 PHP 配置扩展遇到的坑:


不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。配置错误 不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault="Deny"),或者是通过包含 overrideMode="Deny" 或旧有的 allowOverride="false" 的位置标记明确设置的。 配置文件 \\?\X(盘符):\目录名\目录名\web.config

解决办法:


全新 IIS 采用了更安全的 web.config 管理机制,默认情况下会锁住配置项不允许更改。要取消锁定可以以管理员身份运行命令行:

# 如果是 handlers 被 IIS 锁定
%windir%\system32\inetsrv\appcmd.exe unlock config -section:system.webServer/handlers

# 如果 modules 被 IIS 锁定
%windir%\system32\inetsrv\appcmd.exe unlock config -section:system.webServer/modules

Stream 流式输出题外话:


推荐一个 OpenAI PHP 异步客户端,适用于 workerman 和 webman:

# Install
composer create-project workerman/webman
cd webman

composer require webman/openai

Chat with stream - 流式输出

<?php
namespace app\controller;
use support\Request;

use Webman\Openai\Chat;
use Workerman\Protocols\Http\Chunk;

class ChatController
{
    public function completions(Request $request)
    {
        $connection = $request->connection;
        $chat = new Chat(['apikey' => 'sk-xx', 'api' => 'https://api.openai.com']);
        $chat->completions(
            [
                'model' => 'gpt-3.5-turbo',
                'stream' => true,
                'messages' => [['role' => 'user', 'content' => 'hello']],
            ], [
            'stream' => function($data) use ($connection) {
                $connection->send(new Chunk(json_encode($data, JSON_UNESCAPED_UNICODE) . "\n"));
            },
            'complete' => function($result, $response) use ($connection) {
                if (isset($result['error'])) {
                    $connection->send(new Chunk(json_encode($result, JSON_UNESCAPED_UNICODE) . "\n"));
                }
                $connection->send(new Chunk(''));
            },
        ]);
        return response()->withHeaders([
            "Transfer-Encoding" => "chunked",
        ]);
    }
}

IIS 流式配置扩展阅读:




发表评论