Xserver で 1 秒毎に PHP ファイルを定期実行する

はじめに

実務にて、Xserver(エックスサーバー)の cron で 1 秒毎に API を実行する PHP ファイルを定期実行してほしいという小仕事の依頼があり、それを解決した情報になります。Xserver の cron 設定は秒指定ができないので、1 秒毎に PHP ファイルを繰り返し実行するシェルスクリプトをバックグラウンド実行させて対応しました。

ソースコード

#!/bin/bash
while true
do
  wget -O - -q -t 1 "ここに定期実行する PHP ファイルの URL を記述する。"
  sleep 1
done

検証環境

解説

下記のシェルスクリプトをコピペ(コピー&ペースト)して .sh ファイルを作成、サーバーの任意の場所にアップロードします。

#!/bin/bash
while true
do
  wget -O - -q -t 1 "ここに定期実行する PHP ファイルの URL を記述する。"
  sleep 1
done

while true で無限ループ、do の wget で PHP ファイルを実行、sleep 1 で処理を 1 秒遅延します。つまり、特定の PHP ファイルを 1 秒毎に実行し続けるプログラムです。

次は、エックスサーバーに SSH 接続する為にサーバーパネルにある SSH 設定から SSH を「有効」に切り替えます。さらに、SSH 接続用の公開鍵認証用鍵ペアの生成、または、公開鍵の登録を行います。

公開鍵認証用鍵ペアの生成をする場合、ダウンロードした秘密鍵を .ssh フォルダに保存し、秘密鍵のパーミッションをターミナルから chmod コマンドを実行して変更します。また、各コマンドのドキュメントについては man コマンドから確認ができます。

$ chmod 600 ~/.ssh/xxx.key

ssh コマンドを実行してリモートマシンに SSH でログインします。エックスサーバーの接続ポートは 10022 であることに注意します。

$ ssh ユーザー名@ホスト名 -i ~/.ssh/xxx.key  -p 10022

Enter passphrase for key(キーのパスフレーズを入力してください)と聞かれるので、公開鍵認証用鍵ペア生成時のパスフレーズを入力してください。

接続できたら、nohup コマンドと & を実行してシェルスクリプトがログアウトしてもバックグランド実行し続けるようにします。

$ nohup sh /home/xxx/xxx.sh &

ps コマンドを実行してプロセスが存在するか確認しましょう。

$ ps aux | grep xxx.sh

プロセスを停止させたい場合は kill コマンドを実行します。

$ kill プロセスID

以上です。

おわりに

API を実行するプログラムを定期実行する場合は、API のドキュメントをよく読んでリクエスト回数制限にご注意ください。