Как успешно перенести приложение Zend Framework 1 из CloudControl Luigi в стек Pinky?
Легкая часть...
Обычно при миграции приложения ZF1 со встроенной автоматической загрузки на автоматическую загрузку на основе композитора (что настоятельно рекомендуется для развертывания в стеке CloudControls Pinky) достаточно выполнить несколько простых шагов:
Создайте файл composer.json и требуйте Zend Framework (например, последний выпуск от версии 1.12) с:
{
"require" : {
"zendframework/zendframework1" : "1.12.*"
}
}
Установите зависимости композитора через CLI с:
composer install
Обновите файл.gitignore и добавьте:
vendor/*
Рекурсивно удалить текущую папку ZF из вашего пути к библиотеке (например, ./library
):
rm -r library/Zend
Включите автозагрузчик композитора в свой index.php
перед любым использованием Zend_
классы, добавив:
$loader = include 'vendor/autoload.php';
Удалить все устаревшие, связанные с ZF require
или же require_once
заявления от вашего index.php
- например, это больше не нужно:
require_once 'Zend/Application.php';
Как только вы закончите с вышеупомянутыми изменениями, вы фиксируете и отправляете через git как обычно, а затем вы развертываете новую версию в CloudControl через CLI (где APP_NAME
а также DEP_NAME
здесь обратитесь к вашему приложению и названиям развертывания):
cctrlapp APP_NAME/DEP_NAME deploy
Вы заметите, что cctrlapp
выводит некоторую информацию о разрешении зависимостей композитора и, наконец, инициирует развертывание новой версии. Чтобы проверить, сделано ли это, вы можете запустить:
cctrlapp APP_NAME/DEP_NAME log deploy
Хорошо, журнал развертывания выглядит хорошо - приятно - давайте откроем браузер!
Что за черт! Внутренняя ошибка сервера? Зачем?? Все работало хорошо с локальным стеком LA(M)P!!!
1 ответ
Сложная часть...
К счастью, CloudControl также дает нам доступ к журналам ошибок...
cctrlapp APP_NAME/DEP_NAME log error
Не должно быть слишком сложно выяснить, что здесь не так.
Но... ошибаться...
8/1/14 5:23 AM error [error] [client ] FastCGI: incomplete headers (0 bytes) received from server "/app/php/box/php-fpm"
8/1/14 5:23 AM error [error] [client ] (104)Connection reset by peer: FastCGI: comm with server "/app/php/box/php-fpm" aborted: read failed
Поскольку вышеприведенные сообщения об ошибках не помогают вообще, нам сначала нужно отследить эту самую ошибку. И это действительно может быть сложно! Мы можем немного погуглить. Мы можем что-то попробовать. Затем мы можем перераспределить. Мы можем погуглить немного больше. Мы можем попробовать другое. Затем мы можем перераспределить снова. Мы можем погуглить в другой раз. Мы можем попробовать все остальное. Мы можем... но мы хотим?
К счастью, стек Pinky предлагает еще один способ ускорить процесс (что не все делает Луиджи). Хотя он по-прежнему включает в себя громоздкую ручную отладку, по крайней мере, мы можем сэкономить время - перейдите в CLI и выполните:
cctrlapp APP_NAME/DEP_NAME run bash
CloudControl теперь создает для нас новый контейнер и предоставляет нам доступ к нему на основе SSH-оболочки. Как сказано в документации, все должно быть так, как в наших коробках развертывания:
Распределенная природа платформы cloudControl означает, что невозможно использовать SSH на реальном сервере. Вместо этого мы предлагаем команду run, которая позволяет запустить новый контейнер и подключиться к нему через SSH.
Контейнер идентичен веб-или рабочим контейнерам, но запускает демон SSH вместо одной из команд Procfile. Он основан на том же стековом образе и образе развертывания, а также предоставляет учетные данные надстройки.
Давайте посмотрим, сможем ли мы узнать больше (изнутри контейнера):
cd code/public
php index.php
Хм... ничего не сообщается здесь... и... ничего не сообщается в журналах?! Что за черт?!!
Таким образом, кажется, что есть разница между сетью и контейнерами запуска - и есть! Чтобы выяснить это, я начал с редактирования index.php
сразу:
vi index.php
И через некоторое время мне наконец-то удалось воспроизвести хотя бы еще одну ошибку:
8/1/14 8:55 AM error [error] [client ] FastCGI: server "/app/php/box/php-fpm" stderr: PHP message: PHP Fatal error: require_once(): Failed opening required '' (include_path='/srv/www/code/vendor/zendframework/zendframework1/library:/srv/www/code/library:.:/usr/share/php') in /srv/www/code/vendor/zendframework/zendframework1/library/Zend/ ...
8/1/14 8:55 AM error [error] [client ] FastCGI: server "/app/php/box/php-fpm" stderr: PHP message: PHP Warning: require_once(/srv/www/code/vendor/zendframework/zendframework1/library): failed to open stream: No such file or directory in /srv/www/code/vendor/zendframework/zendframework1/library/Zend/ ...
Похоже, что какой-то файл отсутствует - возможно, связанный с автозагрузкой - не должно быть слишком сложно это исправить.
Но подождите, что это: Failed opening required ''
? Конечно, вам не нужно ничего, что вы глупый код, вы!!
Что ж... при просмотре соответствующих файлов библиотеки ZF вы не найдете там ничего плохого. Пути включения также кажутся правильными - и да, файлы присутствуют - композитор управлял обеими вещами правильно.
Это ошибка PHP!
Чтобы быть более точным, это ошибка в PECL APC, которая влияет на текущие версии Pinky PHP 5.4.30 / APC 3.1.13 - смотрите:
https://bugs.php.net/bug.php?id=62398
И именно в этом разница между запуском и веб-контейнерами, так как php.ini
вариант apc.stat
установлен в 0
(выкл) для веб-контейнеров и 1
(на) для контейнера запуска.
ТЛ; др
Клонируйте сборочный пакет CloudControl Pinky PHP от GitHub:
git clone https://github.com/cloudControl/buildpack-php.git
Скопируйте все файлы из этого хранилища и добавьте их в корневую папку вашего проекта по адресу:
.buildpack/php
редактировать .buildpack/php/conf/php.ini
и установить:
apc.stat = 1
Зафиксируйте, нажмите, разверните и наслаждайтесь!
Заметки:
Помните, что это всего лишь обходной путь, так как статистику APC не нужно активировать в такой среде (где стек создается заново при развертывании), и это замедляет выполнение. Смотрите PHP документы:
На рабочем сервере, где файлы сценариев изменяются редко, можно добиться значительного повышения производительности с помощью отключенной статистики.
Спасибо:
Наконец, я хотел бы поблагодарить Димитриса и Матеуша из CloudControl за общие советы - хотя мне нужно самому выяснить, что здесь происходит. Кроме того, я хочу поблагодарить @BullfrogBlues и @Thierry_Marianne здесь, в Stack Overflow, которые пытались ответить на другую ветку вопросов, относящуюся к ноябрю прошлого года, которая, наконец, указала мне на поиск проблем, связанных с APC.