【问题标题】:Communication between PHP and C++PHP 和 C++ 之间的通信
【发布时间】:2017-06-15 10:44:46
【问题描述】:

我想交流 PHP 和 C++ 代码。

我需要在它们之间传递一个大的 JSON。 问题是我目前使用的是“passthru”,但不知什么原因,C++代码并没有接收到整个参数,而是在JSON为3156的时候被截成了528个字符。

通过执行测试,我已经能够验证“passthru”命令支持的字符数多达 3156 个。但我不知道 C++ 中是否存在最大输入参数大小。

PHP应用如下:

passthru('programc++.exe '.$bigJSON, $returnVal);

C++ 应用程序:

int main(int argc, char* argv[]){
  char *json = argv[1];
}

有什么办法可以解决这个问题吗?我已经阅读了有关 PHP 扩展和 IPC 协议的信息,但问题是我必须做一个多平台程序(我必须有一个适用于 Windows 的版本,另一个适用于 Linux 和 Mac 的版本)。而且我认为使用 PHP 扩展和 IPC 协议(据我所知)会使事情变得相当复杂。

【问题讨论】:

  • $bigJSON escaped 正确吗?如果它在字符 528 附近包含未转义的空格,则它可能成为 C++ 应用程序的第二个参数。
  • 我不会将它作为参数传递,而是使用proc-open的输入输出流@
  • 我尝试使用“escapeshellarg”,问题是在 Windows 中,“espaceshellarg”会从 JSON 中删除双引号。而 C++ 中的 JSON 解释器需要它们 =(
  • 检查argc,如果它大于2,则发送的参数作为main中的多个参数接收
  • 非常感谢!我已经使用“proc_open”解决了它。我用解决方案编辑问题。

标签: php c++ json command-line parameters


【解决方案1】:

解决方案: 解决方案是使用“proc_open”并使用管道标准输入和标准输出。就我而言,我使用库 rapidjson。我在 PHP 中添加双引号以使 rapidJSON 工作并处理 JSON。 PHP:

$exe_command = 'program.exe';

$descriptorspec = array(
    0 => array("pipe", "r"),  // stdin
    1 => array("pipe", "w"),  // stdout -> we use this
    2 => array("pipe", "w")   // stderr 
);

$process = proc_open($exe_command, $descriptorspec, $pipes);
$returnValue = null;
if (is_resource($process)){
    fwrite($pipes[0], $bigJSON);
    fclose($pipes[0]);

    $returnValue = stream_get_contents($pipes[1]);
    fclose($pipes[1]);
}

C++:

int main(int argc, char* argv[]){
    std::string json;
    std::getline (std::cin, json);
    cout << json << endl; // The JSON
}

【讨论】:

    猜你喜欢
    • 2016-01-28
    • 2011-08-23
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 2013-10-18
    • 2011-08-08
    相关资源
    最近更新 更多