You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PHP实现Linux Screen的实时管理功能?

实现PHP SSH连接Screen的实时交互方案

依赖准备

用phpseclib的SSH2组件,它对交互式会话的支持比原生ssh2扩展更友好,通过Composer安装:

composer require phpseclib/phpseclib:~3.0

核心实现逻辑

要实现实时交互,不能用一次性的exec()执行命令,必须开启PTY伪终端并进入交互式shell,这样才能和Screen会话双向通信。

完整代码示例

<?php
require 'vendor/autoload.php';

use phpseclib3\Net\SSH2;

// 初始化SSH连接
$ssh = new SSH2('你的服务器IP');
if (!$ssh->login('用户名', '密码')) {
    exit('登录失败');
}

// 开启PTY伪终端,启用交互式环境
$ssh->enablePTY();
// 接入已有Screen会话,不存在则创建新会话
$ssh->exec('screen -x test-session 2>/dev/null || screen -S test-session');

// 设置流为非阻塞模式,避免脚本卡住
stream_set_blocking($ssh->getStdin(), false);
stream_set_blocking($ssh->getStdout(), false);

// 实时交互循环
while (true) {
    // 读取Screen的输出内容
    $output = $ssh->getStdout()->read(1024);
    if ($output) {
        echo $output;
        flush(); // 强制输出,确保实时性
    }

    // 读取用户输入(CLI环境下)
    $input = fgets(STDIN);
    if ($input) {
        $ssh->getStdin()->write($input);
    }

    // 加个小延迟,降低CPU占用
    usleep(100000);
}

额外注意事项

  • Web环境适配:如果要在网页上实现实时交互,必须搭配WebSocket(比如Ratchet库)。HTTP是短连接,没法维持实时通信,需要通过WebSocket把SSH的输出推给前端,前端的输入再通过WebSocket传给PHP处理。
  • 会话管理:可以用screen -list命令提前查看服务器上的已有会话,避免重复创建。退出时按Ctrl+A再按d可以 detach会话,保留后台运行;直接输入exit会关闭Screen会话。
  • 异常处理:要加连接断开的检测逻辑,一旦SSH连接中断,要重新发起连接并接入会话,避免脚本崩溃。
  • 权限问题:确保SSH登录用户有执行Screen命令的权限,部分服务器可能会限制普通用户使用Screen。

内容的提问来源于stack exchange,提问作者gorkem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:12:40