From 1100f491702eaf0ddcd88de3dc3dd5ad62579c9a Mon Sep 17 00:00:00 2001 From: ndossche <7771979+ndossche@users.noreply.github.com> Date: Sun, 1 Nov 2026 15:04:16 +0100 Subject: [PATCH] Fix opcache phar check This is the cause of the flaky nightly failures on PPC for `issue0149.phpt`. On slow machines, enough time passes that request 2/3 are served from opcache rather than from the disk. If we set `opcache.file_update_protection=0`, then the failure reproduces predictably. The root cause is that the phar check in opcache only checks if the filename ends in `.phar` whereas ext/phar checks whether `.phar` is anywhere in the filename. This difference causes requests from the cache to not execute the stub, and therefore not execute the `Phar::mount()` call in the test, and therefore fail the expectation. --- ext/opcache/ZendAccelerator.c | 4 ++-- ext/opcache/tests/issue0149.phpt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 4df75049e172..e56904d7efb8 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -1517,10 +1517,10 @@ static void zend_accel_add_key(zend_string *key, zend_accel_hash_entry *bucket) } } +/* Must perform the same check as phar_compile_file(). */ static zend_always_inline bool is_phar_file(zend_string *filename) { - return filename && ZSTR_LEN(filename) >= sizeof(".phar") && - !memcmp(ZSTR_VAL(filename) + ZSTR_LEN(filename) - (sizeof(".phar")-1), ".phar", sizeof(".phar")-1) && + return filename && strstr(ZSTR_VAL(filename), ".phar") && !strstr(ZSTR_VAL(filename), "://"); } diff --git a/ext/opcache/tests/issue0149.phpt b/ext/opcache/tests/issue0149.phpt index 29e6f02808a7..20fe7636ff08 100644 --- a/ext/opcache/tests/issue0149.phpt +++ b/ext/opcache/tests/issue0149.phpt @@ -22,7 +22,7 @@ unset($p); include "php_cli_server.inc"; -$ini = '-d opcache.enable=1 -d opcache.enable_cli=1'; +$ini = '-d opcache.enable=1 -d opcache.enable_cli=1 -d opcache.file_update_protection=0'; if (file_exists(ini_get('extension_dir').'/phar.'.PHP_SHLIB_SUFFIX)) { $ini .= ' -d extension=phar.'.PHP_SHLIB_SUFFIX; }