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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Выполнение длительного скрипта в фоне

 PHP.SU

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


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

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


Новичок


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


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




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

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

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



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


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


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




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


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


Новичок


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


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




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


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


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


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


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




reactPhp
https://www[dot]youtube[dot]com/watch?v=39TUy0XiNqQ
(Добавление)
Мелкий уже некоторое время как необязательно хотеть очереди и/или ноду
 
 Top
ЧИМ
Отправлено: 23 Сентября, 2018 - 16:49:06
Post Id


Новичок


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


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




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

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


Новичок


Покинул форум
Сообщений всего: 49
Дата рег-ции: Дек. 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


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


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


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




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


Новичок


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


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




Чёт не вкурю никак я с этим 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.
 
 Top
ЧИМ
Отправлено: 27 Октября, 2018 - 09:23:44
Post Id


Новичок


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


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




Оказалось, то чего я хотел не возможно сделать не породив ещё один процесс php. Теперь вроде бы всё нормально работает.
 
 Top
LIME
Отправлено: 27 Октября, 2018 - 10:16:22
Post Id


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


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


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




Да-да
Только хотел показать пример с $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 украдет ваши драгоценные акки)))

(Отредактировано автором: 27 Октября, 2018 - 10:45:39)

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


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB