質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Laravel 6

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1859閲覧

LaravelのJobでAllowed memory size of 134217728 bytes exhaustedエラーに対してできること

somamon

総合スコア2

Laravel 6

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2023/04/19 14:17

編集2023/04/19 14:29

実現したいこと

Laravel6で80000人のユーザを想定してJobを実行していると、(php artisan queue:work -database)メモリリークがおきました
memory_get_usageをif文で試して、もしメモリ使用率が想定以上だったらgc_collect_cycles()を行う処理は効果があるでしょうか?
開発環境でこの状態なので、本番環境(supervisor)ではメモリリークが起きない様に実装したいです
極力php.iniの設定ファイルをいじったりはしたくないです
jobを分けるにしても、jobの状態の管理をしたいので、DBのテーブルのjobsテーブルの値で把握したく、できるだけ1つのjobで対応したいのがあります。

foreach ($all_user as $50user) { foreach ($50user as $user_mail) { Log::info($user_mail); } unset($50user); if (memory_get_usage() > 128 * 1024 * 1024) { // 128MBを超えたら gc_collect_cycles(); // ガベージコレクターを実行してメモリを解放 } sleep(60); }

メモリ

前提

Laravel6で80000人のユーザを想定してJobを実行していると、Allowed memory size of 134217728 bytes exhausteエラーになってしまった

発生している問題・エラーメッセージ

console.ERROR: Allowed memory size of 134217728 bytes exhausted (tried to allocate 40960 bytes) {"exception":"[object] (Symfony\Component\Debug\Exception\FatalErrorException(code: 1): Allowed memory size of 134217728 bytes exhausted (tried to allocate 40960 bytes) at Vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/ContentEncoder/NativeQpContentEncoder.php:95)"} []

該当のソースコード

LaravelPHP

foreach ($all_user as $50user) { foreach ($50user as $user_mail) { Log::info($user_mail); } unset($50user); sleep(60); }

試したこと

90000人のユーザをPluckでforeach文で回している時、変数に対してunsetを行いました

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

参考: 結果の分割 の項目を参考にしてください。
https://readouble.com/laravel/6.x/ja/eloquent.html

php

1User::chunk(50, function($users) { 2 foreach ($users as $user) { 3 // ユーザーごとの処理 4 } 5});

Laravel 7以上であれば、Lazy() メソッドを使う。

php

1- $users = User::all() 2+ $users = User::lazy()

投稿2023/04/19 17:13

phper.k

総合スコア3923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

そういうのは実際にやってみないと分からないと思います。テスト環境とか作って試すしかないんじゃないでしょうか。

あとは想像で言いますが、gc_collect_cycles()ってメモリリークとか循環参照とかが起きてるときとかは効果がありそうですが、単純に巨大なデータを扱ってるとかそういうのには効果がなさそうな気がします。

参考)
https://su-kun1899.hatenablog.com/entry/2021/11/17/080000

ということで、提示されてるソースコードだけでは何とも言えないかと。

投稿2023/04/19 14:57

AbeTakashi

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問