MediaWiki  master
ParsoidCachePrewarmJob.php
Go to the documentation of this file.
1 <?php
26 use Psr\Log\LoggerInterface;
27 
31 class ParsoidCachePrewarmJob extends Job {
32  private LoggerInterface $logger;
33  private ParsoidOutputAccess $parsoidOutputAccess;
34  private PageLookup $pageLookup;
35  private RevisionLookup $revisionLookup;
36 
43  public function __construct(
44  array $params,
45  ParsoidOutputAccess $parsoidOutputAccess,
46  PageLookup $pageLookup,
47  RevisionLookup $revisionLookup
48  ) {
49  parent::__construct( 'parsoidCachePrewarm', $params );
50 
51  // TODO: find a way to inject the logger
52  $this->logger = LoggerFactory::getInstance( 'ParsoidCachePrewarmJob' );
53  $this->parsoidOutputAccess = $parsoidOutputAccess;
54  $this->pageLookup = $pageLookup;
55  $this->revisionLookup = $revisionLookup;
56  }
57 
69  public static function newSpec(
70  int $revisionId,
71  int $pageId,
72  array $params = []
73  ): JobSpecification {
74  $params += [ 'options' => 0 ];
75  return new JobSpecification(
76  'parsoidCachePrewarm',
77  [
78  'revId' => $revisionId,
79  'pageId' => $pageId
80  ] + $params
81  );
82  }
83 
84  private function doParsoidCacheUpdate() {
85  $page = $this->pageLookup->getPageById( $this->params['pageId'] );
86  $revId = $this->params['revId'];
87 
88  if ( $page === null ) {
89  // This happens when the page got deleted in the meantime.
90  $this->logger->info( "Page with ID {$this->params['pageId']} not found" );
91  return;
92  }
93 
94  if ( $page->getLatest() !== $revId ) {
95  $this->logger->info(
96  'ParsoidCachePrewarmJob: The ID of the new revision does not match the page\'s current revision ID'
97  );
98  return;
99  }
100 
101  $rev = $this->revisionLookup->getRevisionById( $revId );
102  if ( !$rev ) {
103  return;
104  }
105 
106  $parserOpts = ParserOptions::newFromAnon();
107 
108  $renderReason = $this->params['causeAction'] ?? $this->command;
109  $parserOpts->setRenderReason( $renderReason );
110 
111  $mainSlot = $rev->getSlot( SlotRecord::MAIN );
112  if ( !$this->parsoidOutputAccess->supportsContentModel( $mainSlot->getModel() ) ) {
113  $this->logger->debug( __METHOD__ . ': Parsoid does not support content model ' . $mainSlot->getModel() );
114  return;
115  }
116 
117  $this->logger->debug( __METHOD__ . ': generating Parsoid output' );
118 
119  // We may get the OPT_FORCE_PARSE flag this way
120  $options = $this->params['options'] ?? 0;
121 
122  // getParserOutput() will write to ParserCache.
123  $status = $this->parsoidOutputAccess->getParserOutput(
124  $page,
125  $parserOpts,
126  $rev,
127  $options | ParsoidOutputAccess::OPT_LOG_LINT_DATA
128  );
129 
130  if ( !$status->isOK() ) {
131  $this->logger->error( __METHOD__ . ': Parsoid error', [
132  'errors' => $status->getErrors(),
133  'page' => $page->getDBkey(),
134  'rev' => $rev->getId(),
135  ] );
136  }
137  }
138 
139  public function run() {
140  $this->doParsoidCacheUpdate();
141 
142  return true;
143  }
144 }
Job queue task description base code.
Class to both describe a background job and handle jobs.
Definition: Job.php:39
array $params
Array of job parameters.
Definition: Job.php:44
PSR-3 logger instance factory.
MediaWiki service for getting Parsoid Output objects.
Value object representing a content slot associated with a page revision.
Definition: SlotRecord.php:40
static newFromAnon()
Get a ParserOptions object for an anonymous user.
static newSpec(int $revisionId, int $pageId, array $params=[])
__construct(array $params, ParsoidOutputAccess $parsoidOutputAccess, PageLookup $pageLookup, RevisionLookup $revisionLookup)
Service for looking up information about wiki pages.
Definition: PageLookup.php:17
Service for looking up page revisions.