/** * This function does work that can be done *after* the * user gets the HTTP response so they don't block on it * * This manages deferred updates, job insertion, * final commit, and the logging of profiling data * * @param string $mode Use 'fast' to always skip job running * @since 1.26 */ public function doPostOutputShutdown($mode = 'normal') { $timing = $this->context->getTiming(); $timing->mark('requestShutdown'); // Show visible profiling data if enabled (which cannot be post-send) Profiler::instance()->logDataPageOutputOnly(); $callback = function () use($mode) { try { $this->restInPeace($mode); } catch (Exception $e) { MWExceptionHandler::handleException($e); } }; // Defer everything else... if (function_exists('register_postsend_function')) { // https://github.com/facebook/hhvm/issues/1230 register_postsend_function($callback); } else { if (function_exists('fastcgi_finish_request')) { fastcgi_finish_request(); } else { // Either all DB and deferred updates should happen or none. // The latter should not be cancelled due to client disconnect. ignore_user_abort(true); } $callback(); } }