Cronが利用できない環境で自動実行を実現する方法2



【格安パソコンなら!ソーテックオンラインショップ!】

(最終更新日:2006年4月25日)

1.基本的な考え方

シェルスクリプトをcronを使って実行させることが不可能といっても、それはサーバの機能であるcronを使って実行できないというだけであって、そのシェルスクリプト自体はいつでも実行可能なわけです。ただ、「自動」でというところで、サーバの機能を使えないということです。

サーバがやってくれないのであれば、他の手段で実行することができれば問題解決となります。下準備として、そのシェルスクリプトをPHPのSystem関数から実行させることができるPHPプログラムを準備します。(System関数の使用は、セーフモードの環境下では制限されますので、そのような場合はこの方法は無理かもしれません。System関数の利用法はPHPのマニュアルをご参照ください。)

そのPHPプログラム(URL。例:http://www.example.com/php/db_backup.php)に自動でアクセスする方法を考えればいいことになります。前回は、2.Windowsのタスクスケジューラ機能を使用しての方法でしたが、今回の方法は、パソコンを起動させておく必要さえありません。cron処理もどきを実現するために必要な、特定URLへのアクセスを一般サイト訪問者に代行させます。


3.一般サイト訪問者のアクセスがトリガーになるようにする

最も極端に言えば、あるページのアクセスが1日に1以上必ずあるならば、そのページ内に、 img src="http://www.example.com/php/db_backup.php" width=1 height や<iframe src="http://www.example.com/php/db_backup.php" width=1 height=1 style="visibility:hidden;"></iframe>のようなHTMLタグを埋め込んでおき、HTML本体へのアクセスがあれば、必ず、http://www.example.com/php/db_backup.phpへのアクセスがあるようにしておけばいいのです。

ただし、これでは、1日1回の更新でいいのであれば、無駄なアクセスが生じすぎます。PHPプログラム(db_backup.php)内にて、既に今日の更新が終了済みかどうかをチェックするにしても、無駄なアクセスが生じるのは極力避けたいところです。JavaScriptを利用し、PHPプログラムへのアクセス数が最適化されるようにします。

ここでは、1日に200のアクセス(午前2時から6時のアクセスは平均10。0の日は一応存在しない。)があるページを想定します。

サンプル1
のようにします。これで、多ければ1日に20ほどのアクセスがある日もあるかもしれませんし、少ない時は5ぐらいの時もあるかもしれませんが、とにかく1日1回の基準はとにかくクリアできます。db_backup.phpが実行され、その結果、PHPプログラムからシェルスクリプトが実行されます。

1日1回で良いのであれば、何回もシェルスクリプトが実行されるとまずいですから、PHPの方でチェックするようにします。例えば、シェルスクリプト成功時に、データベースにフラグを立てたり、最終更新日を更新したりするなどの手法です。

サンプル2
このようにして、自分は何もしなくても、また自分のパソコンは何もしなくても、

処理の流れ
1.一般サイト訪問者が特定URLへのリンク(imgタグやiframeタグ)を含むページ(HTMLファイル、PHPファイル、ASPファイルなど。)にアクセスする。→ 2. JavaScriptの判別により、一定割合で、実際にその特定URLへのアクセスが生じる。→ 3.その特定URLでは、PHPプログラムが実行される。(1日1回の頻度で実行すべきタスクであるならば、)今日既に処理されているものでないか(過剰アクセスできないか)、PHPでチェックした上で、はじめてのアクセスであるなばら、PHPプログラム内からシェルスクリプトを実行する。


この処理では、HTMLソースを見れば、データベースのバックアップに関わるURLなどが丸見えになり、セキュリティ的に問題があることもあるかもしれません。その場合は、該当JavaScriptを外部ファイル化(JSファイル化)したり、HTMLソースを暗号化する(弊社で開発したSHTMLというソフトでも可能です。)などが必要かもしれません。

あるいは、このhttp://www.example.com/php/db_backup.phpへのアクセスを生じさせるimgタグやiframeタグの出力自体を乱数で制御できる場合(つまり、HTMLページのような静的なページではなく、PHPファイルなどの場合)、わざわざJavaScriptを使う必要も無く、また、このhttp://www.example.com/php/db_backup.phpというURLは全てのアクセス者のソースに表示されるのではなく、ごく一部のアクセスの場合のみソースに現れるようにすることもできます。これなら、問題がかなり軽減されるはずです。

前回の、2.Windowsのタスクスケジューラ機能を使用しての方法と比較して一長一短があるのをお分かりいただけたかと思います。もちろん、こんなややこしいことをしなくても、素直にcronが利用できるレンタルサーバであれば一番問題ないのですが・・・。cronが利用可能なレンタルサーバのリンク集はこちら

次のページでは、3.フリーソフトを活用する方法をご紹介します。



Bフレッツ3ヶ月無料! JRのプロバイダ【サイバーステーション】



← 失敗しないレンタルサーバの選び方に戻る