2017-06-15 99 views
1

我想溝通PHP和C++代碼。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協議(據我所知)使事情複雜化了很多。

+2

是'$ bigJSON' [逃脫](http://php.net/manual/en/function.escapeshellarg.php)是否正確?如果它包含字符528附近的未轉義空格,它可能成爲C++應用程序的第二個參數。 – rickdenhaan

+2

而不是將它作爲參數傳遞我會使用[proc-open](http://php.net/manual/en/function.proc-open.php)輸入輸出流 –

+0

我嘗試使用「escapeshellarg」,問題是,在Windows中,「espaceshellarg」從JSON中刪除雙引號。而且C++中的JSON解釋器需要它們=( –

回答

0

解決方案: 解決方法是使用「proc_open」並使用管道stdin和stdout。就我而言,我使用庫rapidjson。我在PHP中添加雙引號以便快速處理JSON並處理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 
}