opcache_reset

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

opcache_reset重置操作码缓存的内容

描述

opcache_reset(): bool

此函数重置整个操作码缓存。在调用 opcache_reset() 后,所有脚本在下一次被访问时都会被重新加载和重新解析。此函数只重置内存中的缓存,不重置文件缓存。

参数

此函数没有参数。

返回值

如果操作码缓存已重置,则返回 true,如果操作码缓存已禁用或重启正在进行或正在等待(参见 opcache_get_status()),则返回 false

参见

添加注释

用户贡献的注释 7 个注释

fbgolly at gmail dot com
7 年前
我通过 CLI 清理缓存的变通方法是创建一个像这样的 bash 脚本

#!/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

把它放在 /usr/local/bin/opcache-clear 中并使其可执行。
当我想清理缓存时,我只需在终端中运行 "opcache-clear"。
匿名
8 年前
应该提到的是,opcache_reset() 在通过 cli 执行时不会重置缓存。
所以 `php -r "var_dump(opcache_reset());"` 输出 "true" 但不会清理缓存。创建文件,通过 http 访问它 - 缓存就会被清理。
mike
7 年前
在某些(大多数?)系统中,PHP 的 CLI 具有与 Web 服务器或 PHP-FPM 进程使用的操作码缓存不同的操作码缓存,这意味着在 CLI 中运行 opcache_reset() 不会重置 Web 服务器/fpm 操作码缓存,反之亦然。
Jan
4 年前
对于较长的 php 脚本:opcache_reset() 将获得一个锁,并且只有在脚本结束之后才会重置缓存,之后锁会被释放。

在单个脚本中调用 opcache_reset() 多次或任何其他 opcache 操作方法,例如 opcache_invalidate(),在调用 opcache_reset() 之后没有用:当 opcache_reset() 持有锁时,其他 opcache 方法将返回 false,并且它们对缓存没有影响。

虽然 opcache 操作方法在此锁期间没有影响,但 opcache 会重新缓存对应于 opcache.revalidate_freq 设置的脚本,前提是 opcache.validate_timestamps 已开启。

为了保持缓存更新,在修改单个 php 文件时使用 opcache_invalidate()。对于更大的更改,仅在 php 脚本结束时使用 opcache_reset()。
erutan409 at hotmail dot com
5 年前
所以,我想分享一些可能对那些寻找在 CLI 中重置 opcache 方法的人有帮助的东西。

例如,在我的情况下,我运行的是一个带有内置 Web 服务器的 Laravel 应用程序,用于本地开发。我使用以下运行配置启用了 opcache

/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

这基本上是 artisan serve 在幕后所做的,只是没有 opcache 部分。

我有一些文件监视器设置来检测更改,并在更改时执行以下操作

/path/to/php.exe -d zend_extension=php_opcache.dll -d opcache.enable_cli=1 -r "opcache_reset();"

关键是确保你在 CLI 中启用了 opcache。我已经使用它一段时间了,所以我可以证明这是一个可行的解决方案,无需在文档根目录等地方创建脚本执行。

我仅将 Laravel 作为我选择探索解决此问题的方案的示例。这应该适用于开发人员在使用内置 Web 服务器时需要在项目中使用 opcache 的任何场景。
Marsius777
6 年前
运行此命令以清除缓存:php -r 'opcache_reset();'
antoine dot vdsk at gmail dot com
9 年前
对于那些在常量和 opcache_reset() 方面有困难的人。
如果你包含一个带有常量的文件,并在同一个文件中执行 opcache_reset(),你可能会遇到类似于

"Notice: Constant already defined"

这样的错误。诀窍是在一个隔离的文件中调用 opcache_reset(),然后包含另一个文件,该文件包含带有常量的文件。

文件 a.php
<?php
opcache_reset
();
include
'b.php'
?>

文件 b.php
<?php
include 'constants.php';
?>

文件 constants.php
<?php
define
('MY_CONST', 'abcdef');
?>

使用此技巧,opcache 将在 a.php 中被重置,当 b.php 被包含时,常量将不再处于缓存中。
To Top