Browse Tag: php

Rocketeer を投入したお話

PHP という技術制約がある案件で、Rocketeer という一言で言ってしまうと Capistrano の PHP 版になります。
Slack とも連携できていい感じです。

Rocketeer のおもな特長は、次のとおりです。

  • GIT/SVN リポジトリに対応
  • SSH の場合、SSH キーパスフレーズにも対応
  • 任意のデプロイタイミングで、特定の処理を実行することができる

今回は、次のような感じでデプロイするのに使いました。

  • 複数のサーバに SSH 経由でログインする
  • Private Git リポジトリを ssh 経由(SSH キーパスフレーズ付き) clone する
  • デプロイ前後で Slack の専用チャンネルに通知する

実際に使ったところ、いくつか問題があったので、本家にフィードバックはしましたが、今日現在になってもマージされていません。

1. 複数のサーバがデプロイ対象のとき、正しいリビジョン番号でロールバックできない(PR #591

2. Rocketeer の実行ディレクトリがデプロイ対象の git リポジトリでないとき、正しく git のリビジョンを取得できない(PR #592

その他、不具合のではないですが、次の PR もしました。

1. デプロイ対象のユーザが分かるように Notify プラグインに –user の追加(PR #593

2. 各デプロイタスクの前に before / after フックイベントを追加(PR #594

この他、実際に運用を初めて見て1つ次のような問題が発覚しました。

1. 同じサーバ上で、同時に複数のプロジェクトをデプロイする場合、$HOME/.deploy.json ファイルを作って Rocketeer はデプロイ対象サーバを管理しているのですが、なんだか混ざってしまい正しい対象サーバへデプロイすることができない

この問題はさすがに致命的でした。おそらく、そもそも同じサーバ上で同時に複数のプロジェクトをデプロイすることができないことは考えていなかったのではないかと思われます。

この件は、PR をしようかなと思ったのですが、先の PR がすっかり無視されてしまう状態だったので、自分のもの方で修正しました。修正内容としては、デプロイスクリプト上の実行ディレクトリに .deploy.json ファイルを置くように develop ブランチで簡易改良しました。

ということで、この改善を行った結果、デプロイ自体は問題なくすることができました。

頑張って PR したのですが、どうも積極的には開発にはもうあまり取り組んでいない様子なので、Rocketeers の選択はもしかしたら失敗したかもしれませんが、どうしても PHP だけで簡潔したいという場合には、実際には問題なくデプロイできているので大丈夫だと思います。

Rocketeers の設定ファイルは、けっこうめんどくさいので、テンプレートを作ってみました。
このテンプレートを使えば簡単に Rocketeers を使うことができると思います。
テンプレートを clone したあと、僕オリジナルのカスタマイズが入った Rocketeers をインストールします。


$ composer install

設定ファイルは、.rocketeer ディレクトリの中にあります。簡単ですが設定ファイルの説明は、次のとおりです。

  • config.php: デプロイ先のサーバを設定します
  • connections: デプロイ環境ごとの設定ファイルです、テンプレートではローカルホスト環境用の設定ファイルが入っています
  • hooks.php: デプロイの前後のフックの設定ファイルです、デプロイ前後に何らかの処理を追加した場合にはここに設定します
  • paths.php: デプロイ時に利用する各種パスです、基本的には変更する必要はありません
  • plugins: プラグインの設定ファイルです、テンプレートでは Slack プラグインの設定ファイルが入っています
  • remote.php: デプロイ先のディレクトリの設定ファイルです、ファイルのパーミッションなどを変更するときに設定します
  • scm.php: デプロイリポジトリの設定ファイルです、リポジトリの設定をします
  • stages.php: デプロイステージの設定ファイルです
  • strategies: この設定ファイルはよく分かっていません
  • starateies.php: デプロイタスクごとに何を使用するのか設定するファイルです、デプロイ時の動作を変更したいときに設定します

デプロイするコマンドは、次のとおりです。

$ ./vendor/bin/rocketeer deploy --on=local --user=< デプロイユーザ名> -vv

–on はデプロイ環境、–user はデプロイユーザ名(Slack にもこのユーザ名として通知されます)、-vv はデバッグオプション、になります。
–pretend を指定するといわゆる DRY RUN モードになります。

ロールバックするには、次のようになります。

$ ./vendor/bin/rocketeer rollback --on=production --user=< デプロイユーザ名>

このように Capistrano と同じ感じで利用できると思います。

デプロイしたときのログは、.rocketeer/logs/ ディレクトリ以下に出力されます。

Rocketeer ですが、現在はあまりメンテナンスされていない様子ですが、さくっと Capistrano のようなデプロイスクリプトを作りたいときには、便利なツールの1つだと思います。

OS X (10.9) で PHP 5.6.2 で pgsql を組み込もうとしてはまったお話

OS X 10.9 で、pgsql 入りの PHP 5.6.2 を自分でコンパイルしてインストールしようとしたところ、結果いうと make の最後のリンクに失敗してしまってインストールできませんでした。

公式サイトから、PHP 5.6.2 をダウンロードして、次のような configure してみました。なお、事前に postgresql などは homebrew 経由で事前にインストール済みです。
インストール先は、homebrew 以下になっていますが、これは試験的なインストールのためです。


php-5.6.2$ ./configure --prefix=/opt/boxen/homebrew/Cellar/php56/5.6.2 --localstatedir=/usr/local/homebrew/var --sysconfdir=/usr/local/homebrew/etc/php/5.6 --with-config-file-path=/usr/local/homebrew/etc/php/5.6 --with-config-file-scan-dir=/usr/local/homebrew/etc/php/5.6/conf.d --with-iconv-dir=/usr --enable-dba --with-ndbm=/usr --enable-exif --enable-intl --enable-soap --enable-wddx --enable-ftp --enable-sockets --enable-zip --enable-shmop --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-mbstring --enable-mbregex --enable-bcmath --enable-calendar --with-zlib=/usr/local/homebrew/opt/zlib --with-ldap --with-ldap-sasl=/usr --with-xmlrpc --with-kerberos=/usr --with-gd --enable-gd-native-ttf --with-freetype-dir=/usr/local/homebrew/opt/freetype --with-icu-dir=/usr/local/homebrew/opt/icu4c --with-jpeg-dir=/usr/local/homebrew/opt/jpeg --with-png-dir=/usr/local/homebrew/opt/libpng --with-gettext=/usr/local/homebrew/opt/gettext --with-libedit --with-unixODBC=/usr/local/homebrew/opt/unixodbc --with-pdo-odbc=unixODBC,/usr/local/homebrew/opt/unixodbc --mandir=/usr/local/homebrew/Cellar/php56/5.6.2/share/man --with-mhash --with-curl=/usr --with-snmp=/usr --with-bz2=/usr --with-openssl=/usr --with-xsl=/usr/local/homebrew/opt/libxslt --with-apxs2=/usr/sbin/apxs --libexecdir=/usr/local/homebrew/Cellar/php56/5.6.2/libexec --with-mysql-sock=/tmp/mysql.sock --with-mysqli=mysqlnd --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --enable-pcntl --enable-zend-signals --enable-dtrace --disable-phpdbg --enable-opcache
php-5.6.2$ make
...
Undefined symbols for architecture x86_64:
"_lo_lseek64", referenced from:
_zif_pg_lo_seek in pgsql.o
"_lo_tell64", referenced from:
_zif_pg_lo_tell in pgsql.o
"_lo_truncate64", referenced from:
_zif_pg_lo_truncate in pgsql.o
ld: symbol(s) not found for architecture x86_64

そして、homebrew-php という、PHP に特化した Homebrew をラップしているものがあったので、試しにこれでインストールしてみました。


$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/homebrew-php
$ brew install php56 --with-apache --with-pgsql
...

この方法だと、pgsql を組み込んでインストールすることができました。
実は、最初に紹介した configure オプションは、この PHP5.6 Formula でインストールしたときの configure とまったく同じものだったのですが、なぜか同じ configure オプションでもインストールできませんでした。おそらく、make するときの環境変数の設定まわりできっと Homebrew がよきにやってくれているようなのですが、すこしソースコードを追った感じだと具体的な原因は分かりませんした。

実はいままで phpenv + php-build の環境で使って開発をしていたのですが、そもそも PHP をまったく切り替えることがないし、phpenv けっこう重いので、これを気に homebrew-php に切り替えて phpenv + php-build を使うのはやめることにしました。

これで、PHP まわりのローカル環境の開発がスッキリしました。あわせて、msgpack や redis などもあるので、インストールしてさくっと組み込むことができました。

そして、ここまでのインストールもオプション付きでインストールするのが面倒、いつもローカルで使っている PHP の設定が include_path の設定がないなどがあったので、オリジナルの my-php56 を書いてみました。次のコマンドを使うと、さくっと今まで設定したものがインストールして、かつ php.ini の設定をしてくれるので便利だと思います。


$ brew tap n0ts/myformula
$ brew install my-php56

最後に homebrew 経由で curl や libxml2 が入っていると、apachectl -t でエラーになることがありますが、これは envvars だけの問題で動作はするので、気になる人は次のように直しておくとよいでしょう。


--- /usr/sbin/envvars-std 2014-01-16 10:08:32.000000000 +0900
+++ /usr/sbin/envvars 2014-11-13 07:35:17.000000000 +0900
@@ -20,6 +20,8 @@
#
if test "x$DYLD_LIBRARY_PATH" != "x" ; then
DYLD_LIBRARY_PATH="/usr/lib:$DYLD_LIBRARY_PATH"
+elif test "x$HOMEBREW_ROOT" != "x" ; then
+ DYLD_LIBRARY_PATH="$HOMEBREW_ROOT/lib:/usr/lib"
else
DYLD_LIBRARY_PATH="/usr/lib"
fi

日々使っている開発環境も、細切れ時間を見つけて、ちゃんとメンテナンスしていくのも重要なことですね

PHP 5.4 + MySQL 5.5 の RPM を作成する方法

CentOS 5.8 x86_64 の環境で、大人の事情で PHP 5.4.4 + MySQL 5.5.24 の RPM を作成してみました。

まず、MySQL 5.5 の公式 RPM をさくっとインストールします。インストール後は、こんな感じになるはずです。

$ rpm -qa | grep MySQL
MySQL-client-5.5.24-1.rhel5
MySQL-server-5.5.24-1.rhel5
MySQL-devel-5.5.24-1.rhel5

次に PHP 5.4.4 の方ですが、ここにちゃんとメンテナンスされている SPEC ファイルやパッチファイルがありますので、これを使います。
php54 : Code : IUS Community Project

$ bzr branch lp:~ius-coredev/ius/php5

さっそく、このファイルを使って PHP 5.4 系の RPM を作成しますが、php54-mysql パッケージの名前を MySQL 5.5 系でビルドしたことが分かるように php54-mysql55 としておくと便利だと思います。

SPEC ファイルの差分は、次のようになります。

16c16
< %{!?runselftest: %{expand: %%global runselftest 1}} --- > %{!?runselftest: %{expand: %%global runselftest 0}}
20c20
< %global mysql_config %{_libdir}/mysql/mysql_config --- > %global mysql_config %{_bindir}/mysql_config
341c341
< %package mysql --- > %package mysql55
356c356
< BuildRequires: mysql-devel >= 4.1.0
---
> BuildRequires: MySQL-devel >= 5.5.50
359c359
< %description mysql --- > %description mysql55
1406c1406
< %files mysql -f files.mysql --- > %files mysql55 -f files.mysql

あとは、ビルドするだけですが MySQL のライブラリが見つからないというエラーが発生するため、次のコマンドを実行してから RPM をビルドしましょう。

$ export LDFLAGS=-L/usr/lib64/mysql
$ rpmbuild -ba ~/rpmbuild/SPECS/php54.spec

ビルドが終わると、次のような RPM ができあがります。

$ ls ~/rpmbuild/RPMS/x86_64/php54*
php54-5.4.4-1.ius.el5.x86_64.rpm
php54-mcrypt-5.4.4-1.ius.el5.x86_64.rpm
php54-bcmath-5.4.4-1.ius.el5.x86_64.rpm
php54-mssql-5.4.4-1.ius.el5.x86_64.rpm
php54-cli-5.4.4-1.ius.el5.x86_64.rpm
php54-mysql55-5.4.4-1.ius.el5.x86_64.rpm
php54-common-5.4.4-1.ius.el5.x86_64.rpm
php54-mysqlnd-5.4.4-1.ius.el5.x86_64.rpm
php54-dba-5.4.4-1.ius.el5.x86_64.rpm
php54-odbc-5.4.4-1.ius.el5.x86_64.rpm
php54-devel-5.4.4-1.ius.el5.x86_64.rpm
php54-pdo-5.4.4-1.ius.el5.x86_64.rpm
php54-embedded-5.4.4-1.ius.el5.x86_64.rpm
php54-pgsql-5.4.4-1.ius.el5.x86_64.rpm
php54-enchant-5.4.4-1.ius.el5.x86_64.rpm
php54-process-5.4.4-1.ius.el5.x86_64.rpm
php54-fpm-5.4.4-1.ius.el5.x86_64.rpm
php54-pspell-5.4.4-1.ius.el5.x86_64.rpm
php54-gd-5.4.4-1.ius.el5.x86_64.rpm
php54-recode-5.4.4-1.ius.el5.x86_64.rpm
php54-imap-5.4.4-1.ius.el5.x86_64.rpm
php54-snmp-5.4.4-1.ius.el5.x86_64.rpm
php54-interbase-5.4.4-1.ius.el5.x86_64.rpm
php54-soap-5.4.4-1.ius.el5.x86_64.rpm
php54-intl-5.4.4-1.ius.el5.x86_64.rpm
php54-tidy-5.4.4-1.ius.el5.x86_64.rpm
php54-ldap-5.4.4-1.ius.el5.x86_64.rpm
php54-xml-5.4.4-1.ius.el5.x86_64.rpm
php54-litespeed-5.4.4-1.ius.el5.x86_64.rpm
php54-xmlrpc-5.4.4-1.ius.el5.x86_64.rpm
php54-mbstring-5.4.4-1.ius.el5.x86_64.rpm

あと、PEAR ですが、別途 RPM を作成しないといけません。
php54-pear の SPEC ファイルは、ここにありますので、これを使ってさくっとビルドしちゃいます。

$ git clone https://github.com/iuscommunity/php54-pear.git
$ cd php54-pear
$ rpmbuild -ba SPECS/php54-pear.spec

そうすると、$HOME/rpmbuild/RPMS/noarch/php54-pear-1.9.4-1.ius.el5.noarch.rpm が作成されます。

PHP 5.4 on Lion

OSX Lion 上で PHP 5.4 をインストールしてみました。システム /usr/bin/php は PHP 5.3.8 with Suhosin-Patch (cli) (built: Nov 15 2011 15:33:15) です。

Hoembrew を基本的に使っているので、Homebrew 経由でインストールするのが一番簡単です。なお、公式の Formula ないので注意して下さい。


$ brew install https://github.com/josegonzalez/homebrew-php/raw/master/Formula/php.rb --devel --with-mysql

–devel を書略すると 5.3.10 がインストールされます。

あとは、$HOMEBREW_HOME/Cellar/php/5.4.0/libexec/apache2/libphp5.so がインストールされるので、既存の libphp5.so の設定はコメントにして組み込んであげるだけで使うことができます。

次のような Apache の設定にしてあげると、5.3 系と切り替えることができるので便利ですね。

#
# PHP 5.3.8
#
#LoadModule php5_module libexec/apache2/libphp5.so

#
# PHP 5.4.0
#
LoadModule php5_module $HOMEBREW_PATH/Cellar/php/5.4.0/libexec/apache2/libphp5.so

#
# PHP5 handler
#
Include /private/etc/apache2/other/php5.conf

ちなみに –with-fpm をつけると PHP-FPM をビルドすることができますが、そのかわりに Apache モジュールはビルドされないので注意して下さい。