Отменить все запросы залпа Android

Я пробовал различные команды выполнения PHP в Windows и обнаружил, что они сильно различаются.

  • Не работает для потоковой передачи: shell_exec, exec, passthru
  • Вид работ: proc_open, popen - «вид», потому что вы не можете передавать аргументы своей команде (т. е. не работать с my.exe --something, будет работать с _my_something.bat).

Наилучший (самый простой) подход:

  1. Вы должны убедиться, что ваш exe - команды промывки (см. проблема с промывкой printf ). Без этого вы, скорее всего, получите партии из примерно 4096 байтов текста, что бы вы ни делали.
  2. Если вы можете, используйте header('Content-Type: text/event-stream'); (вместо header('Content-Type: text/plain; charset=...');). Однако это не будет работать во всех браузерах / клиентах! Потоковая передача будет работать без этого, но по крайней мере первые строки будут буферизованы браузером.
  3. Вы также можете отключить кеш header('Cache-Control: no-cache');.
  4. Отключить буферизацию вывода (либо в php.ini или с помощью ini_set('output_buffering', 'off');). Это также может быть сделано в Apache / Nginx / любом сервере, который вы используете спереди.
  5. Поворот сжатия (либо в php.ini, либо с помощью 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);

21
задан Joe 3 October 2013 в 02:28
поделиться