[PHP]LaravelのTask Scheduler(Cron)でPHPの場所やバージョンを指定して実行する

LaravelにはCronタスク管理機能が有り、一つのCronジョブを「* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1」のように指定しておくとスケジューラーが実行されたタイミングで条件に合うタスクが自動的に実行されます。
laravel 5.2 の場合 app\Console\Kernel.php で管理ができ、 直接 $schedule->exec() でコマンドを実行する他、$schedule->command() を使って作成済みのコマンドを実行することも出来ます。
protected function schedule(Schedule $schedule)
{
    $schedule->command('emails.send')->cron('0 */3 * * *');
}

上記の例では cron() で指定された時間にコマンドが実行されます。表記は「分 時 日 月 曜日」の順で、「*」は「すべて」、「5」は5の時に、「*/5」は毎を表し、分に使うと5分おきにという意味になります。曜日は 0〜7 で日曜日から始まります。「1-3」のようにすると範囲を指定でき、「1,3」のように区切ると複数指定できます。指定した時間にスケジューラー自体が実行されている必要があるため、スケジューラーを1時間おきに実行するにCronがセットされている時、Laravel側に5分おきのコマンドを設定しても1時間おきにしか実行されません。

条件に一致した時、「/usr/bin/php artisan コマンド名」のような形で実行されます。

しかし、Xserver での「/usr/bin/php」は執筆時点では PHP 4.3.9 を指すため、バージョンが古すぎて正しく実行されません。
バージョンを変更して実行するためには「/usr/bin/php5.6」や「/usr/bin/php7.0」を指定する必要があります。

変更する場合は .env ファイル内に PHP_PATH という定数を新たに書き加えます。

PHP_PATH=/usr/bin/php7.0

これによってタスクスケジューラーからの実行時にも適切なバージョンの PHP バイナリが使われます。

[PHP]ひらがな・カタカナ、大文字・小文字を区別しないソート(並べ替え)

標準関数の sort() を使ってひらがな・カタカナの混在する文字列をソートすると、以下のように ひらがな が先、カタカナ が後となるように並び替えられます。

いちご
ぶどう
りんご
オレンジ
バナナ

アルファベットの大文字小文字に関しても同様で、大文字が優先で次に小文字という順番になるため「a, B, c」と並べたくても「B, a, c」となってしまいます。

ひらがな・カタカナ、大文字・小文字を区別せず五十音順に並び替えたい場合など、ソート方法を細かく指定してユーザー独自のルールを作るには usort() を用います。

<?php
$list = [
    'りんご',
    'オレンジ',
    'ぶどう',
    'いちご',
    'バナナ',
];

usort($list, function($a, $b){
    $a = mb_convert_kana($a, 'c');
    $b = mb_convert_kana($b, 'c');
    return strcasecmp($a, $b);
});

print_r($list);
いちご
オレンジ
バナナ
ぶどう
りんご

配列から2つずつ値を取り出し、どちらも同じ時は 0、最初の引数のほうがが大きい時は正の数、二番目の引数のほうが大きい時は府の値を返すようにします。
この処理自体は標準関数 strcmp() が用意されているので、そちらを使うと sort() と全く同じ結果を得ることが出来ます。strcmp() の代わりに strcasecmp() を用いるとアルファベットの大文字・小文字の区別なくソートすることが出来ます。

ひらがなとカタカナの区別をなくす場合両方の値をひらがなかカタカナのどちらかに変換して統一してから比較するようにします。このような変換処理には mb_convert_kana() が使えます。

rsort() のように逆順にソートしたい場合は -1 * strcasecmp($a, $b); のようにして正負を逆転させます。

[PHP]コンフィグファイルから設定情報を読み込むためのConfigクラス

PHPファイルに連想配列の形で保存しておいた設定情報を読み込むことが多かったのでスタティッククラスとして定義してみました。
Config::set_config_directory(ディレクトリパス) でコンフィグファイルのディレクトリを指定しておき、Config::get(‘パス.ファイル名.配列のキー’) で情報を取り出せるようにしてあります。単純に Config::get(‘ファイル名.配列のキー’) と書いても動作します。

【使用例】

<?php
require 'Config.php';
Config::set_config_directory(__DIR__ . '/config');
echo  Config::get('app.url');    // http://example.com

設定ファイル config/app.php

<?php
return [
    'url' => 'http://example.com',
    'email' => 'user@example.com',
];

Config.php

<?php
class Config
{
    protected static $directory;

    public static function set_config_directory($directory){
        self::$directory = $directory;
    }

    public static function get_config_directory(){
        return rtrim(self::$directory, '/\\');
    }

    public static function get($route){
        $values = preg_split('/\./', $route, -1, PREG_SPLIT_NO_EMPTY);
        $key = array_pop($values);
        $file = array_pop($values) . '.php';
        $path = (!empty($values)) ? implode(DIRECTORY_SEPARATOR, $values) . DIRECTORY_SEPARATOR : '';
        $baseDir = self::get_config_directory() . DIRECTORY_SEPARATOR;
        $config = include($baseDir . $path . $file);
        return $config[$key];
    }
}