2016-10-01 4 views
1

я реализовал сценарий SAAS с моим сервером Windows: пользователь может загрузить файл в a website, то Fetch.exe является приложение закодирован in C# размещается на сервере, Fetch.exe принимает загруженный файл в качестве входных данных, выполняют и генерирует вывод для загрузки для пользователя.Прогресс бара для применения

Так что в моем PHP, я использую exec обернуть Fetch.exe:

exec("Fetch.exe " . $inputFile . " > " . $outputFile) 

Загрузка и выполнение (т.е. Fetch.exe) может занять больше, чем несколько секунд, и я хочу, чтобы показать пользователю, что он обрабатывает и все идет хорошо.

Я нашел несколько тем, которые обсуждают, как показать индикатор выполнения для загрузки. Принимая во внимание, знает ли кто-нибудь, что я могу сделать, чтобы показать приблизительный прогресс Fetch.exe? Должен ли я разбить его на более мелкие приложения и использовать несколько exec?

+0

Как выглядит вывод 'Fetch.exe'? – LeonardChallis

+0

Это просто текст, который может быть коротким или длинным. Чтобы обработать 'inputFile' и сгенерировать этот текст, это может занять несколько секунд из-за анализа за ... – SoftTimur

+0

вам нужен процентный прогресс или только информация о загрузке? – Cesar

ответ

2

Вы можете поставить Fetch.exe со случайно сгенерированным идентификатором из php, например, из функции uniqueid. Fetch.exe создаст файл с именем <uniqueid>.txt с процентом прогресса. В браузере вы можете вызвать другой скрипт с этим уникальным идентификатором, чтобы получить содержимое этого файла .txt. Для того, что бы что-то вроде этого:

  • Пользователь загружает файл в PHP
  • PHP:
    • обрабатывает загруженный файл
    • создает UniqueID
    • начинается с Fetch.exe файл и уникальныйID
    • возвращает страницу с уникальным встроенным идентификатором

происходит следующее параллельно:

  • Fetch.exe создает текстовый файл под названием /progress/uniqueid.txt с UniqueID в качестве имени. Он регистрирует прогресс в нем.
  • Браузер делает вызов AJAX для http://example.com/progress/uniqueid.txt и показывает ход пользователя

И, наконец, когда прогресс достигает 100% браузер загружает файл. Единственное, что вы можете добавить, это обрезка файлов прогресса через некоторое время. Скажем, вы удаляете все файлы старше 10 минут каждый час.

1

Ваша PHP-программа нуждается в способе знать состояние подпроцесса (приложение Fetch.exe), поэтому Fetch.exe необходимо отправить информацию о состоянии обработки, самый естественный способ сделать это - через стандартный output (стандартный вывод - это информация, предоставляющая программу при ее запуске из cmd).

Зная это, вы можете запускать и продолжать читать subprocess output from php using popen().

И secod, вы можете использовать PHP ob_flush() и flush() с onmessage javascript event установить коммуникацию со своей страницы клиента с Запуск PHP скрипт, here вы можете найти хороший учебник о том, как это сделать.

Смежные вопросы