Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Реализация прерывания выполнения модуля.


Recommended Posts

Здравствуйте. 
Начал пытаться написать модуль для opencart , знаний у меня маловато, столкнулся с задачей которую не понимаю как решить. 
Есть в модуле 2 кнопки. 
Старт и стоп.

 

Обе кнопки отправляют post запрос в контролер модуля. 

Кнопка старт вызывает цикл который может выполнятся часами. Каждую итерацию он проверяет значения в базе данных, статус , если статус 1 то начинает новую итерацию, если 0 выходит из цикла. 
Кнопка стоп как раз выполняет функцию изменения статуса в базе данных. 


После нажатия старт браузер повисает и ждет ответа от php скрипта. И нету возможности нажать стоп. 
Решил попробовать ajax запрос, повесил на эти кнопки на ajax но оказалась ситуация не поменялась. (Я в php слабенький, а в javascript  только с путеводителем.)

Почитав ресурсы задавав вопросы мне сказали что связано это стем что php не даст параллельно выполнять два скрипта одному пользователю, и посоветовали смотреть в сторону

написания демона на php 

Вот теперь хочу узнать у гуру этого дела. Неужели нету возможности реализовать подобное без написания демона ? 
тот же модуль batch_editor если сделать сложную выборку товаров которая будет идти больше 20с можно прервать, нажав на кнопку стоп. Или там используется демон.
Как это делается ? куда глядеть ? 

Надіслати
Поділитися на інших сайтах

15 минут назад, Rassol2 сказал:

Кнопка старт вызывает цикл который может выполнятся часами.

max_execution_time он выполняется.

 

перед вашим запросом укажите

<? set_time_limit(180); //скрипт будет обрабатываться 3 минуты

 

и про принудительную остановку скрипта:

https://ru.stackoverflow.com/questions/264193/Принудительная-остановка-скрипта-php-решен

 

Надіслати
Поділитися на інших сайтах

4 минуты назад, smartcoder сказал:

max_execution_time он выполняется.

 

перед вашим запросом укажите

<? set_time_limit(180); //скрипт будет обрабатываться 3 минуты

 

 

это да.
Но хочется иметь полноценный интерфейс с возможностью запустить остановить. 
Иметь возможность запустить на пару секунд, позже остановить проверить все сделать правки и запустить снова. Когда все правки внесены верно запустить пока time limit не отключить скрипт. 

Змінено користувачем Rassol2
Надіслати
Поділитися на інших сайтах

2 минуты назад, Rassol2 сказал:

это да.
Но хочется иметь полноценный интерфейс с возможностью запустить остановить. 
Иметь возможность запустить на пару секунд, позже остановить проверить все сделать правки и запустить снова. Когда все правки внесены верно запустить пока time limit не отключить скрипт. 

яваскриптом сделайте переменную и проверяйте ее, равна ли единице перед каждым запросом

Надіслати
Поділитися на інших сайтах

а если реализовать цикл в php c определенным лимитом итераций?
Допустим, выполнили 10 итераций, отправили ответ в браузер. Вы на стороне браузера парсите этот ответ.
При этом проверяется статус кнопки стоп. Если была нажата, то останавливаете скрипт, если нет - отправляете запрос на следующие 10 итераций

  • +1 1
Надіслати
Поділитися на інших сайтах


1 минуту назад, smartcoder сказал:

яваскриптом сделайте переменную и проверяйте ее, равна ли единице перед каждым запросом

то есть сделать ход конем. 
В модуле по запросу делается ровно одна итерация и модуль выходит из цикла. 
А на javascript написать скрипт который будет в фоне висеть и давать запрос на выполнения. Пока не будет нажат кнопка стоп, в этом случаи javascript прекратит давать запрос. 
Так сказать вынести вечный цикл из php в js.

Согласен имеет право на жизнь. 
Блин теперь читать энциклопедию по javascript :( 

Надіслати
Поділитися на інших сайтах

1 минуту назад, thentru сказал:

а если реализовать цикл в php c определенным лимитом итераций?
Допустим, выполнили 10 итераций, отправили ответ в браузер. Вы на стороне браузера парсите этот ответ.
При этом проверяется статус кнопки стоп. Если была нажата, то останавливаете скрипт, если нет - отправляете запрос на следующие 10 итераций

Тоже интересное решение. 
По сути то что я только что выше описал. Вот в эту сторону покопаю, интересно мне это. 

Надіслати
Поділитися на інших сайтах

1 минуту назад, Rassol2 сказал:

Блин теперь читать энциклопедию по javascript

посмотрите принцип отправки сообщений через маркетинговые рассылки в админке

  • +1 1
Надіслати
Поділитися на інших сайтах


делаете php скрипт, который заранее известно, что он будет работать в пределах time_limit

 

по "старт" вы его запускаете аякксом
в конце работы скрипта, вы сохраняете его состояние
и отдаете браузеру ответ, что итерация закончена
аяксовый скрипт анализирует ответ и дает команду на запуск следующей итерации
И так до конца, пока все на закончится..

Т.е. никаких демонов не нужно
Демоном выступает браузер

Нет браузера, нет процесса.

  • +1 1
Надіслати
Поділитися на інших сайтах

4 минуты назад, Otvet сказал:

но в этом случае сильно затянется время обработки

А куда спешить?
Условно, 10к записей обрабатываются до 10сек
А если, например какой-нибудь парсинг или upload фото

Не все можно отдавать в фоновый процесс.
Поэтому - асинхронная обработка

Даже если это что-то фоновое, то ф этом процессе должен быть предусмотрен какой-то семафор. Самый простой вариант - проверить наличие файла.
Или какого-то  внешнего источника.

Ну мало задач в опенкарте для асинхронных процессов.
 Это может быть индексация текстов, фильтров, загрузки прайс листов и прочее.
Если это процесс долгий, а хостинг кривой? или процесс жрет много памяти - типа getAllProduct

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.