WPのPHP memory_limitのデフォルト値は40Mらしい
とあるWP製サイトがPHPのメモリ不足でエラーを吐いていました。
PHP Fatal error: Out of memory (allocated ****) (tried to allocate **** bytes)
php.iniで設定されている値よりもかなり少ないメモリでエラーを吐いてしまっているので、その原因を調べました。
WPのPHP memory_limitデフォルト値
調べた結果、WPのPHP memory_limitデフォルト値は、シングルサイト40M、マルチサイト64M、管理画面256Mに設定されているようです。 これがエラーの原因ですね。
memory_limitの設定箇所
/wp-includes/default-constants.php の32行目辺りにmemory_limitを設定するスクリプトがありました。
$current_limit = @ini_get( 'memory_limit' );
$current_limit_int = wp_convert_hr_to_bytes( $current_limit );
// Define memory limits.
if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
define( 'WP_MEMORY_LIMIT', $current_limit );
} elseif ( is_multisite() ) {
define( 'WP_MEMORY_LIMIT', '64M' );
} else {
define( 'WP_MEMORY_LIMIT', '40M' );
}
}
if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
} elseif ( -1 === $current_limit_int || $current_limit_int > 268435456 /* = 256M */ ) {
define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
} else {
define( 'WP_MAX_MEMORY_LIMIT', '256M' );
}
}
// Set memory limits.
$wp_limit_int = wp_convert_hr_to_bytes( WP_MEMORY_LIMIT );
if ( -1 !== $current_limit_int && ( -1 === $wp_limit_int || $wp_limit_int > $current_limit_int ) ) {
@ini_set( 'memory_limit', WP_MEMORY_LIMIT );
}
memory_limit の設定方法
サイトのPHP環境設定(php.iniなど)でWP_MEMORY_LIMITの設定値よりも大きなサイズが指定されている場合はWP_MEMORY_LIMITの設定値は無効となってしまうので、
php.iniに
memory_limit = 512M
か、
.htaccessに
php_value memory_limit 512M
と
wp-config.phpに
define('WP_MEMORY_LIMIT', '512M'); //一般ページ
define('WP_MAX_MEMORY_LIMIT', '512M'); //管理画面
を記述することでWPのmemory_limitの設定が可能になります。 また、「512M」は、自分の使いたいメモリの値にしてください。
memory_limit 確認方法
以下のコードで、きちんと設定されているか、現在設定されているmemory_limitを表示することで確認することができます。
echo ini_get('memory_limit'); //512M
終わりに
WPで大きな容量のファイルをインクルードする時などには、PHPのメモリ制限には注意しないといけませんね。