cronを設定してプログラムを定期的に自動実行させる

動画まとめサイト

今回はパソコン作業の自動化を支える重要な機能をご紹介します。動画まとめサイトに限らず外部データを定期的に取得したいというニーズはあらゆる分野であると思います。金額・気温・人数・数量・回数などの結果を分析し、次に生かすためには過去データの蓄積が欠かせません。僕は一時期会社の指示でガソリン価格を毎日チェックしていた時期がありましたが、時間は掛かりませんが毎日続けるのはすごく面倒でした。

皆さんも値段を調べたり同じブログを何度も訪問したりと、無意識に毎日行っているパソコン操作ってあると思います。このような繰り返し行われる作業は、レンサバが提供している「cron」とPHPプログラムを組み合わせる事で自動化する事ができるんです。

このcron+PHPのコンボを使えるようになると、今まで手動でポチポチ行っていた作業がほったらかしで寝ている間に終わってしまうんです。なんか怪しい情報商材の売り文句みたいになってしまいましたが、僕が始めてcronを使った時、革命的に便利ですごく感動した事を覚えています。

アイデア次第ですごいパフォーマンスを発揮する機能なので、せっかくレンサバを借りるならブログを書くだけでなくcronを使い倒しましょう。例えば「商品の価格を監視して安くなったらスマホにメール」なんて仕組みも作れるようになりますので、ぜひ覚えて行って下さい。

レンタルサーバー毎のcronの扱い一覧

cronは完全にレンタルサーバーに依存している機能ですので、会社によって扱い方が違います。cronを設定できる個数を制限していたり、そもそもcronが使用できないレンサバもあります。今更かもしれませんが、レンサバを選ぶ際は必ずcronが十分に使えるかチェックする事をオススメします。

無料のレンタルサーバーでは使えない場合がほとんどだと思いますが、最近の有料レンタルサーバーであれば大体cronが使えると思います。ただ、設定できる個数に制限があったりプランによっては有料オプションとなっているサービスもありました。

有名どころのレンタルサーバーでcronが使えるか使えないかを一覧にまとめてみました。〇表示はcronの個数や時間に制限なく使える場合に記載してます。あと月額料金は割引を適用しない一番割高になる金額で比較してます。(2019年1月3日の時点)

サービス名プラン月額料金(税抜)Cron
mixhost全プラン1,380円~22,380円
エックスサーバー全プラン1,200円~4,800円
ロリポップエコノミープラン100円△(1個:5分毎)
ライトプラン300円△(5個:5分毎)
スタンダードプラン600円△(10個:1分毎)
エンタープライズプラン2,300円△(10個:1分毎)
さくらインターネットライト119円×
スタンダート477円△(5個)
プレミアム1,429円△(5個)
ビジネス2,381円△(5個)
ビジネスプロ4,285円△(5個)
マネージドサーバ12,000円△(5個)
スターサーバーエコノミー126円×
ライト324円△(5個)
スタンダード648円△(10個)
プレミアム1,944円△(20個)
ビジネス5,184円△(20個)
バリューサーバーまるっと133円△(1個)
エコ400円△(10個)
スタンダード800円△(99個)
ビジネス4000円△(99個)
お名前.com レンタルサーバー全プラン1,300円~2,600円×
KAGOYAS111,000円×
S212,000円
S313,000円
ConoHa WING全プラン1,200円~4,800円
ヘテムル全プラン1,100円~2,200円△(20個)
コアサーバー全プラン381円~3,800円
XREAXREA Free無料×
XREA Plus381円
Z.com全プラン360円~1,798円
エクストリム全プラン220円~400円×
エイブルネット全プラン300円~18,858円×
クイッカエントリー126円△(有料:+201円)
ライト322円△(有料:+201円)
スタンダード630円△(有料:+201円)
プレミアム1,260円
ドメインキング 全プラン500円~1,600円
WADAXレンタルサーバー全プラン1,100円~3,600円
@WAPPYライトプラン417円×
エコノミープラン1,000円
ミドルプラン1,500円
ハッスルサーバー全プラン309円
FC2レンタルサーバーLite全プラン300円△(5個)
FC2レンタルサーバー全プラン1,500円
使えるねっとビギナー207円×
パーソナル480円×
ビジネスプロライト1,480円
ビジネスプロ2,980円

このように各サービスによってcronの扱いはかなり違います。よく言われる安かろう悪かろうにならないように、レンタルサーバーを比較するときは cronの扱いについても検討事項に入れておくといいと思います。

cronの設定方法

cronは各レンサバのコントロールパネルから設定する事ができます。レンサバ毎に見栄えは多少違いますが、いずれも実行するファイルの場所と実行予定時間を設定するのは同じです。今回は僕が愛用しているmixhostの設定に準じて紹介しますが、他のレンサバでも参考になると思います。

cronでは数種類のプログラムを登録する事ができますが、今回はPHPファイルを単体で登録する方法と.sh(シェルスクリプト)を使って複数のPHPファイルを登録する方法をご紹介します。

PHPファイルを単体で設定

