2017-02-28 106 views
17

我一直在争取这一点,并不能弄明白,也许别人有或可能有一个更深层次的问题在这里与苗条,PHP,Apache等工作后很好小时,我的苗条安装将开始在所有路线给这个:间歇性的PHP抽象类错误

Fatal error: Class Slim\Collection contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (IteratorAggregate::getIterator) in F:\Projects\example\server\vendor\slim\slim\Slim\Collection.php on line 21

疯狂地,如果我重新启动Apache,这个问题消失。 (对于几个小时呢。)

我发现这个地方有人在两年前也有类似的问题,并帮助人吵着他们没有实际帮助都:https://community.apachefriends.org/viewtopic.php?p=250966&sid=96ef58aaeb7fe142a7dcdfd506a8683f

我试着做一个干净的擦拭并安装我的作曲家供应商目录。这不能解决它。我可以清楚地看到getIterator在错误消息中的文件中按预期方式实现。

PHP版本7.0.12,Windows 7中,86 PHP构建

它在几个小时后再次发生,具有不同但类似的错误消息:

Fatal error: Class Pimple\Container contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (ArrayAccess::sqlserver) in F:\Projects\example\server\vendor\pimple\pimple\src\Pimple\Container.php on line 34

这个问题有一个类似的问题, “解决”它通过重新启动PHP,但这显然不是一个实际的解决方案,并且我没有启用opcache: PHP 7, Symfony 3: Fatal error 1 abstract method and must therefore be declared abstract or implement the remaining methods

任何猜测?请记住:这条消息是在我没有写入的文件中,并且在Apache重启时消失。是否有PHP 7的缓存会导致这种情况?

编辑17年3月10日:

是的,我已经打开搭配修身票。我也看到它在一个非瘦身文件(疙瘩),所以我不认为这是一个苗条的问题。 https://github.com/slimphp/Slim/issues/2160

正如我所说,我的opcache已关闭。我已经证实在php.ini文件和phpinfo()中都是如此。

+0

我试过更新到PHP 7.1,并且每天都会触发一次,迫使apache重新启动。 –

+0

这与我的问题类似:https://phabricator.wikimedia.org/T152502 –

+0

我没有苗条的经验,所以这是问题文件? https://github.com/slimphp/Slim-Http/blob/master/src/Collection.php如果不是,那么你可以发布代码吗?你有没有尝试联系框架的维护者? – MonkeyZeus

回答

7

我想你已经碰到了this opcache bug。这不完全相同的情况,但可能相关。

After calling opcache_reset() function we encounter some weird errors. It happens randomly on servers (10 of 400 servers production)

Some letter a replaced by others, Class seems to be already declared.. etc

Example of errors triggered after opcache_reset():

  • PHP Fatal error: Class XXX contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (YYY::funczzz) in /dir/dir/x.php on line 20

票据已关闭,因为开发人员没有足够的信息来重现它。如果你能想出最小的可重复的情况,我建议reporting it。创建一个非常小的Slim应用程序,然后使用JMeter或其他工具发出很多请求。发布你的发现。

与此同时,唯一的解决方法可能是关闭opcache在php.ini:

opcache.enable=0 

当然,这将大大损害性能。在解决问题之前,您必须在性能或定期重新启动Apache之间进行选择。

如果关闭缓存不起作用,那么我能想到的唯一原因是opcode编译器的间歇性问题。缓存或不编译版本必须有一个错误。如果这是造成这种情况的原因,那么使用PHP开发人员打开一个可复制的票证或者自己调试PHP源代码将是唯一的出路。

+2

是的,我也这么认为。所以我禁用了它,并在我的问题中提到了这一点。禁用后仍然会发生很长时间。 –

+0

添加到我的答案。也许,虽然不太可能,但这是编译器的问题。 –

+0

@WillShaver只是想知道您是否曾经为您的问题找到解决方案,因为目前我遇到了同样的问题 –

2

如果您是在Windows上开发的,我建议您不要使用XAMPP或WAMPP,并尝试在VM上使用Linux的真正开发服务器。

尝试安装Vagrant和Virtualbox,然后前往puphpet.com,它可以生成虚拟机配置。解压缩下载,cd到文件夹中,输入vagrant。然后,将您的主机指向虚拟机。我敢打赌,一旦你有一个真正的开发环境,这个错误就会消失。你的其他选择是Docker,但是有一点学习曲线。

问题不在于您的代码(或您的供应商代码),而在于您的平台。

+0

请参阅[此错误报告](https://bugs.php.net/bug.php?id=72112)看起来这个错误在Unix/Linux中也可用** Woops ** – RiggsFolly

1

我有使用CodeIgniter和PHP 7.1.x的同样的问题。

我升级到PHP 7.2并且问题不再发生。

0

我也遇到了这个确切的行为,这是不准确错误opcache,即使是造成opcache

问题是我们有几个具有相同基名的类,例如

Request\GenericProtocol\Dispatcher  abstract 
Request\Protocol1\Dispatcher 
Request\Protocol2\Dispatcher 

现在,在默认情况下我们的安装opcache使用“优化”,即用作缓存键基名唯一。因此,无论何时脚本碰巧在干净的缓存上实例化Protocol2 Dispatcher,它都会巧妙地破坏Protocol1的所有后续调用。由于使用模式,这被伪装成任何其他类型的错误。

最后,我们刚刚启动了相应的选项:

opcache.use_cwd boolean

If enabled, OPcache appends the current working directory to the script key, thereby eliminating possible collisions between files with the same base name. Disabling this directive improves performance, but may break existing applications.

断裂情况是这样的:你至少有两个具有相同基

我们的下一次迭代确实计划重新命名很多班

Request\Protocol1\Dispatcher ==> Request\Protocol1\Protocol1Dispatcher 

能够重新禁用use_cwd和挤压性能的百分之几(PTBs和PHB的认为它是值得的),但我知道这可能不适用于每个框架。