k-holyのPHPとか諸々メモ

Webで働くk-holyがPHP(スクリプト言語)とか諸々のことをメモしていきます。ソースコードはだいたいWindowsで動かしてます。

SqaleのPHPアプリケーションでSilexを動かしてみたメモ

私のような真性PHPerは指を咥えて見ているしかなかったクラウドPaaS Sqale ですが、PHPに対応されたとの嬉しい知らせがありました。

SqaleでPHPアプリケーションも利用可能になりました! | Sqale Information

更に、このタイミングでアプリケーション1個が無料になるというキャンペーンも…!!

Sqale『無料アプリケーション1個 プレゼント』キャンペーン実施中! | Sqale Information

これは試してみるしかないでしょう。

そんなわけで、SqaleのPHPアプリケーションでSilexを動かしてみたメモです。

注意点

Sqaleの環境に不慣れな真性PHPerとして、色々とはまって調べたり思い込みで誤ったことがありましたので、まず注意点をまとめておきます。

SqaleのサーバにSSHで接続する方法

管理画面から登録した公開鍵でログインできます。

ssh -p 2222 sqale@gateway.sqale.jp

ポートは 2222 または 443 が使えるようです。

Sqale - FAQ: 技術的な仕様に関する質問

PHPアプリケーションのWebサーバはApache

Rubyアプリケーションの場合はWebサーバは nginx になりますが、PHPアプリケーションの場合は Apache + PHP-FPM になるようです。

Sqale - 主な仕様

$ httpd -v
Server version: Apache/2.4.3 (Unix)
Server built:   Feb  5 2013 21:37:52

バージョンは現在のところ2.4.3が入ります。

Apacheなので、Silexを使う場合はドキュメントルート /home/sqale/current/public/ 以下に .htaccess を設置することになります。

リポジトリへのpush時にサーバに上書き反映される

ファイルのアップロードはアプリケーション管理画面からSFTPで上げるか、Gitで上げるかを選択するようになってます。

Gitを選択した場合は、下記のように git clone コマンドがアプリケーションの詳細画面 (https://sqale.jp/projects/アプリケーション名) に表示されます。

$ git clone ssh://sqale@gateway.sqale.jp:2222/kholy/demo.git

これをGitの使える開発環境でコピペして、commit → push することでリポジトリの内容がサーバの /home/sqale/current/ 以下に反映されます。

基本的に push するたびに /home/sqale/current/ 以下がリポジトリの内容で上書きされるようなので要注意です。

ただし現在のところ、リポジトリに commit したはずの .htaccess がサーバに反映されない現象が発生しています。(後述)

[2013-03-18 追記]上記の現象は、コントロールパネルから.htaccessを生成するWordPressへの対策がうまく動いていなかったためだそうで、現在はリポジトリに含めた .htaccess については正常に反映されています。

Composerのvendorディレクトリ

/home/sqale/current/ 以下にデフォルト設定の composer.json を置いてインストールした場合、/home/sqale/current/vendor/ がvendorディレクトリになります。

前述の通り、pushするたびにリポジトリの内容が上書きされるようで、vendorディレクトリの中身が一部(?)消えてしまうことがありました。

Composerを使う場合、composer.jsonでvendorディレクトリのパスをリポジトリの外に指定した方が良いと思います。

(こういう配置先の環境に依存する設定を、依存パッケージの構成と一緒に書くのはどうなんだろう、という感じはしますが…)

{
    "config": {
            "vendor-dir": "../vendor"
    }
}

Silexを動かしてみる

これまでの注意点を踏まえて、composerでSilexをインストールして動かしてみます。

ここからはSSHでSqaleサーバに入ります。

curlコマンドでcomposer.pharをインストールします。

$ curl -s http://getcomposer.org/installer | php
#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: /home/sqale/composer.phar
Use it: php composer.phar

~/.profile では ~/bin があればPATHに追加するようになっていますので、binディレクトリを作ってcomposer.pharはそちらに移動しておきます。

$ mkdir bin
$ mv composer.phar ~/bin

/home/sqale/current/ 直下に設置する composer.json です。前述の問題のため vendor-dir を変更しています。

{
    "require": {
            "silex/silex": "1.0.*@dev"
    },
    "config": {
            "vendor-dir": "../vendor"
    }
}

パッケージをインストールする際は、-d オプションで作業ディレクトリとして composer.json の設置先を指定します。

$ composer.phar install -d /home/sqale/current/
Loading composer repositories with package information
…中略…
Writing lock file
Generating autoload files

アプリケーションコードはこんな感じで。

ルーティングの確認のため、phpinfo()の結果を表示する /phpinfo も設定しました。

index.php

<?php
require_once realpath(__DIR__ .'/../../vendor/autoload.php');

use Silex\Application;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

$app = new Application();

$app->get('/', function(Application $app, Request $request) {
    return new Response(<<< CONTENT
<html>
<body>
<h1>Hello Silex World!!</h1>
</body>
</html>
CONTENT
    );
});

$app->get('/phpinfo', function(Application $app, Request $request) {
    return $app->stream('phpinfo');
});

$app->run();

これらをローカルのGitで commit → push した上で http://demo-kholy.sqale.jp/ を確認します。

<html>
<body>
<h1>Hello Silex World!!</h1>
</body>
</html>

OKなので、次に http://demo-kholy.sqale.jp/phpinfo を確認します。

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /phpinfo was not found on this server.</p>
</body></html>

前述した通り、リポジトリに入れた .htaccess が反映されない問題のため、404が返されました。

以下のように、直接サーバにファイルを作成してみるとちゃんとphpinfo()が表示されました。

$ echo "FallbackResource /index.php" > ~/current/public/.htaccess

.htaccess を作成してからもう一度git pushしてみたところ削除はされません。

作成した .htaccess をサーバから直接削除してからもう一度git pushしてみたところ、やはりファイルはサーバに反映されませんでした。

もちろん、リポジトリにはちゃんと追加されてます。

$ git ls-files
.gitignore
composer.json
composer.lock
public/.htaccess
public/.undeletable
public/index.php

どうも、リポジトリから自動で反映される際に除外されているようです…うーん?

Sqaleへのデプロイ作法的なルールがあるんでしょうか。

[追記]

公式のサポート情報でZendFramework2のComposerを使ったインストール方法が掲載されました。

Sqale - Zend Framework 2 を利用する

こちらによると、.gitignoreでComposer関連ファイルを無視するよう指定されているものを解除するよう説明されています。

Composerを使っていても、依存ライブラリの実ファイルはアプリケーションのリポジトリに含むのが一般的なんでしょうか。

(恥ずかしながらComposerを実務のアプリケーション開発では使ってないので、どうするのが良いのか分かりません…)

あと、.htaccess等の環境設定をリポジトリには含めないのが一般的だとしたら、Sqale側で意図的にデプロイ対象から除外しているのかも?

公式のFAQにデプロイ時のフックスクリプトを実行できる仕組みが書かれてました。

Sqale - FAQ: 技術的な仕様に関する質問

アプリケーションのルートディレクトリにpostinstallというファイル名のシェルスクリプトを実行してくれるみたいです。 これ使ってデプロイ時に.htaccess作成するってことかな…。

[追記 2013-03-18]

上にも書きましたが、現在はリポジトリに含めた .htaccess が正常に反映されることを確認しました。

PHPアプリケーションでもpostinstallによるデプロイ時のフックをかけることは可能とも回答をいただきましたので、後で併せて確認します。

(問い合わせへの返信メールでsqaleの方から説明をいただきました)