今日は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}” “$@”
すると、無事うまく行きました。。
なるほどですね〜。。