Laravel の Artisan コマンドでメモリ不足エラーが発生したため、ini_set()でメモリ制限を変更したところ、php.iniの設定より大きい値を設定できることに気づいた。
つまりini_set()による変更で、php.iniを編集しなくても一時的な制限解除ができる。
検証などで使えそうなので仕様をまとめておく。
結論
ini_set()でphp.iniの設定を上書きできる
なお、上書きした設定の有効期限はそのスクリプト実行中のみ。
メリット
-
php.iniを編集せずに、異なるメモリ制限値で繰り返し実行可能 - 値を調整するだけで本番環境に適用できる
用途例
- 実証実験・技術検証
- 「本当にLaravelで処理し切れるのか」等を検証
- 一時的な大量データ処理
- 旧システムから新システムへの一括移行
- 年次レポート生成
- 一度きりの大量CSVインポート
- 開発・デバッグ時の制限緩和
- メモリ制限を緩和し、問題の切り分けを実施
実験
環境
- PHP 8.3.28
- WSL2 Ubuntu-22.04
php.ini の設定
memory_limit = 128M
テストコード
test.phpを作成。
<?php
// php.ini の設定を確認
echo "Initial memory_limit: " . ini_get('memory_limit') . "\n";
// 出力: Initial memory_limit: 128M
// php.ini より大きい値を設定
ini_set('memory_limit', '512M');
// 変更後の値を確認
echo "Updated memory_limit: " . ini_get('memory_limit') . "\n";
// 出力: Updated memory_limit: 512M
// 実際に512MBまで使えるか確認(約300MB確保してみる)
$data = str_repeat('x', 300 * 1024 * 1024);
echo "Memory allocated successfully!\n";
実行結果
$ php test.php
Initial memory_limit: 128M
Updated memory_limit: 512M
Memory allocated successfully!
結果: php.iniの128Mを超える512Mが設定され、実際に300MBのメモリを確保できた。
注意点
-
スクリプト実行中のみ有効
- スクリプト終了後は
php.iniの設定に戻る - 他のスクリプトには影響しない
- 途中でクラッシュした場合も同じく
php.iniの設定に戻る
- スクリプト終了後は
-
すべての設定が変更可能ではない
- 一部の設定は
ini_set()で変更できない(disable_functionsなど) - 変更可能かどうかは PHP公式ドキュメント: php.ini ディレクティブのリスト の「変更可能」列を参照
- 一部の設定は
-
本番環境での使用
- 恒久的な対処は
php.iniを適切に設定すべき - 一時的な対処として有効
- 恒久的な対処は
-
Webアプリケーションでの使用
- 有効範囲:そのリクエスト処理中のみ(リクエスト受信 〜 レスポンス送信完了)
- 次のリクエストには影響しない:新しいプロセス/ワーカーが処理するため
- 関数スコープではない:ルート内のどの関数でも有効(プロセス全体に影響)
// 例: Webリクエストでの挙動 Route::get('/heavy-report', function() { ini_set('memory_limit', '512M'); // このリクエスト処理中のみ有効 generateReport(); // この関数内でも512M return response()->json([...]); }); // レスポンス送信完了 → 設定破棄 // 別のユーザーからの次のリクエスト → php.iniの設定に戻っている
ユースケース
// Laravel Artisan コマンドの例
class DailySnapshot extends Command
{
private const MEMORY_LIMIT = '512M';
public function handle()
{
// 大量データ処理のため一時的にメモリ制限を緩和
ini_set('memory_limit', self::MEMORY_LIMIT);
// 処理実行...
}
}