Disable OPCache temporarily
Solution 1:
Once your script runs, it's too late to not cache the file. You need to set it outside PHP:
-
If PHP runs as Apache module, use an
.htaccess
file:php_flag opcache.enable Off
-
If PHP runs as CGI/FastCGI, use a
.user.ini
file:opcache.enable=0
In all cases, you can also use good old system-wide php.ini
if you have access to it.
Solution 2:
opcache.enable is PHP_INI_ALL which means that ini_set() does work, but only for current request to disable OPcache caching for the remainder of scripts compiled in your current request. (You can't force enabling). It reverts back to the system default for other requests. By this stage, the request script will already have been cached, unless you do the ini_set in an auto_prepend_file script.
The system defaults (PHP_INI_SYSTEM) are latched as part of PHP system startup and can't be reread. So in the case of Apache for example, you need to restart Apache to change / reload these.
The .htaccess
php_flag
directives only apply if you are running mod_php or equivalent. They and .user.ini
files are PHP_INI_PERDIR, which will also be latched at request activation.
Now to the Q that I think that you might be asking. If you have a dev system then the easiest way is to set opcache.enable=0
in the appropriate INI file and restart your webserver. Set it back to =1
and restart again when you are done.
Also consider (in the dev context) setting opcache.validate_timestamps=on
and opcache.revalidate_freq=0
. This will keep OPcache enabled but scripts will be stat'ed on every compile request to see if they are changed. This gives the best of both worlds when developing.
Also read up on the opcache.blacklist_filename
directive. This allow you to specify an exclusion file, so if this contains /var/www/test
, and the web service docroot is /var/www
then any scripts in the /var/www/test*
hierarchies will not be cached.
Solution 3:
The best way i found in my case for disable opcache in a specific PHP file is : opcache_invalidate(__FILE__, true);
You also can reset all cache with PHP : opcache_reset();