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


相关推荐: 《七读免费小说》开通会员方法  iPhone14开启Apple TV遥控设置  Animex动漫社正版在线入口 Animex动漫社动漫官方观看网  Symfony路由参数转换器:实体存在性验证与错误处理策略  windows server2019显卡驱动怎么安装_winserver2019显卡驱动安装与远程桌面优化  《淘宝联盟》推广自己的店铺方法  windows10怎么开启wsl_windows10安装linux子系统教程  微信注销后银行卡解绑了吗_微信注销后银行卡解绑状态  《单词速记宝》设置学习计划方法  192.168.1.1路由器后台入口 192.168.1.1默认登录入口  汽水音乐官方网站登录入口_汽水音乐网页版进入链接  如何配置VS Code作为您Git操作的默认编辑器  VS Code中的Tailwind CSS IntelliSense插件使用技巧  《搜书吧》阅读书籍方法  解决Windows上Composer PATH变量冲突导致的命令无法识别问题  苹果官网国补入口在哪  从HTML表单获取逗号分隔值并转换为NumPy数组进行预测  我的世界游戏平台入口 我的世界官方官网直达链接  C++如何实现单例模式_C++线程安全的单例模式写法  三星A55应用闪退排查步骤_Samsung A55稳定性优化技巧  Python测试中模块导入路径解析的最佳实践  FullCalendar自定义按钮样式定制指南  汽车之家网页版免费登录_汽车之家官网首页直接进入  J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践  C++怎么解决数值计算中的精度问题_C++浮点数误差与数值稳定性分析  c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化  海外搜索引擎推广效果怎么样,怎么分析效果!  动漫岛在线动漫网 动漫岛动漫在线观看官方入口  word文档行距怎么调?word文档调行距的操作步骤  解决Go encoding/json 将JSON大数字解析为浮点数的问题  VS Code源代码管理(SCM)视图的进阶使用技巧  Linux如何优化系统启动流程_Linux启动项优化方案  使用 .htaccess 正确配置 WordPress 子目录重定向与路径保留  《米姆米姆哈》米姆获取及技能攻略  抖音小程序怎么开通?小程序开通条件是什么?  《红果免费短剧》下载观看方法  如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建?  深入理解J*aScript异步操作:setTimeout与调用栈的真相  Yandex俄罗斯搜索引擎官网入口 Yandex网页端直接访问  Lar*el Eloquent:高效删除多对多关系中无关联子记录的父模型  Mac hosts文件在哪里_Mac修改hosts文件详细教程  Selenium自动化:利用键盘模拟解决复杂日期输入框输入问题  wps文字怎么设置文字环绕图片的方式_wps文字如何设置文字环绕图片方式  Composer如何使用composer-plugin-api开发自定义插件  微博网页版访问入口 微博网页版网页端使用指南  苹果11如何更换iCloud账号_苹果11账号切换的具体步骤  创客贴登录页面入口 创客贴网页版最新网址链接  修复UI元素交互障碍:从“开始”按钮到信息框的平滑过渡实现  苹果17 Pro如何启用分屏浏览_iPhone 17 Pro分屏浏览设置步骤  苹果电脑如何快速查看电池状态 苹果电脑电池信息快捷方法 

 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.