PHP7提供了一个名为opcache的字节码缓存机制.我想知道是否有任何方法可以分发和运行PHP脚本(.bin文件扩展名)的"opcached"版本而不分发其源代码.(我启用了opcache.file_cache指令php.ini以获取.bin文件.)
我假设在执行脚本时,PHP7将检查opcache目录中是否有匹配名称,时间戳的.bin文件,甚至可能比较校验和或哈希值.如果所有内容都匹配,PHP7将执行.bin文件而不是解析.php文件.即使相应的.php脚本不存在,也许有可能"欺骗"PHP执行.bin文件?
我在Windows 10上使用WAMP,在Apache 2.4上运行PHP 7.2
当我打开OPcache时,我加载的页面在Chrome中崩溃并出现以下错误:
ERR_CONNECTION_RESET
我检查了php错误日志和Apache错误日志,但未找到任何报告的错误.我试图禁用Xdebug,仍然是相同的崩溃,并且在日志中没有错误.关闭OPcache或切换到php 7.1或更低版本可以解决问题.
我到处寻找有关如何调试导致OPcache失败的原因(以及原因)的一些信息,因为关闭它不是一个解决方案,但找不到任何有用的东西(也检查过类似的SO问题,比如这个也没有因此,我正在向专家们寻求帮助,我相信这也将有助于其他人.
谢谢.
PS注意一个很长的手动试错后,我能找到的文件在我的PHP应用程序,它是造成OPcache失败/崩溃,并列入黑名单在OPcache php.ini配置该文件(也降低了它的大小工作得很好,所以我怀疑问题是内部的实际代码),但我仍然在寻找一种简单的方法来调试这些问题,而无需检查和检查服务器上的每个文件.我也不知道它为什么会失败,所以找到失败的原因将有助于向OPcache开发人员提交bug报告.
编辑: 添加pastebin链接需要将代码添加到问题中.这是pastebin文件的开头:
<?php
global $_LANGADM;
$_LANGADM = array();
$_LANGADM['AdminAddressesd3b206d196cd6be3a2764c1fb90b200f'] = 'Delete selected';
$_LANGADM['AdminAddressese25f0ecd41211b01c83e5fec41df4fe7'] = 'Delete selected items?';
Run Code Online (Sandbox Code Playgroud)
我在寻找:
1)一种轻松确定OPcache是使脚本失败的扩展的方法,无需通过手动试验和错误遍历每个扩展(打开/关闭它们直到找到失败的扩展名).
2)轻松找到一种方式/日志,显示启用OPcache时哪个文件及其失败的原因.
简单来说 - 我们怎么知道OPcache失败时何时,何地以及为什么会失败,因为没有任何报告/日志就像在大海捞针一样,尤其是当OPcache失败时,即使Xdebug似乎没有记录或输出任何内容, 由于某些原因.
再次感谢
我在CentOS上安装了PHP 5.5(据我所记得的,来自Remi repo).
现在我想打开opcache并配置它,但事实证明我在系统中没有opcache.so文件.所以我试着用yum安装它.
# yum --enablerepo=remi install php-pecl-zendopcache
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirror.proserve.nl
* epel: mirror.proserve.nl
* extras: ftp.tudelft.nl
* remi: remi.mirrors.hostinginnederland.nl
* rpmforge: nl.mirror.eurid.eu
* updates: mirror.proserve.nl
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package php-pecl-zendopcache.x86_64 0:7.0.2-2.el6.remi will be installed
--> Processing Dependency: php(zend-abi) = 20100525-x86-64 for package: php-pecl-zendopcache-7.0.2-2.el6.remi.x86_64
--> Processing Dependency: php(api) = 20100412-x86-64 for package: php-pecl-zendopcache-7.0.2-2.el6.remi.x86_64
--> Finished Dependency Resolution
Error: Package: php-pecl-zendopcache-7.0.2-2.el6.remi.x86_64 (remi)
Requires: …Run Code Online (Sandbox Code Playgroud) 我只是想知道同时使用Xcache 3和Zend Opcache缓存PHP文件是愚蠢的吗?我知道两者几乎都做同样的工作,但不确定这是否会对性能和速度产生任何影响.
我想加快我的php页面加载速度,以便访问者不需要等待很长时间.
有什么想法吗?
该容器是由一个简单的 Dockerfile 构建的:
FROM php:7.2.19-fpm
RUN docker-php-ext-configure opcache --enable-opcache \
&& docker-php-ext-install opcache
Run Code Online (Sandbox Code Playgroud)
我没有更改 php.ini,所以所有设置都是默认的。
令人意想不到的是,现在 phpinfo 显示(摘录):
Opcode Caching Up and Running
Optimization Disabled
SHM Cache Enabled
File Cache Disabled
opcache.enable On On
opcache.optimization_level 0 0x7FFFBFFF
Run Code Online (Sandbox Code Playgroud)
问题:我还需要做什么才能启用优化?
假设我正在使用PHP 5.5操作码缓存,并设置
opcache.memory_consumption=128
如果我在php-fpm中有4个池,那么4个池中的每个池共享128MB的缓存,或者它们是否会为每个池拥有128M的opcache?
如果我在 php.ini 文件中设置此配置:
opcache.revalidate_freq = 0
Run Code Online (Sandbox Code Playgroud)
它仍然比禁用 Opcache 系统更好吗?
因为在我看来,它会检查每个请求的文件更新,所以它就像 Opcache 被禁用一样。
我试图在WAMP 3中为Drupal 8.0.4启用OPCache但是它不起作用.所以我用google搜索并更改了我的php.ini文件中的一些内容,这是我更改的内容:
opcache.enable=0
Run Code Online (Sandbox Code Playgroud)
至
opcache.enable=1
Run Code Online (Sandbox Code Playgroud)
并且
opcache.enable_cli=0
Run Code Online (Sandbox Code Playgroud)
至
opcache.enable_cli=1
Run Code Online (Sandbox Code Playgroud)
但是,'!' 标记出现在PHP扩展附近.当我尝试获取日志时,它说:
Sorry,
The 'php_opcache' extension cannot be loaded by 'extension=php_opcache.dll' in php.ini. Must be loaded by 'zend_extension='.
Switch cancelled
Press ENTER to continue...
Run Code Online (Sandbox Code Playgroud)
但是在PHP.ini文件中它说:
zend_extension ="C:/wamp/bin/php/php7.0.0/ext/php_opcache.dll"
Run Code Online (Sandbox Code Playgroud)
我还应该做些什么才能启用OPCache?
也许这是一个愚蠢的问题,但我试图弄清楚 max_accelerated_files 实际是如何工作的......
我理解 PHP net 的“描述/说明”
opcache.max_accelerated_files 整数 OPcache 哈希表中键(以及脚本)的最大数量。使用的实际值将是素数集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中大于或等于配置值的第一个数字。最小值为 200。 PHP < 5.5.6 中最大值为 100000,更高版本中为 1000000。
但我的问题是配置后它会如何处理这个数字。它是否为此设置分配内存?如果我们有足够的内存,为什么我们不直接设置数字 1000000 就这样呢?如果我们将此数字配置为 2000 并且我们有 2010 个文件,会发生什么情况?它们是否对堆栈进行某种排序,一旦该文件发生变化,它就会被缓存?未缓存的文件会发生什么情况?
谢谢您的回答