Администратор Magento не будет загружаться при выполнении другого действия

#magento #admin

#магенто #администратор #magento

Вопрос:

У меня есть свой собственный контроллер в Magento, который был выполнен, следуя приведенным здесь рекомендациям:http://alanstorm.com/magento_admin_controllers

Мой контроллер расширяет Mage_Adminhtml_Controller_Action, и внутри есть метод:

 public function myAction() {
    sleep(1000);
    die('I am done');
}
  

Когда этот метод запущен, я не могу загрузить какие-либо другие страницы администратора Magento. В конечном итоге они загрузятся сразу после завершения описанного выше метода.
Кроме того, интерфейс работает нормально, выполнение того же самого действия с контроллера интерфейса не приводит к зависанию Magento подобным образом.

Есть какие-нибудь решения, чтобы сохранить мой метод в Admin, и пока этот метод запущен, остальная часть admin должна оставаться доступной? Самое длительное время выполнения этого процесса составляет около 4-5 часов, и он импортирует продукты. Да, у меня также настроен cron, но я хотел бы предоставить пользователю возможность инициализировать процессы по своему усмотрению.

Ответ №1:

Это особенность.

Обходной путь заключается в использовании двух браузеров, например Firefox Chrome, Firefox Opera и так далее.

Для выполнения этих задач лучше использовать два браузера, так как вы не хотите, чтобы сбой в других вкладках прерывал ваш импорт.

Я знаю, что это не углубленный программный ответ, хотя иногда боковое решение работает.

Комментарии:

1. Да, из другого браузера это работает, но какая часть кода проверяет это? Я вызываю метод с помощью fsockopen и передаю ему файл cookie adminhtml. Я пытался передать какую-то другую строку пользовательского агента, но, похоже, это не решает проблему. Кто-нибудь знает, в какой части кода выполняется эта «проверка браузера»?

2. Вы можете попросить cron вызвать ваш контроллер, я запускаю cron каждые две минуты, это то, что у меня есть, я также добавляю сетку администратора и обновляю записи прайс-листа с ‘new’ на ‘processing’ на ‘aborted’ или ‘processed’ в зависимости от того, как это работает. Таким образом, пользователь может проверять свои обновления.

3. Может быть, я могу вызвать какую-нибудь функцию, чтобы заставить Magento думать, что метод long уже отправлен? Существует ли какой-либо такой метод?

Ответ №2:

Должен ответить на это сам:

Решение мега простое:

вызовите это прямо перед длительным процессом (убедитесь, что вы выполнили манипуляции с данными сеанса перед вызовом этого метода, иначе могут возникнуть ошибки)

 session_write_close();
  

И вуаля, вы можете запускать несколько процессов одновременно!