【问题标题】:pass large data between programs in c++ and php在 C++ 和 php 程序之间传递大数据
【发布时间】:2015-09-28 16:01:34
【问题描述】:

我需要在linux上开发两个程序:cpp_prog是一个用c++写的小程序。它监视消息队列系统。一旦消息在队列系统中可用,程序就会下载消息,然后调用另一个 php 程序,比如 php_prog,来处理消息并从 php_prog 读取输出。当 php_prog 完成后,cpp_prog 将重新获得控制权并再次监听消息队列系统。这个过程将永远持续下去。

我的问题是如何将大数据从 c++ 传递到 php 并读取 php 程序的输出。

消息可能很长,所以c++中的系统调用system("php_prog message_string");不是一个好的选择。

我也尝试过使用 fifo。在 cpp_prog 中

int fifo = open(fifo_name.c_str(), O_WRONLY);
write(fifo, msg_string.c_str(), strlen(msg_string.c_str()));
close(fifo);
system("php_prog fifo_name"); //call php_prog with fifo name

在 php_prog 中:

$fifo = $argv[1];
var_dump($fifo);
$str_content = file_get_contents($fifo);
echo "here is msg\n";
var_dump($str_content);
echo "end\n";

但是 cpp_prog 被阻止,直到我从其他地方(例如终端)调用“php_prog fifo_name”来读取 fifo。

我愿意接受任何建议(但我真的会避免使用 tmp 文件)。如果能提供简单的代码就好了。

BR

【问题讨论】:

  • 您是否考虑过编写一个 PHP 模块,它只从队列中弹出一个大对象并将其作为字符串返回给 PHP?除此之外,使用例如文件或共享内存是我会考虑的两种方法。甚至可以在共享内存之上使用 ZeroMQ 作为 IPC,以实现轻松扩展和快速原型设计。
  • 感谢您的帮助。但是指定了使用c++获取消息和php解析的系统架构。很遗憾,我无法改变这一点。

标签: php c++ fifo


【解决方案1】:

我终于在c++中使用popen,在php中使用file_get_contents来解决这个问题。

在 cpp_prog 中:

FILE* fp = popen(cmd.c_str(), "w");
fwrite(msg_string.c_str(), sizeof (char), msg_string.size(), fp);
fflush(fp);
pclose(fp);

在 php_prog 中:

$msg_content = file_get_contents("php://stdin");
echo "here is msg\n";
var_dump($msg_content);
echo "end\n";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    相关资源
    最近更新 更多