PHP+AJAX - отображение результатов работы еще работающего скрипта

Fludimir

Новичок
PHP+AJAX - отображение результатов работы еще работающего скрипта

Есть скрипт, который например - будет перезаливать файлы со своего сервера на фтп другого файлы по списку. Это естественно займет определенное время, скрипт будет работать с set_time_limit(0);
Скрипт после загрузки каждого файла будет допустим делать echo "имя файла" , соответствено интервал между этими "эхами" будет достаточно большим. Как мне с помощью аякса(под JQuery) выводить эти имена файлов сразу же как файл загружен, а не все вместе в конце работы скрипта? Как вообще делается вывод информации в подобных случаях?

PHP 5.2, работает как mod_php в апаче
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: Fludimir
Есть скрипт, который например - будет перезаливать файлы со своего сервера на фтп другого файлы по списку. Это естественно займет определенное время, скрипт будет работать с set_time_limit(0);
Скрипт после загрузки каждого файла будет допустим делать echo "имя файла" , соответствено интервал между этими "эхами" будет достаточно большим. Как мне с помощью аякса(под JQuery) выводить эти имена файлов сразу же как файл загружен, а не все вместе в конце работы скрипта? Как вообще делается вывод информации в подобных случаях?
Запускаешь скрипт закачки в бэкграунд, заставляешь его гадить в какой-то лог-файл. На странице по setInterval() / setTimeout() периодически пускаешь ajax-запросы, которые будут возвращать и выводить содержимое этого лог-файла.
 

Fludimir

Новичок
А именно так как я описал решить мою задачку нельзя? С лог файлом решение понятно, но интересовало именно потоковое получение данных аяксом. Просто страничка в браузере то будет грузиться пока сервер не разорвет соединение, и результат отобразится сразу же как данные придут с сервера
 

Fortop

Новичок
но интересовало именно потоковое получение данных аяксом. Просто страничка в браузере то будет грузиться пока сервер не разорвет соединение, и результат отобразится сразу же как данные придут с сервера
А Вы в курсе, что на каждое такое соединение будет висеть процесс apache?
 

Fludimir

Новичок
Почему процесс? один поток на такое соединение будет висеть, это понятно и не критично, в большинстве случаев более одного соединения одновременно открыто не будет
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Мне одному кажется, что подобные задачи вообще надо решать в фоновом режиме? И запуская явно не через браузер...
 

dimagolov

Новичок
c0dex, об этом было сказано в первом ответе. Но Fludimir китайский комсомолец и ему обязательно надо стоя и в гамаке.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
dimagolov
ай, блин, да, прочитал первый ответ, отвлекся, а потом вернулся в тему и забыл(
 

Fludimir

Новичок
Задачу с копированием файлов с сервера на сервер я привел просто как пример, я же не её прошу помочь решить, а спросил совершенно о другом. Да и "подобные задачи" всеравно может быть нужно позволить запустить именно из браузера, а далеко не всегда у пользователя под которым работает апач есть права позволяющие поставить задание в крон или запустить скрипт отдельно от апача. Так все же, можно ли сделать то что я написал в первом посте?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Fludimir
ты занимаешься решением сферической задачи в вакууме, никакой конкретной задачи перед тобой не стоит и ты хочешь просто из-за повального желания "сделать все ВЕБ-ДВА-НОЛЬНО" намутить непонятный механизм взаимодействия с сервером через ajax? тебе дали ответ как это сделать, пиши лог и опрашивай этот лог каждые 10 (20,30,60) секунд.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: Fludimir
...а далеко не всегда у пользователя под которым работает апач есть права позволяющие поставить задание в крон или запустить скрипт отдельно от апача.
Купи хостинг за 6 баксов, а не за 5.

Так все же, можно ли сделать то что я написал в первом посте?
Можно, но никакой ajax для этого не нужен: просто запускаешь процесс в той же страничке, гадишь через echo и делаешь flush().
 

Fludimir

Новичок
c0dex
А аяксом опрашивать логфайл это не так же "ВЕБ-ДВА-НОЛЬНО"? Или чтобы не делать вебдванольно надо это сделать исключительно на отдельной странице? )

Sad Spirit
Вообще, для решения текущих задач меня вполне устроит и запуск скрипта из-под апача. Но если уже все так советуют все это делать в фоне - было бы неплохо пояснить как это сделать, с кроном я не работал, и как запустить внешнее приложение так чтобы пхп скрипт не висел в памяти до завершения тоже не знаю, кажется все пхпшные функции для запуска внешних приложений ждут окончания их работы.
И что в таком случае должно быть разрешено / нужно разрешить пользователю, из-под которого работает апач?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: Fludimir
Вообще, для решения текущих задач меня вполне устроит и запуск скрипта из-под апача. Но если уже все так советуют все это делать в фоне - было бы неплохо пояснить как это сделать, с кроном я не работал, и как запустить внешнее приложение так чтобы пхп скрипт не висел в памяти до завершения тоже не знаю, кажется все пхпшные функции для запуска внешних приложений ждут окончания их работы.
PHP:
        if (substr(PHP_OS, 0, 3) == 'WIN') {
            pclose(popen('start ' . $command, 'r'));
        } else {
            exec($command . ' > /dev/null 2>&1 &');
        }
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Fludimir
ну ajax даст тебе возможность вывести данные в том месте страницы, где тебе надо, если есть задача писать в какой-нибудь div или еще куда. А вот как с flush быть - не знаю, не использовал.
 

ksnk

прохожий
А что вы на человека набросились? Вполне разумный, с определённой точки зрения, вопрос. Можно подумать, что слово comet на этом форуме никто не слышал...

Обычный способ реализации взаимодействия долгоисполняющегося процесса, информацию о котором нужно получать как можно более реактивно - открытие скрипта, который выводит свое состояние в скрытом фрейме.
Каждый этап исполения заключается в выплевывании в выходящий поток, (совместно со всякими flush и ob_flush по вкусу) чего-то такого
PHP:
<script>
progress_indicator(45,'теперь копируем базу'); </script>
<!-- многа пробелов -->
в начале текста, который помещается в этот скрипт - нужно побеспокоится, чтобы этот самый progress_indicator действительно вызывал нужную функцию в основном окне...

А так - за деталями - искать в гугле по слову comet. Можно нарыть как правильные, так и доступные дешевые реализации.
 

Fortop

Новичок
ksnk
comet, тут как бы не причем, равно как и туалетный утенок :)
не та задача.
 

weregod

unserializer
ksnk
другая задача, решение Вашей хорошо понятно

по задаче:
хранить в сессии имя уникального файла, содержащего имя текущего копируемого файла или что-то другое
AJAX-ом получать контент именно этого уникального файла
 
Сверху