実行するPHPファイルを指定するコマンドは「/usr/local/bin/php + 実行ファイルのパス」と書きます。コマンドの頭の「/usr/local/bin/php 」には実行ファイルのパスとの間に半角スペースを忘れずに入れて下さい。後はファイルマネージャーで実行したいファイルのパスを探してくっ付ければコマンド完成です。

実行時間は指定したい時間を普通に数字で入力すれば問題ありませんが、ワイルドカード(*)を設定する事ができます。月に*で毎月、日に*で毎日と最短で繰り返す指定となります。ただし、毎分実行させる様な処理はサーバーに負荷が掛かるので常識の範囲内で設定しましょう。

シェルスクリプトで複数ファイルを設定

シェルスクリプト内に実行したいPHPファイルをまとめる事で、1つのcronで複数のPHPファイルを実行する事ができます。これはcronを設定できる個数が制限されているレンタルサーバーで、多くのPHPファイルを実行する必要がある場合に便利なテクニックです。

シェルスクリプトにPHPファイルをまとめるにはこんな感じで作業します。

まずはファイルマネージャーからシェルスクリプトファイルを新規作成します、拡張子は.shで保存して下さい。

シェルスクリプト内は上記の画像のように実行するPHPファイルを記述します。1行目には「!/bin/bash」とシェルスクリプトのオプションを、2行目からは実行するPHPファイルのパスを「php -f 」と「&」で挟めば完成です。

後は設定したcronがシェルスクリプトを実行して、中身のPHPファイルを次々開いていくという仕組みになってます。ただし複数の処理をまとめるという事は、サーバーに対して一時的に高い負荷を与えるという事でもあります。次で解説するようにサーバーへの負荷を監視する技術も身に付けて、トラブルを起こさないように注意しましょう。

サーバーに与える負荷に注意

非常に便利なcronですが一度実行するファイルを設定すると、管理者が止めない限り永遠に処理し続けます。なのでエラーを吐いているようなプログラムを指定してしまうと、不必要な負荷をサーバーに掛け続ける事になってしまいます。 cronに設定するファイルは必ずデバックを完了させて、問題のないファイルのみを設定するようにしましょう。

メモリに一定以上の負荷をかけたりサーバー側で定めた時間内に処理が終わらなかった場合、強制的に処理を終了させられることがあります。なので、cronを扱う以上は処理時間とメモリ消費の監視は必須です。無用なトラブルを起こさないためにも管理者としてのチェックは怠らないように気を付けなければいけません。

cron指定ファイルの処理時間を把握する

PHPファイルの処理に掛かっている時間を計測するにはmicrotimeという現在の時間を取得する関数が便利です。ソースコードの最初にmicrotimeで今の時間を取得し、コードの終わりでもう一度microtimeで今の時間を取得します。そしてその時間の差を調べる事で、処理の始めと終わりでどれくらい時間が経過したかを求めます。

シンプルな上、数行の追加で処理時間が計測できるようになるので、PHPファイルを新たに作る際はテンプレの様に必ず書くクセを付けて良いと思います。具体的にはこんな感じで書きます。

<?php

$time_count_start = microtime(true);

//ここから処理書く

sleep(3);

//ここまで

$time_count_end = round( microtime(true) - $time_count_start, 4);

echo "{$time_count_end} 秒";
    
?>

分かりやすいですよね、3行目と11行目の時間差を13行目で表示しています。経過した時間はファイル実行時に「〇秒」として表示されますので確認して下さい。

cron指定ファイルのメモリ負荷を把握する

上で紹介した処理時間確認用のPHP関数と同じように、処理が終わるまでに消費したメモリを計測するプログラムもあります。こちらも数行の追加で簡単に実装できるので、処理時間の計測と合わせて覚えておきましょう。

<?php

$baseMemoryUsage = memory_get_usage();

//ここから処理書く

print_r('hello world');

//ここまで

$maxMemoryUsage = round( (memory_get_peak_usage() - $baseMemoryUsage) / (1024 * 1024), 4) ;

echo "{$maxMemoryUsage} MB ";
    
?>

このサンプルプログラムでは「hello world」を表示するのにどれくらいメモリを消費したか確認する事ができます。上記の処理時間の監視と合わせてセットで記述するようにしましょう。

cron実行時の消費リソースをDBに保存し監視

しかしこれだけではcronで自動実行している間に何秒掛かったか、メモリをどれだけ消費したか確認する事はできません。なので消費リソース確認用テーブルを作成し、処理時間と消費メモリを保存する事で見ていない間の負荷を確認する事ができます。

テーブルはこんな感じでMYSQLに設定します。

ワードプレスのDB直下に「01_cron_monitoring」という名前でテーブルを作成します、カラムは5個使います。

テーブル内のカラムは上記の画像の様に設定して下さい。カラム名は任意のモノで構いませんが、後で分かりやすいように「テーブル名+カラム名」で付けるようにしています。idとかtimestampなんかは多くのテーブルに存在するので、PHPでDBを操作する際にどのテーブルのidなのかtimestampなのか分からなくなるんです。なので、多少名前が長くなっても所在が特定できる名称が良いと思います。

