PHP7 и Magento 1.9. Исправляем ошибки совместимости.

Установка магенто на PHP7, значительно улучшит производительность сайта. Но просто так поставить на новую версию PHP не получится, в ходе своей работы я нашел только две ошибки, которые повлияют на работу magento. С этими двумя проблемами я столкнулся в версиях от 1.9.1 до 1.9.2.3., последнюю версию 1.9.2.4, я не проверял и не тестил, но скорее всего в ней эти проблемы также присутствуют.

 

Ошибка генерации шаблонов Magento (Fatal error: Uncaught Error: Function name must...)

После перехода PHP на версию 7, после первой загрузки страницы, у вас скорее всего будет фатальная ошибка следующего содержания:

Fatal error: Uncaught Error: Function name must be a string in app/code/core/Mage/Core/Model/Layout.php:555

Эта ошибка связана с изменением в обработке переменных, нужно указать PHP 7, что вы используете "$callback" переменную как метод или функцию. Поэтому вам нужно исправить стандартное присвоение переменной "$out" в функции getOutput(), т.е. исправить строчку:

$out .= $this->getBlock($callback[0])->$callback[1]();

Для того чтобы всё заработало, исправляем ее на:

$out .= $this->getBlock($callback[0])->{$callback[1]}();

Для безопасности ядра и дальнейшего обновления CMS Magento, вынесите класс “Mage_Core_Model_Layout” в local, т.е. скопируйте файл "Layout.php" в " app/code/local/Mage/Core/Model/" с созданием всех недостающих папок.

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

 

PHP7 и ошибка загрузки изображений - Upload HTTP Error (HTTP ошибка при закачивании)

Следующая ошибка возникает, когда вы попытаетесь загрузить изображение в категорию или товар, ошибка будет показана в административной части сайта или будет записана в логах как фатальная ошибка.

Мне решить эту проблему помогло исправление в одном файле - /lib/Varien/File/Uploader.php. Это также, как и выше связано, с изменениями в php7, теперь переменные интерпретируются строго слева направо.

Находим строку

$params['object']->$params['method']($this->_file['tmp_name']);

И меняем ее на

$params['object']->{$params['method']}($this->_file['tmp_name']);

После этого, все снова заработало.

Но я пока не уверен, что проблемы совместимости, закончились только на этих двух проблемах.