2017-02-28 103 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的認爲它是值得的),但我知道這可能不適用於每個框架。