Commit cbd65db2af7 for php
commit cbd65db2af75931436f49b947ec8ccc37e5c5313
Author: ndossche <7771979+ndossche@users.noreply.github.com>
Date: Sun Nov 1 15:04:16 2026 +0100
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.
Closes GH-25128.
diff --git a/NEWS b/NEWS
index d23571a751f..4cedc01bcf4 100644
--- a/NEWS
+++ b/NEWS
@@ -217,6 +217,7 @@ PHP NEWS
(Jorg Sowa)
. Fixed bug GH-24988 (Incorrect opcode range check causes bugs with exceptions in
function JIT). (ndossche, Jorg Sowa)
+ . Fix opcache phar check. (ndossche)
- OpenSSL:
. Fixed bug GH-24784 (openssl_pkcs7_read() and openssl_cms_read() overwrite
diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c
index 4df75049e17..e56904d7efb 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 29e6f02808a..20fe7636ff0 100644
--- a/ext/opcache/tests/issue0149.phpt
+++ b/ext/opcache/tests/issue0149.phpt
@@ -22,7 +22,7 @@
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;
}