php 使用 system()/shell_exec()/exec() 运行终端应用程序,但只显示了一半的输出

php runs terminal app with system()/shell_exec()/exec() but only half of the output shows up

所以我有一个 php 脚本:

<?php
    error_reporting(E_ALL);
    //print_r($_GET);
    $command = '../../build/program_name ' . $_GET['arg_id'];
    $command .= ' -test '.$_GET['arg1'].' '.$_GET['arg2'];


    //echo $command . "\n";
    //system('pwd');
    //system('ls -la ../../build');

    //system('../../build/program_name 17 -test 125 1500 2>&1');
    //passthru('../../build/program_name 17 -test 125 1500');
    system('../../build/program_name 17 -test 125 1500');
    //system($command);
    //$data = exec($command);
    //var_dump($data);

    //echo $data;
    //echo "\n";
?>

简单版:

<?php
    error_reporting(E_ALL);

    system('../../build/program_name 17 -test 125 1500');
?>

这个输出是:

argv[0] = ../../build/program_name
argv[1] = 17
argv[2] = -test
argv[3] = 125
argv[4] = 1500
argc = 5 so appears to be test request.
TEST(125, 1500) test requested.

如果我 运行 终端中的命令但是输出是:

argv[0] = ../../build/program_name
argv[1] = 17
argv[2] = -test
argv[3] = 125
argv[4] = 1500
argc = 5 so appears to be test request.
TEST(125, 1500) test requested.
{ "function": "test" , "inputs": [125.000000, 1500.000000], "output": 999.000000}

当 php 运行 使用完全相同的命令时,最后一位输出(重要部分)没有显示...我已经打印了工作目录和命令为了验证我实际上 运行 正确地执行了命令,结果在 exec、shell_exec 和系统中始终相同....我只是对正在发生的事情一头雾水这里...

编辑:关于 'program_name' 的附加信息这是一个极其简化的版本。它的 C++:

    float arg1;
    float arg2;
    if(argc == 5){
        arg1 = atof(argv[3]);
        arg2 = atof(argv[4]);
    } else {
        cout << "please supply appropriate args" << endl;
        return -1;
    }
    #ifdef DEBUG
        cout << "TEST(" << arg1 << ", " << arg2 << ") test requested." << endl;
    #endif

    float output = test(arg1, arg2);

    string jsonOut = "{ ";
    jsonOut.append(
            "\"function\": \"test\" , ").append(
            "\"inputs\": [").append(to_string(arg1)).append(", ").append(to_string(arg2)).append("], ").append(
            "\"output\": ").append(to_string(output)).append("}");
    cout << jsonOut << endl;
    return 0;

使用 passthru() 而不是 system()。区别在于 passthru() 将命令的输出传递给 PHP 的输出,而 system() 捕获输出并 returns 最后一行。

您看到的其他输出可能已写入 stderrsystem() 未捕获。

好吧,这太疯狂了,但已解决。程序 'program_name' 正在使用 fprintf() 保存一个小日志文件。 php 将在第一次调用 fprintf() 后忽略程序的所有输出...注释掉 fprintf() 并重新编译 program_name 解决了问题,现在 php 没有放弃中间,显然 php 与 OS X 上对 fprintf() 的调用不兼容???