Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Выполнение длительного скрипта в фоне
Форумы портала PHP.SU » » Операционная система и системные вызовы » Выполнение длительного скрипта в фоне

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

1. ЧИМ - 21 Сентября, 2018 - 16:16:19 - перейти к сообщению
Доброго времени суток! Подскажите, каким образом можно отправить выполняться скрипт в фоне на неопределённое время, но в тоже время мне нужен вывод который он организует в командную строку?
Ситуация следующая. Запускаю в линуксе определённый демон, со значениями логин и пароль и некоторыми командами уже при входе в демон, после чего идёт синхронизация данных. Вот мне нужно чтоб эта синхронизация данных была в фоне и страница её не ждала, но когда она закончится чтоб данные которые выдаст скрипт в консоль, записались в базу данных.
P.S. Сейчас выполняю это с помощью shell_exec, но страница долго крутится и уходить с неё нельзя. Да и смысла нет этот процесс пользователю ждать, так как он может длиться 5 минут и более.
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
(Добавление)
Мелкий уже некоторое время как необязательно хотеть очереди и/или ноду
5. ЧИМ - 23 Сентября, 2018 - 16:49:06 - перейти к сообщению
LIME пишет:
reactPhp
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. Выполняется многострочный скрипт(например):
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 скрипт. Но а как же асинхронная модель? Как её реализовать в таком случае?
7. LIME - 26 Сентября, 2018 - 11:43:39 - перейти к сообщению
ЧИМ пишет:
парен очень толково говорит про асинхронные запросы, но к сожалению я так и не понял каким макаром можно выполнить асинхронно shell
зачем тебе shell?
парень объясняет как можно юзнуть готовые библиотеки
асинхронное действие описываешь тут же в калбэке
погугли что такое libevent и eventloop
(Добавление)
вот тут поищи может что найдется
https://reactphp[dot]org/event-loop/
8. ЧИМ - 19 Октября, 2018 - 13:44:36 - перейти к сообщению
Чёт не вкурю никак я с этим EventLoop!
Вот пример моего кода:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. require '/home/chim/vendor/autoload.php';
  3. $loop = React\EventLoop\Factory::create();
  4. $login='test';
  5. $pass='test';
  6. $loop->addTimer(0.1, function () {
  7.  
  8. $command=shell_exec("bash <<'END'
  9. cd dt
  10. model --data /$login/$pass << EOF | tee -a log.txt
  11. $pass
  12. sync
  13. save
  14. EOF");
  15. print "Первое действие\n";
  16. });
  17. print "Второе действие\n";
  18. $loop->run();
  19.  

Но ни так, ни так:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. require '/home/chim/vendor/autoload.php';
  3. $loop = React\EventLoop\Factory::create();
  4. $login='test';
  5. $pass='test';
  6. $loop->addTimer(0.1, function () {
  7.  
  8.  
  9. print "Первое действие\n";
  10.  
  11. });
  12. $command=shell_exec("bash <<'END'
  13. cd dt
  14. model --data /$login/$pass << EOF | tee -a log.txt
  15. $pass
  16. sync
  17. save
  18. EOF");
  19. print "Второе действие\n";
  20. $loop->run();
  21.  


Ничёго не выходит. Процесс выполняется не в фоне, а постоянно зависшая вкладка которая просто вешает PHP.
9. ЧИМ - 27 Октября, 2018 - 09:23:44 - перейти к сообщению
Оказалось, то чего я хотел не возможно сделать не породив ещё один процесс php. Теперь вроде бы всё нормально работает.
10. LIME - 27 Октября, 2018 - 10:16:22 - перейти к сообщению
Да-да
Только хотел показать пример с $loop->childProcess
На самом деле на продакшн делают какой-нибудь rabbitMq
Но react это будущее
Гуглить и изучать
(Добавление)
ЧИМ пишет:
то чего я хотел не возможно сделать не породив ещё один процесс php.
можно но не надо
(Добавление)
https://www[dot]youtube[dot]com/watch?v=n6Iasl6bx4M (смотреть обязательно)
автор который есть на самом сайте реакта (шляпа для саморекламы но для новичка самое то):
https://www[dot]youtube[dot]com/channel/[dot][dot][dot]Np4EabJD7PyCOzGw
http://turbobit[dot]net/ao08yx5mnjkd[dot]html (для знакомства с реактом и в принципе остальное можно не хотеть видеть)
(Добавление)
ЧИМ пишет:
Теперь вроде бы всё нормально работает.
еще бы тебе websockets
гугли wamp2
есть готовые библы и на фронт и на бэк
(Добавление)
ЧИМ пишет:
Дело в том что с cron нельзя, потому как передаются данные о логине и пароле.
шифровать ключем
и не пихать себе мозг
тоже вариант
ато вдруг ми5 украдет ваши драгоценные акки)))

 

Powered by ExBB FM 1.0 RC1