Как успешно перенести приложение 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.

Другие вопросы по тегам