Выполнение кода после вывода страницы. Как?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Zar
Сообщения: 6
Зарегистрирован: 2017.11.10, 18:58

Выполнение кода после вывода страницы. Как?

Сообщение Zar » 2017.11.10, 19:04

Здравствуйте, друзья! Задача — вести лог посетителей страницы IP адресом и т.д. Но перед рендером нагружать сайт этой задачей неохота, ведь это отразится на скорости генерации страницы. Как запустить код моего счетчика после вывода страницы на экран? Спс!

Аватара пользователя
futbolim
Сообщения: 2049
Зарегистрирован: 2012.07.08, 19:28

Re: Выполнение кода после вывода страницы. Как?

Сообщение futbolim » 2017.11.10, 21:39

Что именно нагрузит? Один запрос в базу?

Zar
Сообщения: 6
Зарегистрирован: 2017.11.10, 18:58

Re: Выполнение кода после вывода страницы. Как?

Сообщение Zar » 2017.11.10, 23:56

Этот запрос ситуативно может быть связан с отправкой email. Значительно увеличивает время загрузки страницы. Пробовал afterAction, но... время загрузки возрастает ощутимо.

Нужно, чтобы страница уже отобразилась, а потом уже и email отправлялся.

Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Выполнение кода после вывода страницы. Как?

Сообщение Nerf » 2017.11.11, 00:03

Вы вообще понимаете как работает php? Нет такого после отображения страницы.
Например, можете создать 1 запись в логе, а потом кроном уже что-то делать раз в н минут.

Аватара пользователя
Йож
Сообщения: 568
Зарегистрирован: 2015.08.26, 03:05

Re: Выполнение кода после вывода страницы. Как?

Сообщение Йож » 2017.11.11, 00:06

Через AJAX запрос после загрузки сделайте.

Zar
Сообщения: 6
Зарегистрирован: 2017.11.10, 18:58

Re: Выполнение кода после вывода страницы. Как?

Сообщение Zar » 2017.11.11, 00:40

Йож писал(а):
2017.11.11, 00:06
Через AJAX запрос после загрузки сделайте.
Так и сделано. Видимо, так и оставлю, если не будет более удобных предложений.

caHek2x
Сообщения: 1226
Зарегистрирован: 2016.04.12, 20:41

Re: Выполнение кода после вывода страницы. Как?

Сообщение caHek2x » 2017.11.11, 00:43

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

Zar
Сообщения: 6
Зарегистрирован: 2017.11.10, 18:58

Re: Выполнение кода после вывода страницы. Как?

Сообщение Zar » 2017.11.11, 01:29

Да пустяк, и я его сделал, просто момент отправки почты тормозит страницу. Задача простая - при заходе на определённые избранные страницы отправляется уведомление о заходе. Сейчас это работает на ajax, но я попробовал в код впихнуть, страница стала грузиться медленнее. Думаю, с кроном всё-таки сделаю.

urichalex
Сообщения: 948
Зарегистрирован: 2015.08.07, 11:03

Re: Выполнение кода после вывода страницы. Как?

Сообщение urichalex » 2017.11.11, 02:07

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

chesar
Сообщения: 512
Зарегистрирован: 2013.04.10, 17:49

Re: Выполнение кода после вывода страницы. Как?

Сообщение chesar » 2017.11.11, 11:05

Zar писал(а):
2017.11.10, 19:04
Здравствуйте, друзья! Задача — вести лог посетителей страницы IP адресом и т.д. Но перед рендером нагружать сайт этой задачей неохота, ведь это отразится на скорости генерации страницы. Как запустить код моего счетчика после вывода страницы на экран? Спс!
Вам надо навеситься на событие \yii\web\Response::EVENT_AFTER_SEND. К этому моменту данные уже должны быть отправлены в браузер.
Если используется fpm то можно воспользоваться http://php.net/manual/ru/function.fastc ... equest.php

error500
Сообщения: 3
Зарегистрирован: 2017.11.11, 10:59

Re: Выполнение кода после вывода страницы. Как?

Сообщение error500 » 2017.11.11, 11:26

На мой взгляд для начала слать почту на каждый чих не корректно во вторых вопрос как вы это делаете - если через реальный смтп конект то это конечно - запретить, если у вас есть локальный почтовик то тут тормозов быть не должно на то они почтовики и придуманы (и у них есть свои очериди и т.п.)
Второй момент вообще смысл подобного действия отправлять почтой лог - лог должен писаться в лог в Yii есть масса логеров которые могут писать и файл и в базу и даже слать в почту и будьте уверены будут это делать гораздо коррректнее чем вы придумаете что то свое
Но если уж никак не подходит - то всегда можно сделать вставку некоего однопиксельного гиф а урл по нему обрабатывать отдельным кодом

