Flex: Вывод файла C в режиме реального времени с помощью PHP+Flex?
У меня есть исполняемый файл на языке Си (с именем myprogram). Когда я запускаю его с помощью ./myprogram
, я получаю некоторые инструкции вывода на стандартном выходе моей оболочки Linux.
Я использовал run.php чтобы получить доступ ко всему, что выводится на стандартный вывод:
#run.php
<?php
$output = shell_exec('./myprogram');
echo $output;
?>
Затем я вызвал HTTPService с идентификатором="сервис", чтобы получить доступ к этому run.php файл, и я также установил для атрибута text текстовой области значение {service.lastResult}. Когда я запускаю свое приложение Flex, интерфейс на мгновение останавливается, а затем текстовая область отображает все 20 строк одновременно.
Но если программа запускается из оболочки Linux, они появляются один за другим.
Есть ли способ, с помощью которого я могу отобразить строку, как только она будет выведена на стандартный вывод? Это затем заставит текстовую область отображать выходные данные в режиме реального времени.
Или Flex не может этого сделать? Скорее, как программа PHP может достичь такого эффекта, т.е. показывать все, что печатается на стандартном выводе, одновременно в браузере в режиме реального времени?
Обновление: Давайте сделаем вопрос немного более конкретный и/или простой.
Моя программа выводит 20 строк каждая через несколько микросекунд. Я хочу, чтобы только первая строка стандартного вывода отображалась в текстовой области Flex или в браузере (но в режиме реального времени), в то время как программа может продолжить выполнение программы.
Не выглядит простым: P
3 answers
HTTP так не работает. Вы можете смоделировать это с помощью кометы. В Java вы можете использовать BlazeDS для передачи данных с сервера на flash-клиент.
Можете ли вы изменить исходный код программы на языке Си? Причиной такого поведения может быть то, что стандартный вывод в C буферизован по строкам, но только в том случае, если программа выполняется в терминале. Он будет буферизировать большие куски, если (он думает, что) стандартный вывод в файл или канал. Поэтому ваша программа на языке Си, возможно, не отправляет никаких данных до конца. Вы можете добавить вызовы fflush для принудительной печати данных:
#include <unistd.h>
#include <stdio.h>
int main(void) {
printf("Hi!\n");
fflush(stdout); /* Add this! */
sleep(3);
printf("Ho!\n");
return 0;
}
Я не тестировал его, но вы, возможно, захотите взглянуть на функцию passthru().
Редактировать: Это, вероятно, не будет работать напрямую из-за вашего косвенного обращения через {service.lastResult}. Я не знаком с flex, но я предполагаю, что это будет ждать завершения последнего результата, прежде чем быть уволенным. Поэтому вам придется найти альтернативу, которая позволит вам получить результат вызова службы, пока он все еще обрабатывается - я не знаю, является ли это возможно.
Основной смысл использования passthru()
заключается в том, что он будет напрямую отправлять вывод вызванной команды, давая вам, по крайней мере, шанс получить промежуточные результаты. exec()
, system()
и shell_exec()
, с другой стороны, вообще ничего не отправит до завершения, поэтому для начала не может быть обходного пути.