Niezaprzeczalną zaletą chmury jest to, że poza kilkoma podstawowymi informacjami, nie musimy przejmować się administrowaniem serwerem, na którym stoi nasza aplikacja. Niestety w praktyce pojawiają pewne drobne przeszkody, skutecznie utrudniające postawienie aplikacji w chmurze, zwłaszcza jeśli aplikacja to coś więcej niż kilka skryptów PHP.

W przypadku aplikacji opartej o Zend Frameworka 2 (oraz każdej innej, w której index.php znajduje się w innym katalogu niż główny) pojawia się problem z głównym katalogiem aplikacji. Kolejnym problemem jest dostęp do bazy danych (w końcu wszystko jest w chmurze) oraz plikiem konfiguracyjnym zawierającym dane dostępowe do niej.

Pierwszy problem jest prosty do rozwiązania i sprowadza się do utworzenia w głównym katalogu aplikacji pliku .htaccess, w którym wskazujemy właściwy katalog.

RewriteEngine on
RewriteCond %{HTTP_HOST} ^jakas-domena.pl$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www.jakas-domena.pl$
RewriteCond %{REQUEST_URI} !public/
RewriteRule (.*) /public/$1 [L]

W ten prosty sposób spowodujemy, że aplikacja oparta o ZF2 zadziała w AppFog.

Nieco gorzej sprawa wygląda z bazą danych. W ZF2 wprowadzono nowy sposób rozdzielenia plików konfiguracyjnych. Zamiast środowisk mamy do dyspozycji pliki globalne oraz lokalne. Według dokumentacji pliki globalne zawierają konfigurację współdzieloną przez wszystkie wersje aplikacji (testowa, produkcyjna), a pliki lokalne, które nie powinny być przechowywane w systemie kontroli wersji, lokalną konfigurację oraz dane dostępowe do bazy. Rodzi to pewien problem, ponieważ pracując lokalnie na aplikacji, korzystamy z lokalnej bazy danych, której konfiguracja różni się od wersji zainstalowanej w chmurze. Aby obejść to ograniczenie, wystarczy wprowadzić drobną modyfikację w pliku application.config.php oraz utworzyć nowy plik konfiguracyjny, dedykowany dla konkretnego środowiska. Plik taki niczym nie różni się od typowego pliku local.php, z tą różnicą, że nie powinien zawierać w nazwie przyrostków global, ani local. W moim przypadku plik nazwałem po prostu appfog.php.

Modyfikacja jaką należy wprowadzić w pliku konfiguracyjnym aplikacji wygląda następująco:

return array(
    /* pozostała konfiguracja */
    'module_listener_options' => array(
        'config_glob_paths'    => array(
            'config/autoload/{,*.}{global,local}.php',
            'config/autoload/{,*.}' . (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'empty') . '.php',
        ),
    ),
    /* pozostała konfiguracja */
);

Zmienną środowiskową APPLICATION_ENV należy ustawić w panelu AppFog, a jako jej wartość podać nazwę pliku konfiguracyjnego (w tym przypadku appfog). Na koniec wystarczy dodać plik empty.php zwracający pustą tablicę, by uniknąć błędów podczas pracy na lokalnej kopii projektu.

Ostatnim problemem z jakim przyjdzie nam się zmierzyć podczas korzystania z AppFog jest obsługa bazy danych. Teoretycznie można grzebać się w konsoli, jednak nie jest to ani szybkie, ani wygodne. Na szczęście z pomocą przychodzi phpMyAdmin, który możemy zainstalować jako niezależną aplikację i powiązać z usługą MySQL. Szczegółowe informacje na temat instalacji phpMyAdmin znajdują się pod adresem https://docs.appfog.com/services/mysql#phpmyadmin.