Binbo-Special - WEB制作や運営に関する楽屋話 -

サイト制作・運営やドラムの事やゲーム開発のこととか

技術資料

[FuelPHP]コマンドからphpを実行出来ないサーバでoilを使ってタスクを実行する

FuelPHPは、tasksに処理を書いて、

(php) oil r [タスククラス]

等と指定すればタスク処理が簡単に行えてとてもハッピーなのですが、

残念ながら、コマンドからPHPを許可していないサーバもあるかと思います。

まあ、はっきり言ってしまうと、CPIのシェアードプランなんかがそうだったりするのですが・・・・・

(.shは実行出来るがそこからphpが実行出来ない。phpも指定出来るが引数は指定出来ない。)

でも、tasksしたい!oilしたい!oilまみれになりたい!

という事で、そういったサーバで oir r hoge する方法その1です。その2は誰か是非教えてください。

我ながらかなり強引で格好悪いです。

 

実験その1:argv、argc の値をいじってoilをrequireする

結局の所、oilに引数渡すだけだよね?

という事で、以下のようなコードを書いてみる。

有効期限切れチェックということで、expirationなるtasksがあるという例。

chdir('/oil/no/dir/wo/shitei');
$_SERVER['argv'][0] = 'oil';
$_SERVER['argv'][1] = 'r';
$_SERVER['argv'][2] = 'expiration';
$_SERVER['argc'] = count($_SERVER['argv']);

require 'oil';

このコードですが、例えば実験でブラウザ経由で実行してみると・・

Exception [ Error ]: Cli class cannot be used outside of the command line.

とか言われてしまいます。

どこかで判定しているんだなぁ、と思ってソースを追ったら、

fuel/core/classes/fuel.php に

// Is Fuel running on the command line?
        static::$is_cli = (bool) defined('STDIN');

なんていう行がありました!

という訳で・・・

実験その2:argv、argc の値をいじって、さらに STDIN をdefineしてからoilをrequireする

chdir('/oil/no/dir/wo/shitei');
$_SERVER['argv'][0] = 'oil';
$_SERVER['argv'][1] = 'r';
$_SERVER['argv'][2] = 'expiration';
$_SERVER['argc'] = count($_SERVER['argv']);
if (!defined('STDIN'))
{
    define('STDIN', 1);
}
require 'oil';

やりました。

これでローカルのテスト環境はばっちりです。

ばっちりと言って良いのかどうか微妙な対応ではありますが。

そこで、問題のサーバにアップしてブラウザから動作確認をしてみる。

すると今度は、

The use of oil is not supported when running php-cgi. Oil needs php-cli to function!

もういやこんな生活。

またもやソースを追ったら oil自身にこんな行が(しかも先頭に)

/**
 * Refuse to run oil when called from php-cgi !
 */
if (substr(php_sapi_name(), 0, 3) == 'cgi')
{
    die("The use of oil is not supported when running php-cgi. Oil needs php-cli to function!\n\n");
}

実験その3:argv、argc の値をいじって、さらに STDIN をdefineして、さらに oil のcgiチェック行をコメントアウトしてから、oilをrequireする

ごめん、本当はこんなことしたくないんだけど、涙を飲んでしょっぱい!しょっぱい!とか叫びながらコメントアウト。

ちなみに涙がしょっぱい理由はこちら > なみだの正体 | ドライアイについて – ロート製薬株式会社

これでブラウザ越しに動作確認OK!やったね!!

あとは、CPIの場合、スクリプト定期実行ツールから該当のPHPファイルを指定して(ブラウザ経由ではアクセス出来ないようにして)完了〜

.

と行きたい所でしたが、DBに書き込まれているはずの値が書き込まれない・・・

途中でどこかで落ちている模様。

今回の私のケースではDBに接続する箇所でこけていることが判明。何故だ・・・・・。

そして遂に原因判明。今回のラスボスはしょうもないものでした。

実験その4:argv、argc の値をいじって、さらに STDIN をdefineして、さらに FUEL_ENV を production にして、さらに oil のcgiチェック行をコメントアウトしてから、oilをrequireする

犯人は FUEL_ENV でした。

FUEL_ENVの設定を.htaccessで

SetEnv FUEL_ENV production

していたので、今回のケースだとdevelopmentのままだったというオチでした。何故すぐ気付かない>俺

chdir('/oil/no/dir/wo/shitei');
$_SERVER['argv'][0] = 'oil';
$_SERVER['argv'][1] = 'r';
$_SERVER['argv'][2] = 'expiration';
$_SERVER['argc'] = count($_SERVER['argv']);
if (!defined('STDIN'))
{
    define('STDIN', 1);
}
$_SERVER['FUEL_ENV'] = 'production';
require 'oil';

で、一応解決です。

そんなわけで、気持ち良い方法その2の方があれば、どなたかフォローお願いします・・・・・。

投稿日:

技術資料
,

関連記事

デモサイト(テストサイト・テスト環境)であることをわかりやすくしたい

デモサイト(テストサイト・テスト環境)であることをわかりやすくしたい

本番環境のサイトと、テスト環境・デモ環境・ステージング環境・開発環境等々、
サイト制作・公開・運用にあたって、様々な環境が存在します。

そういえばBomberBomber2をAndroidアプリにしました。

そういえばBomberBomber2をAndroidアプリにしました。

いやー、最近暑くなってきましたねー。
こんな暑いとBomberBomber2やりたくなりますよねー。

ねこたま♪ Androidアプリを公開しました。

ねこたま♪ Androidアプリを公開しました。

ちょっと風変わりなマッチ3パズルゲーム
ねこたま♪
をなんとか公開しました。

「Clicker Tower RPG」 Androidアプリを公開しました。

「Clicker Tower RPG」 Androidアプリを公開しました。

敵をタップで倒しながら塔を登っていく、シンプルなルールのロールプレイングゲーム
Clicker Tower RPG
をなんとか公開しました。

そういえばBomberBomber2をiOSアプリにしました。

そういえばBomberBomber2をiOSアプリにしました。

いやー、最近暑くなってきましたねー。
こんな暑いとBomberBomber2のiOS版をリリースしたくなりますよねー。