opcache_reset()
(PHP 5 >= 5.5.0, PHP 7, PECL ZendOpcache >= 7.0.0)
重置字节码缓存的内容
说明
opcache_reset(void):boolean
该函数将重置整个字节码缓存。在调用opcache_reset()之后,所有的脚本将会重新载入并且在下次被点击的时候重新解析。
参数
此函数没有参数。
返回值
如果字节码缓存被重置成功,则返回TRUE
;如果字节码缓存被禁用,则返回FALSE
。
参见
opcache_invalidate()
废除脚本缓存
My workaround to clear cache via CLI is create a bash script like this: #!/bin/bash WEBDIR=/var/www/html/ RANDOM_NAME=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13) echo "<?php opcache_reset(); ?>" > ${WEBDIR}${RANDOM_NAME}.php curl http://localhost/${RANDOM_NAME}.php rm ${WEBDIR}${RANDOM_NAME}.php put it in /usr/local/bin/opcache-clear and make it executable. When I want to clear cache I simply run "opcache-clear" inside terminal.
It should be mentioned that opcache_reset() does not reset cache when executed via cli. So `php -r "var_dump(opcache_reset());"` outputs "true" but doesn't clean cache. Make file, access it via http - and cache is clean.
In some (most?) systems PHP's CLI has a separate opcode cache to the one used by the web server or PHP-FPM process, which means running opcache_reset() in the CLI won't reset the webserver/fpm opcode cache, and vice-versa.
So, I thought I'd share something that might benefit those looking for a way to reset opcache in CLI. As an example in my case, I'm running a Laravel app with a router script with the built-in web server for local development. I enabled opcache with the following run configuration: /path/to/php.exe -d zend_extension=php_opcache.dll -d opcache.enable_cli=1 -d opcache.memory_consumption=128 -d opcache.max_accelerated_files=10000 -d opcache.validate_timestamps=0 -d opcache.save_comments=0 -t project_path/public/ server.php This is basically what artisan serve is doing behind the scenes, anyway, except without the opcache part. I have some file watchers setup to detect changes and executes the following upon said change(s): /path/to/php.exe -d zend_extension=php_opcache.dll -d opcache.enable_cli=1 -r "opcache_reset();" The key is ensuring that you're enabling opcache in CLI. I've been using this for some time, so I can attest to this being a viable solution without needing to create a script to execute somewhere in the document root, etc. I'm only referring to Laravel as an example of why I chose to explore options for solving this problem. This should translate to any scenario a developer would need to utilize opcache in their project(s) while using the built-in web server.
Run this to clear cache php -r 'opcache_reset();'
For people who have difficulties with constants and opcache_reset(). If you include a file with constant and do an opcache_reset() in the same file, you'll probably have some error like : "Notice: Constant already defined" The trick is to call opcache_reset() in an isolated file, then include another file that include the file with constants. File a.php <?php opcache_reset(); include 'b.php' ?> File b.php <?php include 'constants.php'; ?> File constants.php <?php define('MY_CONST', 'abcdef'); ?> With this trick, the opcache will be reset in a.php and when b.php will be included, the constants will not be in cache anymore.