• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • opcache_reset()

    (PHP 5 >= 5.5.0, PHP 7, PECL ZendOpcache >= 7.0.0)

    重置字节码缓存的内容

    说明

    opcache_reset(void):boolean

    该函数将重置整个字节码缓存。在调用opcache_reset()之后,所有的脚本将会重新载入并且在下次被点击的时候重新解析。

    参数

    此函数没有参数。

    返回值

    如果字节码缓存被重置成功,则返回TRUE;如果字节码缓存被禁用,则返回FALSE

    参见

    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.