Estate inventory
Every runtime the estate actually serves: version per host, pool and vhost, the SAPI in front of it, the configuration in force, and the extensions loaded with the ones the application genuinely requires. It is unglamorous work and it is the prerequisite — an advisory naming versions cannot be answered without it.
Compatibility analysis before anything changes
Deprecations and removals between the current branch and the target, extension availability per branch, framework and platform version requirements, and the plugin inventory that decides what actually breaks. The output names the blocking items rather than describing the risk of them.
A target chosen deliberately
A supported branch rather than the newest one, bounded by what the application supports and what its vendors support. Where the platform upgrade needs a newer runtime than the site can currently run, the sequencing is planned, because the two changes interact and doing them in the wrong order does the work twice.
Rehearsal on a copy of the real thing
The upgrade applied to a replica or a canary carrying the real application, the real plugins and real data — not a clean install, which passes for reasons that do not survive contact with production. Where a step cannot be rehearsed, that is stated before the window rather than discovered during it.
Per-SAPI posture
mod_php, PHP-FPM, FrankenPHP, LSAPI and CGI have different exposure under these flaws. PHP identifies all PHP installations serving web requests as at risk, with the highest risk on mod_php, where a demonstrated attack can trigger before application code runs. Pool and worker behaviour, configuration and where the runtime actually lives are part of the assessment.
Configuration posture for the window
The measures the advisory names — an administratively enforced memory limit, conservative request-size limits enforced at the proxy as well as in PHP, upload progress disabled, workers restarted so the settings actually apply. Applied as exposure reduction while the update is scheduled, and described as exactly that: the advisory is explicit that configuration removes specific paths and that updating is the only complete mitigation.
A rollback that has been executed once
Both runtimes installed and selectable, so the branch can be switched per pool or vhost rather than only by re-deploying. A rollback that has never been run is a plan, not a control, so it is exercised before the window rather than during it.
Verification after the switch
Error rate, the deprecation log, the functional paths that carry traffic, request latency and caching behaviour, read after the change rather than assumed from a successful deploy. The check confirms which runtime is serving the request, because a site can pass every functional test while still being served by the version that was supposed to have been replaced.
Visibility afterwards, so the next advisory is a query
The estate's runtime versions recorded where they can be looked up, and a maintenance calendar keyed to the project's own support dates. Without that, the next advisory produces the same investigation as this one, and the estate drifts back out of support between incidents.