Доброго времени суток! Подскажите, каким образом можно отправить выполняться скрипт в фоне на неопределённое время, но в тоже время мне нужен вывод который он организует в командную строку?
Ситуация следующая. Запускаю в линуксе определённый демон, со значениями логин и пароль и некоторыми командами уже при входе в демон, после чего идёт синхронизация данных. Вот мне нужно чтоб эта синхронизация данных была в фоне и страница её не ждала, но когда она закончится чтоб данные которые выдаст скрипт в консоль, записались в базу данных.
P.S. Сейчас выполняю это с помощью shell_exec, но страница долго крутится и уходить с неё нельзя. Да и смысла нет этот процесс пользователю ждать, так как он может длиться 5 минут и более.
1. ЧИМ - 21 Сентября, 2018 - 16:16:19 - перейти к сообщению
2. Мелкий - 21 Сентября, 2018 - 16:44:56 - перейти к сообщению
Архитектура правильная - очереди:
поставить сервер очередей
из веба ставится задача в очередь, как-то регистрируется что вот такая задача от вот того пользователя и ничего больше не ждёт
серверный процесс (да хоть из крона) опрашивает, есть ли новые задачи в очереди. Если есть - выполняет и сохраняет куда-нибудь результат
веб может в любое время уточнять, выполнена ли уже задача и получать результат
поставить сервер очередей
из веба ставится задача в очередь, как-то регистрируется что вот такая задача от вот того пользователя и ничего больше не ждёт
серверный процесс (да хоть из крона) опрашивает, есть ли новые задачи в очереди. Если есть - выполняет и сохраняет куда-нибудь результат
веб может в любое время уточнять, выполнена ли уже задача и получать результат
3. ЧИМ - 21 Сентября, 2018 - 22:13:31 - перейти к сообщению
Мелкий пишет:
Архитектура правильная - очереди:
поставить сервер очередей
из веба ставится задача в очередь, как-то регистрируется что вот такая задача от вот того пользователя и ничего больше не ждёт
серверный процесс (да хоть из крона) опрашивает, есть ли новые задачи в очереди. Если есть - выполняет и сохраняет куда-нибудь результат
веб может в любое время уточнять, выполнена ли уже задача и получать результат
поставить сервер очередей
из веба ставится задача в очередь, как-то регистрируется что вот такая задача от вот того пользователя и ничего больше не ждёт
серверный процесс (да хоть из крона) опрашивает, есть ли новые задачи в очереди. Если есть - выполняет и сохраняет куда-нибудь результат
веб может в любое время уточнять, выполнена ли уже задача и получать результат
Дело в том что с cron нельзя, потому как передаются данные о логине и пароле. Они должны быть только в памяти на момент запроса, а позже нигде не светиться. Если отдавать это задание крону то получается что это потенциальная дыра.
4. LIME - 23 Сентября, 2018 - 13:59:50 - перейти к сообщению
reactPhp
https://www[dot]youtube[dot]com/watch?v=39TUy0XiNqQ
(Добавление)
Мелкий уже некоторое время как необязательно хотеть очереди и/или ноду
https://www[dot]youtube[dot]com/watch?v=39TUy0XiNqQ
(Добавление)
Мелкий уже некоторое время как необязательно хотеть очереди и/или ноду
5. ЧИМ - 23 Сентября, 2018 - 16:49:06 - перейти к сообщению
LIME пишет:
reactPhp
https://www[dot]youtube[dot]com/watch?v=39TUy0XiNqQ
(Добавление)
Мелкий уже некоторое время как необязательно хотеть очереди и/или ноду
https://www[dot]youtube[dot]com/watch?v=39TUy0XiNqQ
(Добавление)
Мелкий уже некоторое время как необязательно хотеть очереди и/или ноду
Спасибо! Ушёл смотреть и читать доки. Даже не знал об этом.
6. ЧИМ - 26 Сентября, 2018 - 10:34:03 - перейти к сообщению
Вот на этой странице http://php.net/manual/ru/refs.fi...cess.process.php куча всякой всячины. Много чего именно для обработки веб запросов асинхронным способом.
Копание во всех этих темах меня натолкнуло на одну статью где описывалось как запустить shell в отдельном процессе и не ждать его окончания. Но это всё равно не то. Т.е. Скрипт выполняется, php пытается его всё же дождаться, но если мы перейдём на другую страницу, то скрипт будет выполняться в памяти пока не выполнится до конца, но вот если мы останемся на странице которая запросила его выполнение, то он будет ждать ответа от обработки скрипта пока не наступит окончание таймаута, затем просто выдаст чистый лист. В том видео что вы скинули, парен очень толково говорит про асинхронные запросы, но к сожалению я так и не понял каким макаром можно выполнить асинхронно shell и затем не дожидаясь его окончания можно было работать в программе, а когда скрипт будет выполнен, он автоматически выполнит пользовательскую функцию в которой например написано, мол такие вот данные занеси в базу. Опишу последовательность действий:
1. Выполняется многострочный скрипт(например):
Копание во всех этих темах меня натолкнуло на одну статью где описывалось как запустить shell в отдельном процессе и не ждать его окончания. Но это всё равно не то. Т.е. Скрипт выполняется, php пытается его всё же дождаться, но если мы перейдём на другую страницу, то скрипт будет выполняться в памяти пока не выполнится до конца, но вот если мы останемся на странице которая запросила его выполнение, то он будет ждать ответа от обработки скрипта пока не наступит окончание таймаута, затем просто выдаст чистый лист. В том видео что вы скинули, парен очень толково говорит про асинхронные запросы, но к сожалению я так и не понял каким макаром можно выполнить асинхронно shell и затем не дожидаясь его окончания можно было работать в программе, а когда скрипт будет выполнен, он автоматически выполнит пользовательскую функцию в которой например написано, мол такие вот данные занеси в базу. Опишу последовательность действий:
1. Выполняется многострочный скрипт(например):
2. В момент синхронизации создаётся файлик с которым можно работать только после окончания процесса полной синхронизации данных. Соответственно мне нужно знать когда будет окончен процесс синхронизации(видимо нужно получить PID и мониторить его), например путём создания lock файла в текущей директории и удалением его в момент окончания синхронизации.
3. Нужно чтоб процесс с определённым тайм аутом, скажем в 3 секунды опрашивал состояние запущенного процесса(после синхронизации процесс выгрузится из памяти).
4. Когда увидит что процесса с данным PID нет в памяти -> запустить функцию обращения к файлу и записи данных в базу.
Вопрос. Как это сделать именно в фоне? Возможно ли чтоб php держал в памяти скрипт и выполнил его только после окончании синхронизации?
У меня в голову просто только дин вариант приходит. Вешать на страницу header скрипт ajax который будет с интервалом мониторить наличие lock файла или PID процесса синхронизации и после выполнять необходимый php скрипт. Но а как же асинхронная модель? Как её реализовать в таком случае?