レンタルサーバーでCronが使用できない場合は?Google App ScriptとPHPを連携してみる

PHP
この記事は約5分で読めます。

この記事は、9年前に書かれました。

はじめに

ある案件で、毎日定時にデータ更新を実行したかったのですが、クライアントが契約しているサーバーでcronが使えなくて困ったことがありました。
その時の対処方法の備忘録です。

そもそもcronとは

cronとは、LINUX系サーバーにて定期的に処理を実行してくれる機能です。
例えば、夜中の午前0時に自動で集計プログラムを走らせるとか、早朝5時に自動バックアッププログラムを走らせるなど、いちいち人間がその時間に実行しなくてもよい便利な機能です。

cronが使えない!

ある案件で、PHPでクーポン発行管理のシステムを作成したのですが、クーポンには有効期限があります。毎日午前0時頃に有効期限が切れたクーポンをチェックして削除するプログラムを走らせようとしたのですが、クライアントが契約していたサーバーでcronが使えなくて困りました。
そこでいろいろ調べてみたところ、GoogleAppScriptと連携して定期実行できそうということで試してみることにしました。

サーバー側PHP更新プログラムの作成

まず、自分のサーバー側に更新用のPHPプログラムを作成します。
以下更新プログラムの一部抜粋になります。どのような更新を実行するかによりロジックは様々ですので、一例として参考にしてください。また、内部ではPDOを使用していますが、独自のクラスを通してSQL文を組み立てていますので、このままコピペしても使用できませんのでご注意ください。
このプログラムにアクセスした時点で無条件に更新が走るようにしています。複数回アクセスしてしまった場合でも、現在日時と有効期限を比較して対象となるクーポンのみを削除する仕様なので問題は発生しません。

/*以下は一例です*/

$sql = new Sql(); //DB接続インスタンス

try{
	$sql->myBeginTransaction();
}catch(Exception $e){
	if(DEBUG_MODE == 'on'){
		echo "例外キャッチ:", $e->getMessage(), "\n";
	}else{
		$_SESSION['form']['error'] = USER_ERROR_REGIST1;
		return FALSE;
	}
}

//更新
$rs = $sql->update(array(
		'table'		=> 'coupon',
		'data'		=> array(
				'limit_date'	=> date("Y-m-d", strtotime("+30 day")),
				'update_date'	=> date("Y-m-d H:i:s"),
		),
		'where'		=> ' limit_date = CURRENT_DATE() AND renew = ? AND flg = ? ',
		'wheredata'	=> array(1, 0),
		'limit1'	=> 'off'
));


if($rs == FALSE){
	$sql->myRollBack();//rollback
	$_SESSION['form']['error'] = USER_ERROR_REGIST1.__LINE__;
	if (DEBUG_MODE == 'on'){
		$_SESSION['form']['error'] .= $sql->error.__FILE__.'|'.__LINE__;
	}
	return FALSE;
}

$this->renew_count = $sql->rowcount;

$sql->myCommit();

Google App Script

Apps Script – Google Apps Script

Google App Scriptは基本的に無料で使用できます。(2015年時点)
当然ながらGoogleアカウントが必要なので事前に登録を済ませてください。

早速スクリプトを作成します。

function myFunction() {
  response = UrlFetchApp.fetch("http://ドメイン名/update.php"); //実行したいプログラムのURL
  MailApp.sendEmail(
    "送信したいメールアドレスをセット",// 送信先メール
    "GoogleAppScript定期実行の結果",// メール件名
    "",
    {
            htmlBody: response.getContentText()
});

}

UrlFetchApp.fetchには、自身のサーバー側で作成したPHPプログラムへのURLをセットします。PHPが実行されると、更新件数をプレーンテキストでリターンで返す単純な仕様です。ここはJSONなどでも構わないと思います。
実行された時には、受け取った更新件数をメールで送信するようにしました。
以下、受信メールの本文となります。

0 件更新 2015-06-20 23:31:25(GoogleAppScriptより自動送信)

定期実行の設定

作成したGoogle App Scriptを定期的に実行する設定を行います。
スクリプトエディタにてリソース > 現在のプロジェクトのトリガーを選択してから、定義したfunctionを時間主導型 > 日付けベースのタイマーで「午後11時~午前0時」の時間を指定しました。
1時間のおおざっぱな範囲になりますが、大体毎日23:30頃にメールが飛んできます。
これで定期的に更新が実行されるようになりました。

最後に

今回はサーバーでcronが使用できない場合の応急処置としてGoole App Scriptと連携させて定期実行プログラムを走らせる方法を紹介しました。
サーバー側のプログラムはPHPでなくても、RubyやPerlでも構いません。
GoogleAppScriptではなくても、cronが使用できる他のサーバーからフェッチで処理するということでも実現可能かと思います。