Beispiel #1
0
 /**
  * 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();
     }
 }