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()用法示例,它演示了如何向外部程序一次性发送输入,并一次性读取其所有输出和错误:

<?php

// 假设有一个名为 test.cpp 的C++程序,编译后生成 test.o
// test.cpp 内容可能如下:
// #include <iostream>
// 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的请求-响应模型本身也不支持这种持久的双向通信。

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

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

Animate AI Animate AI

Animate AI是个一站式AI动画故事视频生成工具

Animate AI 234 查看详情 Animate AI

基本架构思想:

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

工作流程:

  1. 用户在浏览器中打开页面,J*aScript建立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中文网其它相关文章!


# 怎么看  # 天津视频seo排名方案  # 河东区电焊面罩网站建设  # seo锚文本怎么设置  # 密云区服装网站建设  # 品牌营销推广有哪些  # 凉山州建设网站  # 网站爱采购好还是优化好  # 网站推广排名优化方案  # 深圳网站营销推广源码  # 工业废金属回收网站建设  # 器中  # 是一个  # 客户端  # 转发给  # 制程  # php  # 发送到  # 将其  # 可执行  # a  # 后端  # 工具  # websocket  # 浏览器  # go  # node  # node.js  # js  # java  # javascript 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 《随手记》启用语音备注方法  快手网页版官方访问 快手网页版页面在线打开  C++如何实现矩阵乘法_C++二维数组矩阵运算代码示例  mysql中如何分析索引使用情况_mysql索引使用分析方法  BunnyStream TUS视频上传指南:解决401认证错误与参数配置  京东物流快递破损了怎么办_京东快递破损理赔流程  《深林》冬季章节图文攻略  J*a中的值传递到底指什么_值传递模型在参数传递中的真正含义说明  实时数据流中高效查找最小值与最大值  如何在CSS中使用伪类:valid实现表单验证提示_结合:valid改变边框颜色  如何通过settings.json个性化您的VS Code体验  mail.qq.com登录入口 QQ邮箱网页版直达  c++中的const关键字用法大全_c++ const正确使用指南  抖音号显示企业机构号是什么意思?企业机构号申请条件是什么?  《地下城堡4:骑士与破碎编年史》墓穴挑战125攻略  解决J*aScript动态图片上传中ID重复问题:在同一页面显示多张独立图片  狙击外星人小游戏在线链接_狙击外星人小游戏网页链接  抖音小程序怎么开通?小程序开通条件是什么?  Win10怎么设置快速启动 Win10开启快速启动设置方法  鸿蒙单条备忘录如何加密  使用document.execCommand实现Web文本编辑器加粗/取消加粗  《红果免费短剧》下载观看方法  composer 提示 "requires ext-soap" 缺少 SOAP 扩展怎么办?  PHP中动态类名访问的类实例类型提示与静态分析实践  汽水音乐车机版 汽水音乐车机版官方入口  Keras中Convolution2D层及其核心辅助层详解  《磁力猫》最好用的磁官网  LINUX怎么查看显卡信息_LINUX查看GPU状态  mysql通配符能用于日志查询吗_mysql通配符在系统日志查询中的实际使用方法  批改网官网首页登录 批改网学生用户登录入口  c++如何使用std::thread::join和detach_c++线程生命周期管理  VB表达式书写规则解析  qq音乐官方网站入口_qq音乐在线听歌网页版链接  c++如何掌握指针的核心用法_c++指针入门到精通指南  铁路12306座位怎么选_12306官方选座操作方法  C++ priority_queue怎么用_C++优先队列底层实现与自定义比较器  英国搜索:多数英国人认为语言搜索是未来搜索  QQ网站入口直接登录 QQ官方正版登录页面  漫蛙app官方版手机正版入口-漫蛙漫画manwa在线漫画正版入口  J*aScript与HTML元素交互:图片点击事件与链接处理教程  C++ cast类型转换总结_C++ reinterpret_cast与const_cast的使用  J*aScript文本高亮功能优化:解决多词匹配错误与精确分割策略  优化响应式标题底部边框:CSS实现技巧与最佳实践  海棠阅读登录教程_详细讲解海棠登录操作  lol小红书怎么|直播|?lol小红书|直播|是什么意思?  《海底捞》点外卖方法  win11怎么更改账户类型 Win11标准用户和管理员权限切换【教程】  Retrofit根路径POST请求:@POST("/") 的应用与解析  怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】  Golang如何初始化module项目_Golang module init使用说明 

 2025-11-15

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.