我正在 CentOS / RHEL 6.x 上使用 APC php-pecl-apc-3.1.9 运行 PHP 版本 5.3.3。但是,我在php 服务器日志文件中收到以下警告:
[01-Jul-2012 10:50:49] PHP 警告:require_once():无法为池分配内存。在 /var/www/html/includes/admin.php 第 57 行
[2012 年 7 月 18 日 17:00:08] PHP 警告:include_once():无法为池分配内存。在 //var/www/html/includes/xmlrpc.php 第 55 行
[2012 年 7 月 18 日 17:00:40] PHP 警告:require():无法为池分配内存。在 /var/www/html/includes/geshi.php 第 2307 行
如何修复这些 php 警告?
![](https://www.alaica.com/wp-content/uploads/linux-71.png)
此错误通常与替代 PHP 缓存 (APC) 有关。APC 是一个免费且开放的 PHP 操作码缓存。其目标是提供一个免费、开放且健壮的框架来缓存和优化 PHP 中间代码。
解决方案
编辑文件/etc/php.d/apc.ini(Debian 和/或 Ubuntu Linux 用户编辑/etc/php5/conf.d/apc.ini),输入:
# vi /etc/php.d/apc.ini
确保传递给 mmap 模块的 mktemp-style file_mask 是正确且有效的:
apc.mmap_file_mask = /tmp/apc.XXXXXX
接下来确保每个共享内存段的大小(带有 M/G 后缀)根据您的要求设置正确。就我而言,它设置为 8M:
; 增加到96M apc.shm_size = 96M
您需要调整允许缓存条目在插槽中空闲的秒数,以防另一个条目需要此缓存条目插槽:
apc.ttl = 3600
如果另一个条目需要此缓存条目槽,则允许用户缓存条目在该槽中空闲的秒数:
apc.user_ttl = 3600
缓存条目可以在垃圾收集列表中保留的秒数。
apc.gc_ttl = 3600
保存并关闭文件。确保根据您的网络应用程序要求调整这些值。重新启动 Apache 2 Web 服务器:
# service httpd restart
如果您使用的是 Lighttpd 而不是 Apache2 Web 服务器,请重新启动 Lighttpd Web 服务器:
# service lighttpd restart
如果您使用的是 Nginx 而不是 Apache2 或 Lighttpd,请重新启动 Nginx Web 服务器:
# service nginx restart
或者
# /usr/local/nginx/sbin/nginx -s reload
提示:找出您的 APC 内存使用情况和命中率
您需要找出确切的内存使用情况和命中率,以便您可以根据您的工作负载设置 apc.ttl 和 apc.shm_size。将 /usr/share/php-pecl-apc/apc.php 复制到 /var/www/html 目录,即 Apache DocumentRoot:
# cp /usr/share/php-pecl-apc/apc.php /var/www/html
编辑 /var/www/html/apc.php 并设置管理员密码:
默认值( 'ADMIN_PASSWORD' , '您的新密码-此处' ) ;
保存并关闭文件。启动网络浏览器并输入 url:
http://server-ip-here/apc.php
或
http://server1.example.com/apc.php
示例输出:
![Apc 内存状态和命中率](https://www.alaica.com/wp-content/uploads/linux-72.png)
图01:Apc内存状态和命中率
从上图中我得到了 100.0% 的命中率,并且我几乎使用了所有内存。我需要增加内存并减少 ttl 值,这样我就不会出现内存分配错误。
参考:
- PHP APC 文档。