AJAX - индикатор выполнения для команды оболочки, которая выполняется - PullRequest
1 голос
/ 05 февраля 2009

Я использую AJAX на своем сайте, и я хотел бы показать пользователям прогресс файла, который загружается моим сервером.

Загрузка выполняется скриптом, который выводит процент в оболочку . Я хотел бы передать эту информацию пользователю, используя AJAX. Как я могу это сделать?

Спасибо за любую помощь и направление.

Я надеюсь, что ваши решения не включают запись в текстовый файл и получение этого процента из текстового файла !! Я думаю, слишком много над головой.

РЕДАКТИРОВАТЬ - Подробнее

Это команда оболочки Linux - Fedora Core 10.

В настоящее время вывод оболочки выглядит следующим образом:

[download]   9.9% of 10.09M at 10.62M/s ETA 00:00

Процент изменяется, и я хочу зафиксировать это и отправить его обратно пользователю при его изменении.

Чтобы выполнить это, я использую функцию PHPs exec ().

Ответы [ 3 ]

3 голосов
/ 05 февраля 2009

Вместо exec вы можете использовать popen . Это даст вам дескриптор, который вы используете с fread, чтобы получить результат, который генерирует ваша команда, как это происходит.

Вам нужно будет проанализировать обновления, которые он вносит в индикатор процента. Если у вас есть эти данные, есть несколько способов передать их клиенту, например, с толчком в стиле " комета " или запросите Ajax-запрос на обновления.

0 голосов
/ 17 июня 2009

Я работаю над аналогичной проблемой. Я должен проанализировать вывод моего скрипта конвертации видео. Я использую popen и анализирую вывод возвращенных resource. Сначала я использовал fgets, но обновленные значения не распознавались как новые строки. Поэтому я создал простую функцию, которая принимает необязательный $arg_delimiter, чтобы вы могли проверять другие типы возврата, такие как chr(13) возврат cariage. Пример кода немного изменен и поэтому не проверен, потому что в моем случае эти функции были методами моего объекта синтаксического анализатора.

function get_line ($arg_handle, $arg_delimiter = NULL)
{
  $delimiter = (NULL !== $arg_delimiter) ? $arg_delimiter : chr(10);
  $result    = array();

  while ( ! feof($arg_handle))
  {
    $currentCharacter = fgetc($arg_handle);

    if ($delimiter === $currentCharacter)
    {
      return implode('', $result);
    }

    $result[] = $currentCharacter;
  }

  return implode('', $result);
}

Я просто перебираю результаты из popen() resource следующим образом:

  $command = '/usr/bin/yourcommand';
  $handle  = popen($command . ' 2>&1', 'r');

  while ( ! feof($handle))
  {
    $line = get_line($handle, chr(13));

    preg_match($yourParserRegex, $line, $data);

    if (count($data) > 0)
    {
      printf("<script type='text/javascript'>\n  //<![CDATA[\n    window.alert('Result: %s');\n  // ]]>\n</script>"
            ,$data[1]
            );
      flush();
    }

  }

Теперь все, что вам нужно сделать, это выяснить, кометы вещи.

0 голосов
/ 05 февраля 2009

Я не пробовал это, но я думаю, что этот подход будет работать.

Вам нужно три штуки:

  1. Сценарий оболочки должен выводить свой поток на netcat, подключенный к порту
  2. Сценарий php прослушивает поток, поступающий с указанного порта для входящих данных, обновляет запись в memcache или какой-либо базе данных с процентом завершения.
  3. Периодически ваш веб-скрипт совершает ajax-вызовы на сервер, который проверяет это значение в вашем бэкэнд-хранилище.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...