Аватара пользователя
Йож
Сообщения: 568
Зарегистрирован: 2015.08.26, 03:05

Re: Выполнение кода после вывода страницы. Как?

Сообщение Йож » 2017.11.11, 14:49

"Видимо, так и оставлю, если не будет более удобных предложений."
Это предложение, исходя из Ваших слов.
А так у меня через очереди вопрос решен с оправкой почтовых сообщений. (но это нужно настраивать через SSH на сервере, чтобы обработчик постоянно висел в памяти и обрабатывал очередь).

urichalex
Сообщения: 948
Зарегистрирован: 2015.08.07, 11:03

Re: Выполнение кода после вывода страницы. Как?

Сообщение urichalex » 2017.11.11, 21:20

Йож писал(а):
2017.11.11, 14:49
"Видимо, так и оставлю, если не будет более удобных предложений."
Это предложение, исходя из Ваших слов.
А так у меня через очереди вопрос решен с оправкой почтовых сообщений. (но это нужно настраивать через SSH на сервере, чтобы обработчик постоянно висел в памяти и обрабатывал очередь).
можно в базу писать задачи и кроном тащить. Костыль, криво, но, в пределах шареда без ссш пойдет

Zar
Сообщения: 6
Зарегистрирован: 2017.11.10, 18:58

Re: Выполнение кода после вывода страницы. Как?

Сообщение Zar » 2017.11.12, 08:38

chesar писал(а):
2017.11.11, 11:05

Вам надо навеситься на событие \yii\web\Response::EVENT_AFTER_SEND. К этому моменту данные уже должны быть отправлены в браузер.
Если используется fpm то можно воспользоваться http://php.net/manual/ru/function.fastc ... equest.php
Это действительно интересно. Спасибо

urichalex
Сообщения: 948
Зарегистрирован: 2015.08.07, 11:03

Re: Выполнение кода после вывода страницы. Как?

Сообщение urichalex » 2017.11.12, 17:44

chesar писал(а):
2017.11.11, 11:05
Вам надо навеситься на событие \yii\web\Response::EVENT_AFTER_SEND. К этому моменту данные уже должны быть отправлены в браузер.
Нет. Данные отправлены, но скрипт еще работает

chesar
Сообщения: 512
Зарегистрирован: 2013.04.10, 17:49

Re: Выполнение кода после вывода страницы. Как?

Сообщение chesar » 2017.11.12, 18:15

urichalex писал(а):
2017.11.12, 17:44

Нет. Данные отправлены, но скрипт еще работает
Именно. Клиент получает ответ, а дальше может идти логика не влияющая на отображение страницы.

urichalex
Сообщения: 948
Зарегистрирован: 2015.08.07, 11:03

Re: Выполнение кода после вывода страницы. Как?

Сообщение urichalex » 2017.11.12, 21:02

chesar писал(а):
2017.11.12, 18:15
urichalex писал(а):
2017.11.12, 17:44

Нет. Данные отправлены, но скрипт еще работает
Именно. Клиент получает ответ, а дальше может идти логика не влияющая на отображение страницы.
Как так?
https://www.dropbox.com/s/l880mu5m5oewm ... 2.mkv?dl=0
Последний раз редактировалось urichalex 2017.11.13, 21:14, всего редактировалось 1 раз.

chesar
Сообщения: 512
Зарегистрирован: 2013.04.10, 17:49

Re: Выполнение кода после вывода страницы. Как?

Сообщение chesar » 2017.11.13, 11:10

urichalex писал(а):
2017.11.12, 21:02
Как так?
https://www.dropbox.com/preview/vokoscr ... -56-02.mkv
Не могу просмотреть, не расшарено.

Код: Выделить всё


\yii\base\Event::on(\yii\web\Response::class, \yii\web\Response::EVENT_AFTER_SEND, function($event) {
    //К этому моменту данные уже отправлены в браузер. Страница сформирована. Но соединение ещё не сброшено.
    if(function_exists('fastcgi_finish_request')) {
        //Если fpm то сбрасываем соединение. Всё клиент дальше сам по себе, сервер сам по себе.
        fastcgi_finish_request();
    }    
    //...
});

Аватара пользователя
zabachok
Сообщения: 519
Зарегистрирован: 2013.12.16, 14:38

Re: Выполнение кода после вывода страницы. Как?

Сообщение zabachok » 2017.11.13, 11:21

Zar писал(а):
2017.11.10, 19:04
Здравствуйте, друзья! Задача — вести лог посетителей страницы IP адресом и т.д. Но перед рендером нагружать сайт этой задачей неохота, ведь это отразится на скорости генерации страницы. Как запустить код моего счетчика после вывода страницы на экран? Спс!
https://ruhighload.com/post/%D0%90%D1%8 ... %D0%B5+PHP
2b||!2b Just read the instructions

Ответить