concrete5 の自動実行ジョブのサーバー側の設定方法 (レンタルサーバー別解説付き！)


concrete5 は、sitemap.xml や検索ブロックやページリストブロックの絞込で使用される索引インデックスを自動実行ジョブで生成しています。

反対に言うと、sitemap.xml や検索は、自動実行ジョブを実行しないと生成されません。つまり、Google の Search Console や検索ブロックを使えないです。

concrete5 は、ユーザーがサイトにアクセスした時にジョブを実行する設定もできますが、ユーザーがアクセスすると同時に実行する方法は、地雷を踏んでしまったユーザーが著しくアクセス速度が遅くなってしまうことになるのでよろしくありません。

ということで、サーバーには、CRON というプログラムが実装され、設定が可能です。

おまけで、さくらインターネットスタンダードプランと、Zenlogic 、CPI シェアードプランのサンプルを最後に添付しています。

## concrete5 の自動実行ジョブの設定方法

自動実行ジョブは concrete5 の [管理画面] - [システムと設定] - [最適化] - [自動実行ジョブ] の画面から設定します。

## ジョブセットの設定

[ジョブセット] タブをクリックし、[デフォルト] をクリック。走らせたいジョブを選択し保存します。

必要のないジョブは選択しないほうが良いでしょう。

ここで最低限設定すべきジョブは

- 検索エンジンインデックス (更新)
- sitemap.xml ファイルを生成する

の2つです。他のジョブも必要に応じて選択し、[ジョブを更新]ボタンを押してください。

## 自動実行ジョブ実行用 URL の取得

(* コマンドラインツールを使用する場合は、URL の取得は不要です)

そうして、デフォルト実行ジョブの選択が終わったら、「自動化の方法」のセクションで「Cron を使用」という項目が選択。URL が表示されていなければ「スケジュール設定を更新」ボタンを押して保存します。

そこに現れている URL を保存してください。

なお、この URL は、悪意のある他人に知られてしまうと、DDoS などサーバーに負荷を与える攻撃をされやすくなりますので、必ず秘密にしてください。

## コマンドラインツールを使う場合

concrete5.7.5 よりコマンドラインツールが導入されました。

簡単に SSH などから concrete5 の操作を行うことができます。

CRON を実行するときは絶対パスを指定しないといけませんので、concrete5 がインストールされた先の絶対パスを取得しておいてください。

例えば、concrete5 が /var/www/html ディレクトリ配下に設置されて、デフォルトのジョブセットを実行したい場合は下記のようになります。

```command.bash
/var/www/html/concrete/bin/concrete5 c5:job --set Default
```

サーバーの管理画面によって設定画面は異なりますが、root 権限のあるサーバーで crontab のテキストファイルで設定しているとこのような設定になるかと思います。

```type:crontab.conf
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
  0  *  *  *  * katz /var/www/html/concrete/bin/concrete5 c5:job --set Default
```

(katz というユーザーで1時間おきにジョブを実行するという設定です。)

内部的には bash を介して php コマンドを実行しています。


## wget コマンドを使う場合

sh や bash コマンドを使える場合は、下記のように設定することをおすすめします。

```command.bash
wget -t 1 -q --spider http://example.com/index.php/ccm/system/jobs?auth=XXXXXXXXXXX
```

- wget というプログラムは本来はその先のファイルなどを取得するプログラムです
- `-t 1` は1回しか試行しないオプションです。デフォルトではエラーが出ると20回繰り返します。 
- `-q` でメッセージを出さないようにします
- `--spider` は、成功したら何も返さず、失敗したらそれをメッセージとして伝えるオプションです。
- URL は上記で取得した URL を入力します。

サーバーの管理画面によって設定画面は異なりますが、root 権限のあるサーバーで crontab のテキストファイルで設定しているとこのような設定になるかと思います。

```type:crontab.conf
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
  0  *  *  *  * katz wget -t 1 -q --spider http://example.com/index.php/ccm/system/jobs?auth=XXXXXXXXXXX
```

(katz というユーザーで1時間おきにジョブを実行するという設定です。)

## PHP で実行する場合

セキュリティの関係で、サーバーからはシェルを実行したくないという人には、PHP ファイルを作成して実行することも可能です。

### 実行用 PHP ファイルを作成

下記のような PHP ファイルをテキストエディタで作成します。

```cron.php
#!/usr/bin/php
<?php
readfile('http://example.com/index.php/ccm/system/jobs?auth=XXXXXXXXXXXXXX');
?>
```

readfile の関数の中に、自分のサイトの自動実行ジョブ実行 URL を入れてください。

### PHPファイルを実行

下記のようにコマンドを打って実行させます。

```command.bash
php /user/katz/cron.php > /dev/null
```

ファイルの保存場所は、サーバー上の絶対パスを入力する必要があるかもしれません。「`pwd`」コマンドや、FTP ソフト、もしくはサーバー管理者に絶対パスを確認してみてください。

また、ファイルのパーミッションを「755」など実行可能な状態にすることを忘れずに。

