以下是一个使用纯PHP实现的简单Web终端,并实现实时获取终端返回内容的示例代码:

<?php
// 设置响应头,指定为文本类型
header('Content-Type: text/plain');

// 创建一个终端进程
$process = proc_open('bash', [
    0 => ['pipe', 'r'], // 标准输入
    1 => ['pipe', 'w'], // 标准输出
    2 => ['pipe', 'w'], // 标准错误输出
], $pipes);

if (is_resource($process)) {
    // 设置非阻塞模式
    stream_set_blocking($pipes[1], 0);
    stream_set_blocking($pipes[2], 0);

    // 获取终端输出
    while (true) {
        // 读取标准输出和标准错误输出
        $stdout = stream_get_contents($pipes[1]);
        $stderr = stream_get_contents($pipes[2]);

        // 如果输出不为空,则发送给客户端
        if (!empty($stdout) || !empty($stderr)) {
            echo $stdout;
            echo $stderr;
            flush(); // 立即刷新缓冲区,将内容发送给客户端

            // 如果终端输出结束,则退出循环
            if (feof($pipes[1]) && feof($pipes[2])) {
                break;
            }
        }

        // 等待一段时间后再次读取输出
        usleep(100000); // 0.1秒
    }

    // 关闭进程和管道
    fclose($pipes[0]);
    fclose($pipes[1]);
    fclose($pipes[2]);
    proc_close($process);
}

在上述代码中,我们使用proc_open函数创建一个bash终端进程,并通过管道获取其标准输出和标准错误输出。然后循环读取输出内容,并发送给客户端。通过设置非阻塞模式,可以实现实时获取终端返回内容。在每次读取输出后,我们使用flush函数立即将内容发送给客户端,以实现实时的效果。循环会等待一段时间后再次读取输出,以避免频繁读取和发送数据导致性能问题。

请注意,以上代码只是一个简单示例,可能存在安全风险和性能问题。在实际应用中,请根据具体需求进行适当的安全性和性能优化

标签: 常规


原文地址: https://cveoy.top/t/topic/iWcg 著作权归作者所有。请勿转载和采集!