CPI シェアードプランで cron からCakePHP Shell を無理矢理呼び出すバッドノウハウ

使ってみないとわからない(>_<)

とあるサービスを開発ちぅ…。まもなく完成でリリース間近。「どのサーバがいいです?」いくつかご検討されているサーバの候補を相談されました。

私が開発時に想定していた要求仕様

PHP5.6+ , ある程度のhtaccess ディレクティブ設定許容、メール自動配信用に cron が動いて,  SSHログイン出来るとなおよし… ぐらいだったので、提案された候補のなかから、ザッと仕様表をみた後、上記を満たしている(であろう)CPI のレンタル共用サーバを選択しました。cron….使えるって書いてあるよね( ´▽`)

2016-04-14_08h29_11

下準備、ドメイン設定などを済ませて、さあ、あとはcronセットしてバッチがちゃんと走ればテストリリースOK!! ほとばしる高揚感!!

地獄の始まり

さて、ではcron設定をしましょうかね~、ん?

こんな感じで指定したかった、素直なcronの例2016-04-14_08h43_19

こんな風にphp呼び出して、素直にShellコンソールを指定出来ると思っていましたよ…

CPIレンタルサーバ シェアードプランのスクリプト定期実行ツール(crontabいじらせてあげるとは言っていない)設定用ページ2016-04-14_08h18_31

・・・・まさかの、管理配下のphp / cgi / sh などを総ざらえしてあげるから、その中から一つ選んでね! 的な指定方法だった(^_^;…気を取り直し、それならここに app/Console/cake.php を呼び出せばいいよね…

・・・・・引数設定できない\(^o^)/

orz orz orz orz orz orz orz やーばーいー、やばいよこれはー。

ならば シェルを起動するだけの example.php を作ってそこからexec とかで cakeShellを呼び出して、動かせばいいやん!

・・・・・CGI版PHPだからexecから起動できない\(^o^)/

ちょっと脂汗が出てきたよ!豚骨スープの完成間近!!脂汗を垂れ流しながら、色々試行錯誤。

crontabファイルを発見

SSHでログインするとFreeBSD、ディレクトリウロウロしてると、sys-common というディレクトリに crontab ファイルを発見!こいつを vi でいじれば何とかなるかも知れない!

2016-04-14_08h23_11

中身を見てみよう

2016-04-14_08h23_29

↑は適当にスクリプト選んでcron設定した後、vi crontab で開いた内容です。
なんか見覚えのある形( ´▽`)、編集して無理矢理呼び出すことも出来そうですが…、結論だけを言うと、設定できたとしても、次にWebからcron設定ページを開くと行が無限増殖したり消えたりして不安定きわまりなくなります。まあ、想定外の操作ですので仕方ありませんが、実際の運用でつかうには危険がありすぎるので無理です(というかうまく動かせませんでしたw)。

無理矢理な対策

「無理でした\(^o^)/」と言って逃げ出せればよいのですが、そうも行かず何とか動かさないと、Think!Think!Think!!!!!

原理を考える

本来、cron で呼び出すための ./cake.sh は、起動の最終処理として

exec php -q “$CONSOLE”/cake.php -working “$APP” “$@”
で、php cake.php に引数を与えて呼び出しているに過ぎません。

phpスクリプト単体ならCPIのcronから呼び出せる!
ならば、指定したいバッチシェルの分だけ app/Console/ 内の cake.php を複製して、

例)今回は2つバッチを走らせたかったので2つファイルをコピー。
cp cake.php cpi_general_mail.php
cp cake.php cpi_event_invitaion_mail.php

それらを編集。 ShellDispatcher に渡される部分[$argv] を強制的に書き換えして、引数が渡されたのと同じように振る舞うように
※$argv は、スクリプトにわたった引数を受け取るための変数です。
$argv[0] にはそのスクリプトファイル名、$argv[1],[2]….には引数がずらずらと渡されます。

cake.php をコピーしたcpi_general_mail.php 最終行付近

unset($dispatcher);

return ShellDispatcher::run($argv);

に追記↓します

unset($dispatcher);
//シェル引数を書き換え
$argv = array();
$argv[0] = ‘cpi_general_mail.php’;
$argv[1] = ‘batch_mail_general’;
return ShellDispatcher::run($argv);

としたうえで、このphpスクリプトを走らせると、
app/Console/cake batch_mail_general
を実行したのとほぼ同じ動きをしてくれるハズです。

シェルに複数 function があってそれを個別に呼び出したい場合は$argv[2,3…]が適宜必要

出来上がったphpスクリプトを cron で呼び出す

2016-04-14_08h17_38

 試験動作

とりあえず動いてる…( ´▽`)ので、様子見したいとおもいます。

 

各社レンタルサーバの仕様、嘘は書いていないけどトラップ多いよね( ´▽`)

毎回どこか訳のわからないところでハマります。でも、それを越えたときまた強くなります。次回ブチ当たったときに「これ進○ゼミでやったところだ!」みたいになれますからね。日々是楽し。

コメントを残す

メールアドレスが公開されることはありません。