cakePHPでバッチを実行する際、php.iniの値を変更して実行する方法

今日はcakePHPのバッチ実行時のphp.ini項目を変更する話です。

レンタルサーバなどを使っていると、php.iniが直接編集出来ないため、.htaccessなどに設定を記入して対応したりします。

私が今保守しているシステムもカゴヤの専用サーバを使っているのですが、php.iniの変更はコントロールパネルから
一部の設定しか変更できません。

で、先日、過去データの移管が必要になったため、バッチを作成し、実行することになったのですが、いざ実行してみるとメモリーエラーが。。。

Fatal error: Allowed memory size of 83886080 bytes exhausted (tried to allocate 85 bytes) in /〜/cake/libs/model/datasources/dbo/dbo_mysql.php on line 779

ほほう。。
どうやらメモリーが足りないと言っているようです。

しかし、コントロールパネルからmemory_limitを512Mに設定していたので、なぜだろうと思ったのですが、
どうやらコントロールパネルから設定した値はLocal Valueしか変更されないようです。

ということで、apache経由(WEB)でうごくPHPについてはmemory_limitは512Mになるのですが、コマンドラインから実行した場合、
master valueの値を見にいくようで、変更した値が適用されないようです。
ということでメモリーエラーが出ているようです。

そんなわけで、バッチから実行した場合でもmemory_limitの値を変更できる方法はないか探っていたのですが、
糸口は、phpをコマンドラインから実行する際に、直接memory_limitの値を変更する方法が -dオプションで出来るということなので
これを元になんとか検討してみました。
php -d memory_limit 512M ./test_batch.php
   ↑
こんな感じですね。

ということで色々試行錯誤してみました。
まずはこれ。
通常cakePHPでバッチを実行する場合、以下のように実行するのですが、
cake -app /~/パス/app test_batch
   ↓
このようにしてみると。。
cake -app -d memory_limit=512M /~/パス/app test_batch

エラーが出てダメでした。

ということで、ここはcakeファイルの中身をみてみる事に。。。
そうすると。。 中にphpの実行コマンドが。。。

#!/bin/bash
################################################################################
#
# Bake is a shell script for running CakePHP bake script
# PHP versions 4 and 5
#
# CakePHP(tm) :  Rapid Development Framework (http://cakephp.org)
# Copyright 2005-2011, Cake Software Foundation, Inc.
#
# Licensed under The MIT License
# Redistributions of files must retain the above copyright notice.
#
# @copyright            Copyright 2005-2011, Cake Software Foundation, Inc.
# @link                 http://cakephp.org CakePHP(tm) Project
# @package              Cake
# @subpackage           Cake.Console
# @since                CakePHP(tm) v 1.2.0.5012
# @license              MIT License (http://www.opensource.org/licenses/mit-license.php)
#
################################################################################
LIB=$(cd -P -- "$(dirname -- "$0")" && pwd -P) && LIB=$LIB/$(basename -- "$0")

while [ -h $LIB ]; do
    DIR=$(dirname -- "$LIB")
    SYM=$(readlink $LIB)
    LIB=$(cd $DIR && cd $(dirname -- "$SYM") && pwd)/$(basename -- "$SYM")
done

LIB=$(dirname -- "$LIB")/
APP=`pwd`

exec php -q  ${LIB}cake.php -working "${APP}" "$@"

exit;

ということで、

exec php -q ${LIB}cake.php -working “${APP}” “$@”
の部分を下記のようにして変更

   ↓
exec php -q -d memory_limit=512M ${LIB}cake.php -working “${APP}” “$@”

すると、無事うまく行きました。。

なるほどですね〜。。