У меня есть вопрос о Zend Framework 2. Я хочу узнать, сколько времени занимает выполнение запроса, и я знаю, что это возможно с помощью Zend MVCEvent, но я не знаю, как это сделать.
Время между запросами в Zend 2
Ответы (3)
лучшее решение, на мой взгляд, - заменить специальную переменную внутри ваших файлов шаблонов, как это
{{ renderTime }}
так что вы можете свободно контролировать положение текста и не путать модели ответов json в своем приложении zf.
позвольте мне объяснить, почему я не подключаюсь к событию \Zend\View\ViewEvent::EVENT_RENDERER
и не заменяю свою переменную непосредственно в Response
на событии FINISH
.
в основном вы не можете использовать другие события, потому что страница не отображается в любое время, и все функции/вьюхелперы в вашем шаблоне в настоящее время не выполняются, и поэтому время будет меньше, чем реальное время рендеринга.
Событие \Zend\View\ViewEvent::EVENT_RENDERER_POST
нехорошо, потому что ваше представление отображается правильно, но приложение еще не выполнено, и, возможно, все зарегистрированные события и т. д., которые следуют, еще не выполнены.
если вам нравится моя идея, то ваш index.php
будет выглядеть так
<?php
/**
* This makes our life easier when dealing with paths. Everything is relative
* to the application root now.
*/
chdir(dirname(__DIR__));
define('STARTTIME', microtime(true));
// Decline static file requests back to the PHP built-in webserver
if (php_sapi_name() === 'cli-server' && is_file(__DIR__ . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH))) {
return false;
}
// Setup autoloading
require 'init_autoloader.php';
// Run the application!
Zend\Mvc\Application::init(require 'config/application.config.php')->run();
и ваш метод module.php
onBootstrap
станет таким
$e->getApplication()->getEventManager()->attach(\Zend\Mvc\MvcEvent::EVENT_FINISH, function($e){
/** @var $e \Zend\Mvc\MvcEvent */
if( $e->getResult() instanceof \Zend\View\Model\ViewModel )
{
$renderText = sprintf('page render time - %s seconds', number_format(microtime(true) - STARTTIME, 5));
/** @var \Zend\Http\PhpEnvironment\Response $response */
$response = $e->getResponse();
$response->setContent(
str_replace('{{ renderTime }}', $renderText, $response->getContent())
);
}
}, 100000);
и в вашем наборе файлов шаблона/макета, где вы хотите ввести время рендеринга с помощью {{ renderTime }}
<h1>Hello Friends!</h1>
<div>some content</div>
<div class="footer">
{{ renderTime }}
</div>
что теперь дает вам page render time - 0.67307 seconds
onBootstrap
, вы упускаете некоторое время, когда zend должен загрузить ваше приложение/маршрутизацию и т. д. ваш ответ в порядке, но не очень хорош, потому что вы захватываете класс request
, чтобы доставить время рендеринга, и у вас нет времени. controll, где ваше время рендеринга будет отображаться на клиенте (внизу — без контроля), также вы испортите модели просмотра json, потому что каждый раз, когда ваш ответ добавляется к прямому выводу клиента. я редактирую свой ответ
- person ins0; 20.08.2014
zf2
(Zend\Mvc\Application
) и понять, где и почему события запускаются из zend. это сложно объяснить здесь, но основы написаны здесь framework.zend.com/manual/2.1/en/modules/
- person ins0; 20.08.2014
DAFUQ
но через некоторое время попадаешь в точку ;)
- person ins0; 20.08.2014
Это не совсем отвечает на ваш вопрос, но я думаю, вы могли бы сделать это, используя REQUEST_TIME
, который вы можете получить с сервера запросов. Что-то вроде этого :
$startTime = $mvcEvent->getRequest()->getServer()->get('REQUEST_TIME');
И затем в конце запроса:
$endTime = microtime(true);
Я не уверен, но думаю, что этот модуль ZendDeveloperTools позволяет отображать время выполнения.
$mvcEvent->setParam('startTime', $value)
и $mvcEvent->getParam('startTime')
в более позднем слушателе.
- person AlexP; 19.08.2014
Это решение, которое я придумал, код написан в Module.php в модуле, который я хочу отображать на каждой странице:
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$checklistener=new CheckListener();
$checklistener->attach($eventManager);
$addyearlistener=new AddyearListener();
$addyearlistener->attach($eventManager);
$moduleRouteListener->attach($eventManager);
//request time
$eventManager->attach(MvcEvent::EVENT_DISPATCH,function($e){
$param=new Parameters(array('time' => microtime(TRUE)));
$e->getApplication()->getRequest()->setPost($param);
$e->getApplication()->getEventManager()->attach(MvcEvent::EVENT_FINISH, function($e){
echo 'Time:'. (microtime(TRUE)-$e->getRequest()->getPost('time')).' seconds';
});
});
}