crontab の設定方法の例は下記のようになります。

``` type:crontab.conf
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
  0  *  *  *  * katz php /user/katz/cron.php > /dev/null
```

## レンタルサーバー別設定例

お断り:2016/1/12 時点での情報です。

### さくらインターネット

さくらインターネット、スタンダードプランの場合は、wget と php ファイルを作って実行することが両方可能でしたが、wget と php の実行ファイルも絶対パスで指定する必要があります。

[サーバーコントロールパネル] - [アプリケーションの設定] - [CRON の設定]から設定します。

時間の設定は、さくらのコントロールパネルから行います。

#### さくらでコマンドラインツールで自動実行ジョブ

「実行コマンド」のところに下記の例のように入力してください。

```command.bash
/home/XXXXX/www/concrete/bin/concrete5 c5:job --set Default
```

上記の XXXXX には、自分のさくらのアカウント名がはいります。

また、www ディレクトリ直下ではなく、よりサブディレクトリ内に設置している場合は、そのディレクトリを追加してください。


#### さくらで wget コマンドで自動実行ジョブ


wget コマンドを、サーバー上の絶対パスである `/usr/local/bin/wget`としてコントロールパネルから入力する必要があります。

「実行コマンド」のところに下記の例のように入力してください。

```command.bash
/usr/local/bin/wget -t 1 -q --spider http://example.com/index.php/ccm/system/jobs?auth=XXXXXXXXXXXXXX
```

#### さくらで PHP 実行ファイルを使う場合

上記のような PHP 実行ファイルを作成し、FTP でアップロードします。

ファイルのアップロード先は、ブラウザからみることができる「www」フォルダの中ではなく、その上のディレクトリぐらいで置いておくのが良いかもしれません。

```command.bash
/usr/local/bin/php /home/XXXXX/cron.php > /dev/null
```

上記の XXXXX には、自分のさくらのアカウント名がはいります。

例：XXXXX.sakura.ne.jp の「XXXXXX」という部分です。サーバーコントロールパネル、ログイン後、左のメニューの一番上に記載しています。


### Zenlogic の設定方法

ファーストサーバーの Zenlogic の場合、コマンドラインを実行するのではなく、bash でも PHP でもファイルを作成しないといけません。

#### bash スクリプトファイルとコマンドラインツールを使う場合

```cron.bash
#!/bin/bash
/virtual/htdocs/concrete/bin/concrete5 c5:job --set Default

```

htdocsディレクトリ直下ではなく、よりサブディレクトリ内に設置している場合は、そのディレクトリを追加してください。


#### bash スクリプトファイルと wget を使う場合

bash ファイルを任意の名前で作成します。

```cron.bash
#!/bin/bash
wget -t 1 -q --spider http://example.com/index.php/ccm/system/jobs?auth=XXXXXXXXXXXXXX
```

cron 設定方法の手順で、スクリプトを実行します。

#### PHP ファイルを作成する場合。

前述の PHP ファイルのサンプルファイルを使って PHP 実行ファイルを作成してください。

#### cron 設定方法

bash もしくは、PHP ファイルをアップロードします。cgi-bin の中にアップロードされることを推奨します。

アップロード後、FTP ソフトを使って、パーミッションを 755 に設定してください。(自分が読み書き実行とすべてが可能、グループとその他は読みと実行が可能という設定です。)

管理画面にログインし、左のメニューから [WEB] - [cron 設定]をクリック

[設定登録] からファイルを選び、実行時間を設定して保存します。

### CPI 設定方法

KDDI ウェブコミュニケーションズの CPI 共有ホスティングサービスで利用できる自動実行ジョブです。wget コマンドは、「.sh」という拡張子のファイルを作成することで可能。PHPファイルも使えます。 

#### 管理画面の設定方法

コントロールパネルから、テスト環境、公開サーバーどちらかのメニューを選択すると、CRON 設定ができる画面が現れます。

ここで、下記のいずれかの方法でアップロードしたファイルが選択肢として現れますので、それを選択し、スケジュール時間を設定します。

#### sh ファイル

sh ファイルは、bash とほぼ同じものです。ファイルの拡張子と、1行目の宣言文が違うだけとなります。

URL がわかればブラウザ上からも見えてしまうため、必ずファイル名を長くしたりして、推測できないようなファイル名にして「/html」以下にアップロードしてください。

```cron.sh
#!/bin/sh
/usr/local/bin/wget -t 1 -q --spider http://example.com/index.php/ccm/system/jobs?auth=XXXXXXXXXXXXXX
```

#### PHP ファイル

URL がわかればブラウザ上からも見えてしまうため、必ずファイル名を長くしたりして、推測できないようなファイル名にして「/html」以下にアップロードしてください。

```cron.php
#!/usr/bin/php
<?php
readfile('http://example.com/index.php/ccm/system/jobs?auth=XXXXXXXXXXXXXX');
?>
```

PHP のバージョンを指定する必要があります。シンプルなスクリプトなので、PHP5 であればなんでも構いません。



以上