什么可以对opcached框架代码进行奇怪的更改?

时间:2018-05-16 09:53:50

标签: php laravel-5 php-5.6 fpm

我在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个对象的对象而不是字符串数组。

问题是 - 如何在不完全崩溃的情况下更改缓存的字节码?究竟是什么能做到的?高内存消耗会导致这种意想不到的变化吗?

1 个答案:

答案 0 :(得分:1)

我们的项目中遇到了同样的问题(php 5.6.30,opcache v7.0.6-dev)。为了解决这个问题,我们分析了opcache设置,发现interned_strings_buffer是4Mb。将此值提高到64 Mb,我们解决了这个问题。