Перейти к содержанию
Rassol2

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

Рекомендуемые сообщения

Здравствуйте. 
Начал пытаться написать модуль для 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-решен

 

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 минуты назад, smartcoder сказал:

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

 

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

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

 

 

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

Изменено пользователем Rassol2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 минуты назад, Rassol2 сказал:

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

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

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а если реализовать цикл в 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 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.