0

0

PHP实现浏览器与外部可执行二进制文件的实时交互

聖光之護

聖光之護

发布时间:2025-11-15 13:44:31

|

624人浏览过

|

来源于php中文网

原创

PHP实现浏览器与外部可执行二进制文件的实时交互

本文探讨了如何通过php在web浏览器中实现与外部可执行二进制文件的实时、交互式通信。虽然`proc_open()`能够执行外部程序并管理其i/o,但其默认模式难以满足即时双向交互的需求。为实现类似交互式shell的功能,核心方案是利用websockets建立浏览器与服务器间的持久连接,结合php后端对外部进程的异步控制,从而实现动态输入和实时输出。

在Web开发中,有时我们需要在服务器端执行一个外部的可执行二进制文件,并与它进行交互。例如,运行一个命令行工具、一个编译后的程序,甚至是模拟一个交互式Shell环境。PHP提供了proc_open()函数来启动外部进程并管理其标准输入(stdin)、标准输出(stdout)和标准错误(stderr)流。然而,要实现浏览器端与这些外部进程的实时、双向交互,并非简单地使用proc_open()就能完成。

使用 proc_open() 执行外部程序(非实时交互模式)

proc_open() 是PHP中用于执行外部命令并创建管道与子进程进行通信的强大工具。通过定义描述符数组,我们可以将子进程的stdin、stdout和stderr映射到PHP脚本可以读写的管道。

以下是一个典型的proc_open()用法示例,它演示了如何向外部程序一次性发送输入,并一次性读取其所有输出和错误:


// int main() {
//     int a, b;
//     std::cout << "Enter first number: ";
//     std::cin >> a;
//     std::cout << "Enter second number: ";
//     std::cin >> b;
//     std::cout << "Sum: " << a + b << std::endl;
//     return 0;
// }

$descriptorspec = [
    0 => ["pipe", "r"],  // 子进程的 stdin,PHP将写入
    1 => ["pipe", "w"],  // 子进程的 stdout,PHP将读取
    2 => ["pipe", "w"]   // 子进程的 stderr,PHP将读取
];

// 定义工作目录,确保编译和执行在正确的位置
$cwd = "/home/ixcoders/Desktop"; // 根据实际情况修改

// 编译C++程序并执行
// 注意:在实际生产环境中,通常不建议在运行时编译代码,而是预先编译好。
// 此处为了演示方便,将编译和执行放在一起。
$command = 'g++ test.cpp -o test.o && ./test.o';

$process = proc_open($command, $descriptorspec, $pipes, $cwd);

if (is_resource($process)) {
    // 准备发送给子进程的输入。
    // 例如,程序需要两个数字,我们提供 "4\n5"。
    // 注意:这里的输入是预先确定的,一次性写入。
    $inputs = "4\n5\n"; // 确保以换行符结束,模拟用户按下回车

    // 将输入写入子进程的 stdin 管道
    fwrite($pipes[0], $inputs);
    fclose($pipes[0]); // 关闭 stdin 管道,表示输入已发送完毕

    // 从子进程的 stdout 管道读取所有输出
    $stdout_output = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    // 从子进程的 stderr 管道读取所有错误
    $stderr_output = stream_get_contents($pipes[2]);
    fclose($pipes[2]);

    // 等待子进程结束并获取其返回码
    $return_value = proc_close($process);

    echo "--- Standard Output ---\n";
    echo $stdout_output;
    echo "\n--- Standard Error ---\n";
    echo $stderr_output;
    echo "\n--- Process Exit Code ---\n";
    echo "Exit Code: " . $return_value . "\n";
} else {
    echo "Failed to open process.\n";
}

?>

局限性: 上述proc_open()的用法适用于“一次性”批处理任务。它在进程启动后一次性写入所有输入,然后等待进程完成并一次性读取所有输出。这种模式无法满足“当二进制程序产生输出时立即发送到浏览器”或“当二进制程序请求用户输入时,用户从浏览器提供输入”的实时交互需求。HTTP的请求-响应模型本身也不支持这种持久的双向通信。

立即学习PHP免费学习笔记(深入)”;

10Web
10Web

AI驱动的WordPress网站自动构建器,托管和页面速度助推器

下载

核心方案:通过WebSockets实现实时交互

要实现浏览器与外部进程的实时、交互式通信,我们需要一个持久的双向通信通道。WebSockets是解决此问题的核心技术。

基本架构思想:

  1. 浏览器端 (WebSocket客户端):通过JavaScript建立与WebSocket服务器的连接,发送用户输入,接收并显示外部进程的输出。
  2. WebSocket服务器 (PHP/Node.js/Go等):这是一个长连接服务,负责维护与所有浏览器客户端的WebSocket连接。当接收到浏览器输入时,将其转发给PHP后端处理;当PHP后端从外部进程获取到输出时,通过WebSocket发送回浏览器。
  3. PHP后端 (结合 proc_open() ):在WebSocket服务器的控制下,PHP脚本负责启动外部二进制进程,并管理其I/O管道。它需要能够非阻塞地读取管道,并将数据传递给WebSocket服务器。

工作流程:

  1. 用户在浏览器中打开页面,JavaScript建立WebSocket连接到服务器。
  2. 当用户在浏览器中输入并发送时,数据通过WebSocket发送到WebSocket服务器。
  3. WebSocket服务器将用户输入转发给PHP后端。
  4. PHP后端将收到的输入写入到proc_open()创建的外部进程的stdin管道。
  5. 外部进程处理输入,并产生输出。
  6. PHP后端需要非阻塞地从外部进程的stdout和stderr管道读取数据。一旦有新数据,PHP将其发送回WebSocket服务器。
  7. WebSocket服务器接收到PHP后端的数据后,通过WebSocket将其发送回浏览器。
  8. 浏览器接收到数据并实时显示给用户。

**实现挑战与

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2022

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1345

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1251

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

948

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1402

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1231

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1440

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1303

2023.11.13

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.2万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号