我在ubuntu服务器上遇到php-fpm 5.6.30
OPcache v7.0.6-dev
的奇怪错误。我在/vendor/monolog/monolog/src/Monolog/Logger.php
文件中收到有关array_keys(static::$levels)
代码的错误:
array_keys()期望参数1为数组,给定对象
static::$levels
属性在Logger.php
文件的顶部定义为数组:
protected static $levels = array(
self::DEBUG => 'DEBUG',
self::INFO => 'INFO',
self::NOTICE => 'NOTICE',
self::WARNING => 'WARNING',
self::ERROR => 'ERROR',
self::CRITICAL => 'CRITICAL',
self::ALERT => 'ALERT',
self::EMERGENCY => 'EMERGENCY',
);
此代码是通过composer安装的,从不手动编辑,因此没有理由更改文件。
当我查看我的laravel.log
时,我发现某些内容已经改变了代码行为,因此日志中的行改变了它们的格式:
[2018-05-16 00:19:22] production.INFO: blabla
[2018-05-16 00:20:04] production.[object] (DateTimeZone: {"timezone_type":3,"timezone":"UTC"}): blablabla
关键的事实是,当我使用nano
打开文件时,在其中添加了注释行并保存,该错误消失了。这意味着错误的代码在opcache中,而不是在框架的代码中。
总而言之,Logger.php
的字节码以某种方式被改变,php看到了包含DateTimeZone
个对象的对象而不是字符串数组。
问题是 - 如何在不完全崩溃的情况下更改缓存的字节码?究竟是什么能做到的?高内存消耗会导致这种意想不到的变化吗?
答案 0 :(得分:1)
我们的项目中遇到了同样的问题(php 5.6.30,opcache v7.0.6-dev)。为了解决这个问题,我们分析了opcache设置,发现interned_strings_buffer是4Mb。将此值提高到64 Mb,我们解决了这个问题。