0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravelで一時的にメモリ制限解除をする

0
Last updated at Posted at 2025-12-16

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のメモリを確保できた。


注意点

  1. スクリプト実行中のみ有効

    • スクリプト終了後はphp.iniの設定に戻る
    • 他のスクリプトには影響しない
    • 途中でクラッシュした場合も同じくphp.iniの設定に戻る
  2. すべての設定が変更可能ではない

  3. 本番環境での使用

    • 恒久的な対処はphp.iniを適切に設定すべき
    • 一時的な対処として有効
  4. 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);

        // 処理実行...
    }
}

参考情報

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?