はい、これでリソース監視用のテーブルが完成しました。後は実行するPHPファイルに上記で解説した経過時間と消費メモリを計算するコードを追加して、計算結果をSQLのINSERT文で「01_cron_monitoring」テーブルに保存するように追記します。

サンプルコードはこんな感じで書いてみました。

<?php

$baseMemoryUsage = memory_get_usage();
$time_start = microtime(true);
$myPath = __FILE__;

try {
  $db = new PDO('mysql:host=localhost;dbname=DB名;charset=utf8', 'DBのユーザー名', 'DBのパスワード');
} catch(PDOException $e) {
  die('エラーメッセージ:'.$e->getMessage());
}

//ここから処理書く

print_r('hello world');

//ここまで

$maxMemoryUsage = round( (memory_get_peak_usage() - $baseMemoryUsage) / (1024 * 1024), 4) ;
$time_count_end = round( microtime(true) - $time_start, 4);
$timestamp = date('Y/m/d H:i:s');

$stt = $db->prepare("INSERT INTO 01_cron_monitoring ( 01_cron_monitoring_timestamp, 01_cron_monitoring_file, 01_cron_monitoring_time, 01_cron_monitoring_memory ) VALUES ( :01_cron_monitoring_timestamp, :01_cron_monitoring_title, :01_cron_monitoring_time, :01_cron_monitoring_memory )");
$stt->bindValue(':01_cron_monitoring_timestamp',$timestamp );
$stt->bindValue(':01_cron_monitoring_title', $myPath);
$stt->bindValue(':01_cron_monitoring_time', $time_count_end);
$stt->bindValue(':01_cron_monitoring_memory', $maxMemoryUsage);
$stt->execute();
    
?>

今回のサンプルコードの内容は既出のコードを組み合わせたモノなので細かく解説しませんが「hello world」を表示するために掛かった時間と消費したメモリを、「01_cron_monitoring」テーブルに保存しています。成功するとこんな感じでテーブルにレコードが保存されます。

この通り処理を実行した分だけレコードが追加されて行きます。「01_cron_monitoring_time」と「01_cron_monitoring_memory」に異常値が出ていないか確認する事ができます。前回の処理と比較して〇%以上値が増減したらスマホにメールする、なんてプログラムを書くのも便利かもしれませんね。

レンタルサーバーによる実行ファイルの制限

非公開の場合も多いですが、各サービスごとに1つの処理を実行する際のタイムアウトになる制限時間やメモリ負荷の上限が決まっています。これはcronで時間が掛かる処理を実行する場合、PHPファイルを制限時間やメモリを超えないよう複数に分割する必要があるという事です。レンサバ毎に制限が違うので一様には言えませんが、制限内に収まるように工夫しましょう。

この記事を書いている時にmixhostでタイムアウトになる時間を調べようと思ったのですが、120秒経過しても処理は停止されませんでした。これは長く待ってくれている方で、エックスサーバーでは30秒程度で処理が強制終了されるそうです。各レンサバの制限をすべて調べる事は出来ませんので、契約時の料金やスペックの説明に処理の制限についても説明して欲しいですよね。

まとめ&次回予告

ここまでの全6記事でYouTube APIから取得した動画データを、自動でワードプレスの記事に出来るようになりました。これでようやく自動更新型の動画まとめサイトの雛形は一通り出来上がりましたね。

このままでも充分役に立つと思いますが、次回はカテゴリーやタグ・サムネイルまでプログラムで自動付与するようにプログラムに肉付けしようと思いますんで、また次回の記事でお会いしましょう(‘ω’)ノ

投げ銭はこちら(*‘∀‘)
僕はいつも晩酌しながら記事を書いてるんですが、もしこの記事が面白かったら一杯おごって貰えませんか(*ノωノ) お酒パワーがあれば次の記事も頑張って書けます!
炭酸系はちょっと苦手で日本酒とウィスキーが好きです!オススメがあればメッセージで教えて下さい('ω')ノ
nagesen@diy-programming.site → amazonギフト券

youtubeの動画を自動で投稿するwpプラグイン完成!

当サイトで解説しているyoutube動画まとめサイト作成のノウハウを元に、誰でも簡単に動画まとめサイトが作れるwpプラグインを作りました。

主な機能なこんな感じです。

  • 手動更新(cron不要)
  • 完全自動更新(cron必要)
  • 動画重複チェック
  • 1度の処理で50件以上の動画を収集&投稿可能
  • 使用するwpテーマは何でもOK
  • 動画の取得順指定
  • 収集対象動画の期間指定
  • キーワード検索
  • チャンネル指定
  • カテゴリ指定
  • 取得件数指定
  • 予約投稿
  • 本文テンプレ挿入
  • 動画説明挿入

プログラムの自作が難しい方はこのプラグインを使用してする事で、簡単に動画まとめサイトのオーナーになれますよ。良かったら試してみて下さい。

コメント