PHP: странное поведение foreach - PullRequest
0 голосов
/ 10 апреля 2020

Ниже кода, который работает должным образом, прежде чем я попытаюсь использовать key во время итерации. При этом я вижу ошибку: «Разрешен объем памяти 1073741824 байт исчерпан (попытался выделить 9223372043239833600 байт)». Посмотрите на необходимый объем памяти, это выглядит чудовищно.

getModules возвращает ассоциативный массив, $id - это string.

Есть идеи о возможных причинах?

             foreach (Yii::$app->getModules() as $id => $module) {
                    echo '';
                    var_dump(gettype($module));
                    if (gettype($module) =='array') {
                        var_dump($module);
                    } else if (gettype($module) =='object') {
                        var_dump(get_class($module));
                    }
                    //var_dump($id); // <-- We have problems when try to uncomment this
                    echo '</pre> '; } 

php -v:

PHP 7.0.33-25+0~20200225.32+debian9~1.gbpa11893 (cli) (built: Feb 25 2020 13:16:41) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.33-25+0~20200225.32+debian9~1.gbpa11893, Copyright (c) 1999-2017, by Zend Technologies

ОБНОВЛЕНО: Я только что открыл и сохранил массив модулей через s sh, и ошибка исчезла. Я не догадываюсь, что это было. Выглядит как глюк SSD.

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Проблема в том, что вы всегда перезагружаете все свои модули каждый раз, когда выполняете foreach.

Добавьте переменную перед тем, чтобы сохранить список модулей, и это нормально.

Исправленный код:

<code>$listOfModules = Yii::$app->getModules();
     foreach ( $listOfModules  as $id => $module) {
                    echo '<pre>';
                    var_dump(gettype($module));
                    if (gettype($module) =='array') {
                        var_dump($module);
                    } else if (gettype($module) =='object') {
                        var_dump(get_class($module));
                    }
                    //var_dump($id); // <-- We have problems when try to uncomment this
                    echo '
'; }
0 голосов
/ 11 апреля 2020

Это была проблема opcache. Я отредактировал и сохранил некоторые файлы, но ошибка появилась тут и там на страницах сайта. Итак, я понял, что причина в кеше и только что выполнена opcache_reset().

Надеюсь, что это решение будет полезно для кого-то еще.

...