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 最后一行。
您看到的其他输出可能已写入 stderr
,system()
未捕获。
好吧,这太疯狂了,但已解决。程序 'program_name' 正在使用 fprintf() 保存一个小日志文件。 php 将在第一次调用 fprintf() 后忽略程序的所有输出...注释掉 fprintf() 并重新编译 program_name 解决了问题,现在 php 没有放弃中间,显然 php 与 OS X 上对 fprintf() 的调用不兼容???
所以我有一个 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 最后一行。
您看到的其他输出可能已写入 stderr
,system()
未捕获。
好吧,这太疯狂了,但已解决。程序 'program_name' 正在使用 fprintf() 保存一个小日志文件。 php 将在第一次调用 fprintf() 后忽略程序的所有输出...注释掉 fprintf() 并重新编译 program_name 解决了问题,现在 php 没有放弃中间,显然 php 与 OS X 上对 fprintf() 的调用不兼容???