Jump to content
покупайте без комиссии
Search In
  • More options...
Find results that contain...
Find results in...
  • Sign Up

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


Recommended Posts

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

 

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

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


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

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

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

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

Link to post
Share on other sites
Guest smartcoder
15 минут назад, Rassol2 сказал:

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

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

 

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

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

 

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

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

 

Link to post
Share on other sites
4 минуты назад, smartcoder сказал:

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

 

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

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

 

 

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

Edited by Rassol2
Link to post
Share on other sites
Guest smartcoder
2 минуты назад, Rassol2 сказал:

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

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

Link to post
Share on other sites

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

  • +1 1
Link to post
Share on other sites

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

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

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

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

Link to post
Share on other sites
1 минуту назад, thentru сказал:

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

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

Link to post
Share on other sites
1 минуту назад, Rassol2 сказал:

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

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

  • +1 1
Link to post
Share on other sites

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

 

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

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

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

  • +1 1
Link to post
Share on other sites
4 минуты назад, Otvet сказал:

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

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

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

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

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

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.