PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
ЧИМ
Отправлено: 21 Сентября, 2018 - 16:16:19
Post Id


Новичок


Покинул форум
Сообщений всего: 45
Дата рег-ции: Дек. 2016  


Помог: 0 раз(а)




Доброго времени суток! Подскажите, каким образом можно отправить выполняться скрипт в фоне на неопределённое время, но в тоже время мне нужен вывод который он организует в командную строку?
Ситуация следующая. Запускаю в линуксе определённый демон, со значениями логин и пароль и некоторыми командами уже при входе в демон, после чего идёт синхронизация данных. Вот мне нужно чтоб эта синхронизация данных была в фоне и страница её не ждала, но когда она закончится чтоб данные которые выдаст скрипт в консоль, записались в базу данных.
P.S. Сейчас выполняю это с помощью shell_exec, но страница долго крутится и уходить с неё нельзя. Да и смысла нет этот процесс пользователю ждать, так как он может длиться 5 минут и более.

(Отредактировано автором: 21 Сентября, 2018 - 16:20:54)

 
 Top
Мелкий Супермодератор
Отправлено: 21 Сентября, 2018 - 16:44:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 11721
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 588 раз(а)




Архитектура правильная - очереди:
поставить сервер очередей
из веба ставится задача в очередь, как-то регистрируется что вот такая задача от вот того пользователя и ничего больше не ждёт
серверный процесс (да хоть из крона) опрашивает, есть ли новые задачи в очереди. Если есть - выполняет и сохраняет куда-нибудь результат
веб может в любое время уточнять, выполнена ли уже задача и получать результат


-----
PostgreSQL DBA
 
 Top
ЧИМ
Отправлено: 21 Сентября, 2018 - 22:13:31
Post Id


Новичок


Покинул форум
Сообщений всего: 45
Дата рег-ции: Дек. 2016  


Помог: 0 раз(а)




Мелкий пишет:
Архитектура правильная - очереди:
поставить сервер очередей
из веба ставится задача в очередь, как-то регистрируется что вот такая задача от вот того пользователя и ничего больше не ждёт
серверный процесс (да хоть из крона) опрашивает, есть ли новые задачи в очереди. Если есть - выполняет и сохраняет куда-нибудь результат
веб может в любое время уточнять, выполнена ли уже задача и получать результат


Дело в том что с cron нельзя, потому как передаются данные о логине и пароле. Они должны быть только в памяти на момент запроса, а позже нигде не светиться. Если отдавать это задание крону то получается что это потенциальная дыра.
 
 Top
LIME
Отправлено: 23 Сентября, 2018 - 13:59:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 10044
Дата рег-ции: Нояб. 2010  


Помог: 299 раз(а)




reactPhp
https://www[dot]youtube[dot]com/watch?v=39TUy0XiNqQ
(Добавление)
Мелкий уже некоторое время как необязательно хотеть очереди и/или ноду


-----
вау
я кажется понял жастЮзера!!!
 
 Top
ЧИМ
Отправлено: 23 Сентября, 2018 - 16:49:06
Post Id


Новичок


Покинул форум
Сообщений всего: 45
Дата рег-ции: Дек. 2016  


Помог: 0 раз(а)




LIME пишет:
reactPhp
https://www[dot]youtube[dot]com/watch?v=39TUy0XiNqQ
(Добавление)
Мелкий уже некоторое время как необязательно хотеть очереди и/или ноду

Спасибо! Ушёл смотреть и читать доки. Даже не знал об этом.
 
 Top
ЧИМ
Отправлено: 26 Сентября, 2018 - 10:34:03
Post Id


Новичок


Покинул форум
Сообщений всего: 45
Дата рег-ции: Дек. 2016  


Помог: 0 раз(а)




Вот на этой странице http://php.net/manual/ru/refs.fi...cess.process.php куча всякой всячины. Много чего именно для обработки веб запросов асинхронным способом.
Копание во всех этих темах меня натолкнуло на одну статью где описывалось как запустить shell в отдельном процессе и не ждать его окончания. Но это всё равно не то. Т.е. Скрипт выполняется, php пытается его всё же дождаться, но если мы перейдём на другую страницу, то скрипт будет выполняться в памяти пока не выполнится до конца, но вот если мы останемся на странице которая запросила его выполнение, то он будет ждать ответа от обработки скрипта пока не наступит окончание таймаута, затем просто выдаст чистый лист. В том видео что вы скинули, парен очень толково говорит про асинхронные запросы, но к сожалению я так и не понял каким макаром можно выполнить асинхронно shell и затем не дожидаясь его окончания можно было работать в программе, а когда скрипт будет выполнен, он автоматически выполнит пользовательскую функцию в которой например написано, мол такие вот данные занеси в базу. Опишу последовательность действий:
1. Выполняется многострочный скрипт(например):
CODE (htmlphp):
скопировать код в буфер обмена
  1. "bash <<'END'
  2. cd dt
  3. model --data /$login/$pass << EOF | tee -a log.txt
  4. $passw
  5. sync
  6. save
  7. EOF 2> /dev/null & echo $!");"

2. В момент синхронизации создаётся файлик с которым можно работать только после окончания процесса полной синхронизации данных. Соответственно мне нужно знать когда будет окончен процесс синхронизации(видимо нужно получить PID и мониторить его), например путём создания lock файла в текущей директории и удалением его в момент окончания синхронизации.
3. Нужно чтоб процесс с определённым тайм аутом, скажем в 3 секунды опрашивал состояние запущенного процесса(после синхронизации процесс выгрузится из памяти).
4. Когда увидит что процесса с данным PID нет в памяти -> запустить функцию обращения к файлу и записи данных в базу.

Вопрос. Как это сделать именно в фоне? Возможно ли чтоб php держал в памяти скрипт и выполнил его только после окончании синхронизации?
У меня в голову просто только дин вариант приходит. Вешать на страницу header скрипт ajax который будет с интервалом мониторить наличие lock файла или PID процесса синхронизации и после выполнять необходимый php скрипт. Но а как же асинхронная модель? Как её реализовать в таком случае?

(Отредактировано автором: 26 Сентября, 2018 - 10:36:04)

 
 Top
LIME
Отправлено: 26 Сентября, 2018 - 11:43:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 10044
Дата рег-ции: Нояб. 2010  


Помог: 299 раз(а)




ЧИМ пишет:
парен очень толково говорит про асинхронные запросы, но к сожалению я так и не понял каким макаром можно выполнить асинхронно shell
зачем тебе shell?
парень объясняет как можно юзнуть готовые библиотеки
асинхронное действие описываешь тут же в калбэке
погугли что такое libevent и eventloop
(Добавление)
вот тут поищи может что найдется
https://reactphp[dot]org/event-loop/


-----
вау
я кажется понял жастЮзера!!!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Операционная система и системные вызовы »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB