PHP Runtime EOL, OPcache & PHP-FPM Review
Purpose
Review a PHP service's runtime lifecycle status and production hardening so a service does not run on an unsupported PHP version or an unhardened OPcache/PHP-FPM configuration without the team knowing. The dominant failure modes are a PHP version past php.net's published support window (EOL, or security-only and approaching its own EOL), OPcache left disabled or misconfigured for the deployment model, and PHP-FPM pool settings that leave worker concurrency and recycling unbounded.
When to use
Use this skill when the user asks to:
- review whether a service's target or running PHP version is EOL, security-only, or actively supported per php.net,
- assess an upgrade path and timeline against php.net's published support-window dates,
- review production
opcache.enable, opcache.validate_timestamps, opcache.memory_consumption, and opcache.max_accelerated_files configuration,
- review production PHP-FPM
pm, pm.max_children, and pm.max_requests configuration for resource-exhaustion and worker-leak exposure.
When not to use
Do not use this skill for:
- performing the PHP version upgrade, editing application code for compatibility, or installing/restarting any PHP, OPcache, or PHP-FPM process — this skill is static review only; it recommends the path and hands implementation to the owning team.
- reviewing application-level vulnerabilities, Composer dependency supply chain, or WordPress-specific hardening — those belong to other PHP-domain skills in this catalog.
- asserting a PHP version's support status from memory or estimation; if php.net's supported-versions page does not list the version, say so rather than guessing a date.
- judging lifecycle status against the wall clock; judgment is based on the target/committed version and the published dates only, so findings stay reproducible.
Preconditions
- The PHP version actually targeted or running in production (
composer.json require.php, Dockerfile/base-image tag, CI runtime matrix, or deployment manifest).
- The production
php.ini OPcache directives in scope: opcache.enable, opcache.validate_timestamps, opcache.revalidate_freq, opcache.memory_consumption, opcache.max_accelerated_files.
- The production PHP-FPM pool configuration:
pm, pm.max_children, pm.max_requests, and the pm.start_servers/pm.min_spare_servers/pm.max_spare_servers triad if pm is dynamic.
- The deployment model (immutable container image replaced per deploy vs. in-place file sync), since it determines whether
opcache.validate_timestamps=0 is safe without a compensating invalidation step.
- Approximate available memory per worker host/container, if
pm.max_children sizing guidance is requested.
Lean operating rules
- Resolve the exact PHP version from the strongest available evidence and state that evidence tier before classifying its lifecycle status.
- Classify status precisely as active support, security-only (with the published end date), or EOL — never collapse these into "outdated."
- Treat any EOL classification as blocking, regardless of code quality elsewhere; EOL means no fixes are published, including for actively exploited vulnerabilities.
- Treat a security-only classification as blocking only when its published security-support end date falls within the stated release horizon with no tracked upgrade plan; otherwise report it as dated advisory guidance.
- Confirm
opcache.enable=1 in production, and check opcache.validate_timestamps against the actual deployment model rather than assuming one universally correct value.
- Confirm
pm.max_children is evidently bounded by available memory and pm.max_requests is nonzero (or has a documented rationale for 0).
- Never fabricate a PHP version, support date, or CVE; encode lifecycle dates only from php.net's supported-versions page.
- Label every claim
repo evidence, documentation-based, or inference.
Context7 documentation protocol
This skill's allowed tools are Read, Grep, and Glob only — it does not call Context7 or any live documentation lookup at review time. Every PHP-lifecycle, OPcache, or PHP-FPM behavioral claim must instead be grounded in the bundled reference files, which are sourced directly from php.net and dated at authoring time. If a claim cannot be traced to a bundled reference or to evidence in the repository, label it an assumption rather than asserting it as documented behavior. See PHP version lifecycle, OPcache production configuration, and PHP-FPM pool tuning.
Workflow
Follow the review in this order: (1) resolve the exact PHP version targeted or running, and its evidence tier; (2) classify that version against php.net's current supported-versions table as active-support, security-only, or EOL, citing the exact dates; (3) if security-only, compare its security-support end date against the stated release horizon; (4) read production OPcache directives and check enable/validate_timestamps against the deployment model, and memory_consumption/max_accelerated_files against the actual codebase size; (5) read production PHP-FPM pool configuration and check pm.max_children sizing and pm.max_requests recycling; (6) emit findings with evidence tiers, concrete remediation, and ownership handoffs.
Decision gates
- Block on any EOL PHP version, unconditionally.
- Block on a security-only version whose published security-support end date falls within the stated release horizon with no tracked upgrade plan.
- Block on production OPcache disabled, or
validate_timestamps inconsistent with the deployment model with no compensating invalidation step.
- Block on PHP-FPM with no evidently bounded
pm.max_children or an unbounded pm.max_requests with no documented rationale.
- Every lifecycle and directive claim traces to a bundled reference file or explicit repository evidence, never memory.
- The PHP version upgrade and any application-code compatibility work are handed to the owning engineering team, never performed here.
Evidence classification
Label each finding repo evidence (seen directly in php.ini, FPM pool config, Dockerfile, CI, or a version banner), documentation-based (a php.net-published support date or directive default from the bundled references), or inference (a reasonable conclusion not directly observed, e.g. estimated memory footprint per worker). A documented default never proves what a specific deployment's actual configuration is — check the file before asserting it.
Security and privacy constraints
Static review only. Never install, upgrade, downgrade, or restart any PHP, OPcache, or PHP-FPM process, and never make any network call to php.net or any other service. Never fabricate a PHP version, support date, or CVE — report missing evidence instead of guessing. Treat any credential found in configuration files as a redact-and-flag finding, never echoed in output.
Escalation conditions
Escalate to incident response on any evidence the failure is already live — an EOL PHP version confirmed serving production traffic, or a PHP-FPM pool observed exhausting workers under load. Escalate a confirmed EOL or approaching-security-only-EOL finding to the owning engineering team as a tracked upgrade item, with the recommended target version and the exact php.net-published dates driving the timeline.
References
Load these only when needed:
- PHP version lifecycle — the php.net support-policy definitions and the current per-branch active-support/security-support/EOL dates.
- OPcache production configuration —
opcache.enable, opcache.validate_timestamps, and sizing directives, and how to review them against a deployment model.
- PHP-FPM pool tuning —
pm, pm.max_children, and pm.max_requests review criteria for resource-exhaustion and worker-leak exposure.
Response minimum
Return, at minimum:
- the resolved PHP version, its evidence tier, and its lifecycle classification (active support / security-only with end date / EOL) with the exact php.net-published dates;
- the production OPcache hardening state (
enable, validate_timestamps versus deployment model, sizing);
- the production PHP-FPM hardening state (
pm.max_children sizing, pm.max_requests recycling);
- concrete remediation and an exact verification step for each finding;
- ownership handoffs and any incident-response escalation.
Anti-goals
- Never fabricate or guess a PHP version's support-window dates; encode them only from php.net's supported-versions page.
- Never judge lifecycle status against the wall clock; use the target/committed version and the published dates only.
- Do not rewrite application code or perform the PHP version upgrade; recommend the path and hand implementation to the owning team.
- Do not execute, restart, or reload any PHP, OPcache, or PHP-FPM process, and do not contact php.net or any other service.
- Do not treat a version absent from the current supported-versions table as EOL by assumption; say the evidence is missing instead.
1---2name: php-runtime-eol-opcache-fpm-review3description: Use this skill to review PHP runtime upgrade readiness — whether the target or running PHP version is past php.net's published four-year support window (active support, then security-only, then EOL) — and to review production OPcache (enable, validate_timestamps, memory sizing) and PHP-FPM (pm, max_children, max_requests) hardening. Use when production PHP could be running an EOL or soon-security-only-EOL version, or when OPcache/FPM configuration could serve stale code or let a traffic spike exhaust workers. An EOL runtime is always a blocking finding. Static review only; it never installs, upgrades, or restarts a PHP runtime.4---56# PHP Runtime EOL, OPcache & PHP-FPM Review78## Purpose910Review a PHP service's runtime lifecycle status and production hardening so a service does not run on an unsupported PHP version or an unhardened OPcache/PHP-FPM configuration without the team knowing. The dominant failure modes are a PHP version past php.net's published support window (EOL, or security-only and approaching its own EOL), OPcache left disabled or misconfigured for the deployment model, and PHP-FPM pool settings that leave worker concurrency and recycling unbounded.1112## When to use1314Use this skill when the user asks to:1516- review whether a service's target or running PHP version is EOL, security-only, or actively supported per php.net,17- assess an upgrade path and timeline against php.net's published support-window dates,18- review production `opcache.enable`, `opcache.validate_timestamps`, `opcache.memory_consumption`, and `opcache.max_accelerated_files` configuration,19- review production PHP-FPM `pm`, `pm.max_children`, and `pm.max_requests` configuration for resource-exhaustion and worker-leak exposure.2021## When not to use2223Do not use this skill for:2425- performing the PHP version upgrade, editing application code for compatibility, or installing/restarting any PHP, OPcache, or PHP-FPM process — this skill is static review only; it recommends the path and hands implementation to the owning team.26- reviewing application-level vulnerabilities, Composer dependency supply chain, or WordPress-specific hardening — those belong to other PHP-domain skills in this catalog.27- asserting a PHP version's support status from memory or estimation; if php.net's supported-versions page does not list the version, say so rather than guessing a date.28- judging lifecycle status against the wall clock; judgment is based on the target/committed version and the published dates only, so findings stay reproducible.2930## Preconditions3132- The PHP version actually targeted or running in production (`composer.json` `require.php`, Dockerfile/base-image tag, CI runtime matrix, or deployment manifest).33- The production `php.ini` OPcache directives in scope: `opcache.enable`, `opcache.validate_timestamps`, `opcache.revalidate_freq`, `opcache.memory_consumption`, `opcache.max_accelerated_files`.34- The production PHP-FPM pool configuration: `pm`, `pm.max_children`, `pm.max_requests`, and the `pm.start_servers`/`pm.min_spare_servers`/`pm.max_spare_servers` triad if `pm` is `dynamic`.35- The deployment model (immutable container image replaced per deploy vs. in-place file sync), since it determines whether `opcache.validate_timestamps=0` is safe without a compensating invalidation step.36- Approximate available memory per worker host/container, if `pm.max_children` sizing guidance is requested.3738## Lean operating rules3940- Resolve the exact PHP version from the strongest available evidence and state that evidence tier before classifying its lifecycle status.41- Classify status precisely as active support, security-only (with the published end date), or EOL — never collapse these into "outdated."42- Treat any EOL classification as blocking, regardless of code quality elsewhere; EOL means no fixes are published, including for actively exploited vulnerabilities.43- Treat a security-only classification as blocking only when its published security-support end date falls within the stated release horizon with no tracked upgrade plan; otherwise report it as dated advisory guidance.44- Confirm `opcache.enable=1` in production, and check `opcache.validate_timestamps` against the actual deployment model rather than assuming one universally correct value.45- Confirm `pm.max_children` is evidently bounded by available memory and `pm.max_requests` is nonzero (or has a documented rationale for `0`).46- Never fabricate a PHP version, support date, or CVE; encode lifecycle dates only from php.net's supported-versions page.47- Label every claim `repo evidence`, `documentation-based`, or `inference`.4849## Context7 documentation protocol5051This skill's allowed tools are Read, Grep, and Glob only — it does not call Context7 or any live documentation lookup at review time. Every PHP-lifecycle, OPcache, or PHP-FPM behavioral claim must instead be grounded in the bundled reference files, which are sourced directly from php.net and dated at authoring time. If a claim cannot be traced to a bundled reference or to evidence in the repository, label it an assumption rather than asserting it as documented behavior. See [PHP version lifecycle](references/php-version-lifecycle.md), [OPcache production configuration](references/opcache-production-config.md), and [PHP-FPM pool tuning](references/php-fpm-pool-tuning.md).5253## Workflow5455Follow the review in this order: (1) resolve the exact PHP version targeted or running, and its evidence tier; (2) classify that version against php.net's current supported-versions table as active-support, security-only, or EOL, citing the exact dates; (3) if security-only, compare its security-support end date against the stated release horizon; (4) read production OPcache directives and check `enable`/`validate_timestamps` against the deployment model, and `memory_consumption`/`max_accelerated_files` against the actual codebase size; (5) read production PHP-FPM pool configuration and check `pm.max_children` sizing and `pm.max_requests` recycling; (6) emit findings with evidence tiers, concrete remediation, and ownership handoffs.5657## Decision gates5859- Block on any EOL PHP version, unconditionally.60- Block on a security-only version whose published security-support end date falls within the stated release horizon with no tracked upgrade plan.61- Block on production OPcache disabled, or `validate_timestamps` inconsistent with the deployment model with no compensating invalidation step.62- Block on PHP-FPM with no evidently bounded `pm.max_children` or an unbounded `pm.max_requests` with no documented rationale.63- Every lifecycle and directive claim traces to a bundled reference file or explicit repository evidence, never memory.64- The PHP version upgrade and any application-code compatibility work are handed to the owning engineering team, never performed here.6566## Evidence classification6768Label each finding `repo evidence` (seen directly in `php.ini`, FPM pool config, Dockerfile, CI, or a version banner), `documentation-based` (a php.net-published support date or directive default from the bundled references), or `inference` (a reasonable conclusion not directly observed, e.g. estimated memory footprint per worker). A documented default never proves what a specific deployment's actual configuration is — check the file before asserting it.6970## Security and privacy constraints7172Static review only. Never install, upgrade, downgrade, or restart any PHP, OPcache, or PHP-FPM process, and never make any network call to php.net or any other service. Never fabricate a PHP version, support date, or CVE — report missing evidence instead of guessing. Treat any credential found in configuration files as a redact-and-flag finding, never echoed in output.7374## Escalation conditions7576Escalate to incident response on any evidence the failure is already live — an EOL PHP version confirmed serving production traffic, or a PHP-FPM pool observed exhausting workers under load. Escalate a confirmed EOL or approaching-security-only-EOL finding to the owning engineering team as a tracked upgrade item, with the recommended target version and the exact php.net-published dates driving the timeline.7778## References7980Load these only when needed:8182- [PHP version lifecycle](references/php-version-lifecycle.md) — the php.net support-policy definitions and the current per-branch active-support/security-support/EOL dates.83- [OPcache production configuration](references/opcache-production-config.md) — `opcache.enable`, `opcache.validate_timestamps`, and sizing directives, and how to review them against a deployment model.84- [PHP-FPM pool tuning](references/php-fpm-pool-tuning.md) — `pm`, `pm.max_children`, and `pm.max_requests` review criteria for resource-exhaustion and worker-leak exposure.8586## Response minimum8788Return, at minimum:8990- the resolved PHP version, its evidence tier, and its lifecycle classification (active support / security-only with end date / EOL) with the exact php.net-published dates;91- the production OPcache hardening state (`enable`, `validate_timestamps` versus deployment model, sizing);92- the production PHP-FPM hardening state (`pm.max_children` sizing, `pm.max_requests` recycling);93- concrete remediation and an exact verification step for each finding;94- ownership handoffs and any incident-response escalation.9596## Anti-goals9798- Never fabricate or guess a PHP version's support-window dates; encode them only from php.net's supported-versions page.99- Never judge lifecycle status against the wall clock; use the target/committed version and the published dates only.100- Do not rewrite application code or perform the PHP version upgrade; recommend the path and hand implementation to the owning team.101- Do not execute, restart, or reload any PHP, OPcache, or PHP-FPM process, and do not contact php.net or any other service.102- Do not treat a version absent from the current supported-versions table as EOL by assumption; say the evidence is missing instead.