IT女子のお気に入りフォルダ

管理人の備忘録と実践を兼ねた(出来るだけ)役に立つ情報を配信するブログです。

エックスサーバーでFuelPHPのタスクをoilコマンドで実行する方法

FuelPHPでバッチ実行用のコマンドを実装するにはタスクを利用します。そして、タスクの実行は、oilコマンドにクラス名を指定します。
例えば、サンプルのタスク(fuel/app/tasks/robots.php)を実行する場合は以下のようなコマンドを実行することになります。

$ oil refine robots

これを、エックスサーバーで実行したい。
というわけで、とりあえずエックスサーバーにSSH接続します。

参考: [Mac]エックスサーバーにSSH接続する方法

まずは、phpコマンドを実行してみます。phpコマンドのパスは、エックスサーバーのコマンドパス一覧で確認したところ/usr/bin/php5.6と記載がありました。(※使用しているPHPのバージョンはサーバーパネルのサーバー情報で確認できます。)

というわけで、以下を実行してみましたがエラーになってしまいました。
/home/hogeはホームディレクトリです。サーバーパネルのサーバー情報で確認できます。
/example.com/work/fuelphpはFuelPHPを設置しているディレクトリまでのパスです。

$ /usr/bin/php5.6 /home/hoge/example.com/work/fuelphp/oil refine robots

「oilコマンドはCGI版ではなく、CLI版で実行してください」というようなメッセージが出ます。
エックスサーバーのCLI版のコマンドを調べるため、以下を実行してみたところ/opt/php-5.6.30/bin/phpに設置されていることがわかりました。

$ whereis php

改めて、以下を実行。

$ /opt/php-5.6.30/bin/php /home/hoge/example.com/work/fuelphp/oil refine robots

これで、自作のタスクも実行できると思ったのに、またまたエラーになってしまいました。
自作のタスクではDBへの書き込み処理があるのですが、どうもDB接続ができていないようす。
よーく見てみると、開発環境(DEVELOPMENT)に接続しようとしてしまっていることがわかりました。

.htaccessで環境変数を指定していましたが、これだとHTTPアクセスでないと環境変数が設定されません。
そのため、環境変数が未設定と判断され、fuel/app/bootstrap.phpに記述されている以下に従って開発環境(DEVELOPMENT)扱いになってしまったようです。

Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::DEVELOPMENT);

そんなわけで、環境変数を設定しつつ、タスクを実行することに。

$ env FUEL_ENV=production /opt/php-5.6.30/bin/php /home/hoge/example.com/work/fuelphp/oil refine robots

これで無事、oilを実行することができました。