Php 在web应用程序中运行.exe并与此.exe实时通信

Php 在web应用程序中运行.exe并与此.exe实时通信,php,windows,ipc,Php,Windows,Ipc,我的PHP web应用程序从流接收数据。加载页面后,我需要使用system()或exec()打开一个.exe文件,短时间后新数据将出现,因此我必须为此.exe键入特定命令以获取其返回值,我该如何操作 我只能在命令提示符下手动执行此操作 path/to/.exe :: hit 'Enter' command1 params1 //... 您要查找的是proc\u open() 这将允许您使用STDIO流与单独的进程通信 PHP文档中的示例: $descriptorspec=数组( 0=>arra

我的PHP web应用程序从流接收数据。加载页面后,我需要使用
system()
exec()
打开一个
.exe
文件,短时间后新数据将出现,因此我必须为此
.exe
键入特定命令以获取其返回值,我该如何操作

我只能在命令提示符下手动执行此操作

path/to/.exe :: hit 'Enter'
command1 params1
//...

您要查找的是
proc\u open()

这将允许您使用STDIO流与单独的进程通信

PHP文档中的示例:
$descriptorspec=数组(
0=>array(“pipe”,“r”),//stdin是子级将从中读取的管道
1=>array(“pipe”,“w”),//stdout是子级将写入的管道
2=>array(“file”,“/tmp/error output.txt”,“a”)///stderr是一个要写入的文件
);
$cwd='/tmp';
$env=array('some_option'=>'aeiou');
$process=proc_open('php',$descriptorspec,$pipes,$cwd,$env);
如果(是_资源($process)){
//$pipes现在看起来如下所示:
//0=>连接到子标准的可写句柄
//1=>连接到子标准输出的可读句柄
//任何错误输出都将附加到/tmp/error-output.txt
fwrite($pipes[0],'');
fclose($pipes[0]);
回波流获取内容($pipes[1]);
fclose($pipes[1]);
//在呼叫之前关闭所有管道非常重要
//程序关闭以避免死锁
$return\u value=proc\u close($process);
echo“命令返回$return\u值\n”;
}

如果你需要多个侦听器,你也可以考虑共享内存,但是这个场景听起来好像你会受益于使用一个队列。 文件

示例

// Send
if (msg_queue_exists(12345)) {
  $mqh = msg_get_queue(12345);
  $result = msg_send($mqh , 1, 'data', true);
}

// Receive
$mqh = msg_get_queue(12345, 0666);
$mqst = msg_stat_queue($mqh);
while ($mqst['msg_qnum']) {
  msg_receive($mqh, 0, $msgtype, 2048, $data, true);
  // Spawn your process
  $mqst = msg_stat_queue($mqh);
}
编辑


信号量函数在Windows上不可用,如上所述,您最好的选择是使用(单向)或双向支持。

寻找打开进程和管道的方法。这些被称为标准输入和标准输出。IIRC这是用PHP编写的。(流程打开。)相关问题中有一些示例代码:这不是问题的答案。你应该把这作为我的评论。这不是关于消息队列或共享内存,而是关于通过管道/句柄的进程间通信(IPC)。也许您应该在评论之前阅读文档。这是IPC的一种方法,但不是通过管道,而是通过共享内存。当OP询问.exe文件时,我假设这是windows,您所建议的不是可行的选项。请看:-然而,一般来说,你是对的,共享内存是IPC的一种方式-但在这种情况下不是。OP没有说明解决方案必须包括管道-该死的,我忘了它在windows上不可用。。。抢手货我将编辑答案只是建议OP应该切换操作系统,因此+1表示您的解决方案;)
// Send
if (msg_queue_exists(12345)) {
  $mqh = msg_get_queue(12345);
  $result = msg_send($mqh , 1, 'data', true);
}

// Receive
$mqh = msg_get_queue(12345, 0666);
$mqst = msg_stat_queue($mqh);
while ($mqst['msg_qnum']) {
  msg_receive($mqh, 0, $msgtype, 2048, $data, true);
  // Spawn your process
  $mqst = msg_stat_queue($mqh);
}