Я пробовал различные команды выполнения PHP в Windows и обнаружил, что они сильно различаются.
shell_exec
, exec
, passthru
proc_open
, popen
- «вид», потому что вы не можете передавать аргументы своей команде (т. е. не работать с my.exe --something
, будет работать с _my_something.bat
). Наилучший (самый простой) подход:
header('Content-Type: text/event-stream');
(вместо header('Content-Type: text/plain; charset=...');
). Однако это не будет работать во всех браузерах / клиентах! Потоковая передача будет работать без этого, но по крайней мере первые строки будут буферизованы браузером. header('Cache-Control: no-cache');
. ini_set('output_buffering', 'off');
). Это также может быть сделано в Apache / Nginx / любом сервере, который вы используете спереди. ini_set('zlib.output_compression', false);
). Это также может быть сделано в Apache / Nginx / любом сервере, который вы используете спереди. Итак, в вашей программе на C ++ вы делаете что-то вроде этого (опять же, для других решений см. printf проблема с промывкой ):
Logger::log(...) {
printf (text);
fflush(stdout);
}
В PHP вы делаете что-то вроде:
function setupStreaming() {
// Turn off output buffering
ini_set('output_buffering', 'off');
// Turn off PHP output compression
ini_set('zlib.output_compression', false);
// Disable Apache output buffering/compression
if (function_exists('apache_setenv')) {
apache_setenv('no-gzip', '1');
apache_setenv('dont-vary', '1');
}
}
function runStreamingCommand($cmd){
echo "\nrunning $cmd\n";
system($cmd);
}
...
setupStreaming();
runStreamingCommand($cmd);