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

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

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

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Q&A

解決済

3回答

531閲覧

同じ処理で必ずテスト環境でタイムアウトする。

Java_student

総合スコア83

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

0グッド

0クリップ

投稿2024/05/09 01:10

編集2024/05/09 02:04

実現したいこと

通知機能を作成しているのですが、他の通知作成処理ではタイムアウトが起こらないのですが特定の通知作成処理の所でタイムアウトが起きるので修正したいです。

前提

タイムアウトが送る箇所はチャットに入る際にパスワードを入力した際に中間テーブルを作成すると共にチャットを建てた人に入室のお知らせをする通知を作成をする内容です。

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

504 Gateway Time-out WARN PHP Fatal error: Maximum execution time of 60 seconds exceeded in vendor/symfony/polyfill-mbstring/Mbstring.php on line 515.

該当のソースコード

MemberController

1public function store(Request $request) 2 { 3 $user = Auth::user(); 4 $rooms = Room::all(); 5 $room = Room::find($request->room_id); 6 $messages = Message::where('room_id', '=', $room->id) 7 ->get(); 8 if($room->room_password == $request->room_password) 9 { 10 $member = new Member; 11 $member->room_id = $request->room_id; 12 $member->user_id = $request->user_id; 13 $member->host_id = $request->host_id; 14 $member->save(); 15 16 $notification = new Notification; 17 $notification->user_id = $request->user_id; 18 $notification->member_id = $member->id; 19 $notification->notification_type = 1; 20 $notification->title = "{$user->name}さんが{$member->room->name}に入室しました。"; 21 $notification->save(); 22 23 return view('rooms/show', ['user'=>$user, 'rooms'=>$rooms, 'room'=>$room, 'member'=>$member, 'messages'=>$messages]); 24 } 25 return view('rooms/index', ['user'=>$user, 'rooms'=>$rooms, 'room'=>$room]); 26 27 }

試したこと

タイムアウトの原因が処理が多いから重いのか、ifの処理が原因なのかを調べています。
WARN PHP Fatal error: Maximum execution time of 60 seconds exceeded in vendor/symfony/polyfill-mbstring/Mbstring.php on line 515. のエラーを発見して探したところ、タイムアウトの時間を変更する方法を見たのですが、そちらはどうでしょうか?

補足情報(FW/ツールのバージョンなど)

PHP8
Laravel10

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

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

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

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

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

Java_student

2024/05/10 00:41

EC2からボリュームを増やしたりしたほうが良いのでしょうか?
Java_student

2024/05/10 01:02 編集

文字数制限に引っ掛かったのですがリダイレクト先のrooms/showはif文やループ文を多く記載しているのですが、そちらも関係してますでしょうか?
guest

回答3

0

ベストアンサー

まず、タイムアウトが発生するのは本当にstoreメソッドですか?そこから確認しましょう。

デバッガなどを導入するのは難しそうに見受けられるので、ログ出力を各所にいれて何行目がいつ実行されているか、などを見て、時間がかかっているメソッドを調べていくと良いでしょう。

php

1Log::debug(__LINE__ . '行目が実行されました');

また、タイムアウトと直接関係ないかもですが、storeメソッドでviewを表示するのは避けたほうがいいです。

storeメソッドは恐らくPOSTリクエストを受けるものでしょうけど、POSTリクエストでデータ更新後、そのまま同一のリクエストでViewを表示するのは10年以上前のWebアプリケーションの作り方です。

php

1return view('rooms/show', ['user'=>$user, 'rooms'=>$rooms, 'room'=>$room, 'member'=>$member, 'messages'=>$messages]); 2 3// ↓ たとえば、下記のような形に変更してshowメソッドにリダイレクト (route nameやパラメータ等はroute定義により異なりますので合わせてください) 4return redirect()->route('rooms/show', ['id' => $room->id]);

投稿2024/05/15 07:42

Eggpan

総合スコア3203

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

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

0

timeoutエラーがphpで出ているわけですからサーバー側の問題ですね
環境にもよりますがタスクマネージャーやtopコマンドで負荷状況は確認できますし
SQLの課題であればスロークエリーのログなど確認できます
push処理ということであればwebsocketかSSEでやる流れだと思いますが、
入室案内くらいならよほど変な作りをしていない限りtimeoutするようなものにはならないはずです
逆にどうしても待ち時間が必要という仕組みであれば
max_execution_time を変更する方法もありますが、暴走が止まらなくなるリスクもあるので
あまりおすすめできません

投稿2024/05/09 03:19

yambejp

総合スコア116443

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

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

Java_student

2024/05/10 00:54

>入室案内くらいならよほど変な作りをしていない限りtimeoutするようなものにはならないはずです 現状、質問に記載している中間テーブルの作成するコード箇所stroreメソッド内の記載でタイムアウトが起きる原因になりそうな箇所はif処理くらいしか原因になりそうな箇所が分かりません。 if文はタイムアウトになる原因はありえますでしょうか?
guest

0

実際に何の処理で時間がかかってるかを見つけ出す必要があります。データベースに接続する処理があるならデータベースのログを見る、大量のデータを扱ってるのならメモリ周りで不具合が起きてると想定してApacheやNginx、php-fpmなどのエラーログを見ることで何かしら分かることがあるかもしれません。

断片的な情報しかないので、これ以上の具体的なアドバイスは出にくいのでは?と思います。

追記)
マッチングみたいなことを行っているのであれば、もしかするとどこかで無限ループが発生してるのかもしれません。forやforeach、whileなどを使ってるのであれば、その辺をチェックしてみると良いかもしれません。ループする回数を制限したりすれば直る可能性もあるかと思います。

投稿2024/05/09 01:19

編集2024/05/09 03:54
AbeTakashi

総合スコア4820

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

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

Java_student

2024/05/09 01:25

探してみます。
Java_student

2024/05/10 00:17

探しているのですが、通知を作成するコード前はタイムアウトが起きていなかったので一度通知作成コードを消した状態で再度試してもタイムアウトが起きました。 これは他の処理の所が原因の可能性がありますか?
AbeTakashi

2024/05/10 04:17

うーん、どうでしょうね。追記された内容も含めて質問文だけの情報だけだとヒントがなさ過ぎてなんとも言えないですね。xdebugとか使ったことありますか? ないならそういうので怪しいところを探してみるのはありかもしれません。
Java_student

2024/05/10 05:23

まだうまくデバッグを表示出来ていないのですが、下記のやり方でもタイムアウトに関するものが出ることありますでしょうか? https://laraweb.net/practice/2561/ またデバッグに関しての知識がまだ薄いのですがデバッグによって表示される内容が大きく違う事はあるのでしょうか? その場合はxdebugを入れようと思うのですがcloud9だからなのか入れられなかったので、他のデバッグ方法を聞いてみました。 すみません。
AbeTakashi

2024/05/10 05:34

LaravelのログはあくまでもLaravelフレームワーク上でのエラーしか補足できません。このタイムアウトはLaravelフレームワーク外で起きてるように見受けられるので、そこのログには残らないような気がします。 Cloud9は使ったことがないので具体的なアドバイスはできませんが、xdebugの導入に関しての記事は数多く散見されますので、なるべく最新の情報を参考にして再チャレンジしてみたらどうでしょう。上手く入れられたら、どこで止まってるかに関しては一発で分かると思います。
Java_student

2024/05/10 23:59

xdebugは入れることが出来たのですがphp.iniの編集また特定が分からなくて調べていたのですが、 Configuration File (php.ini) Path => /etc Loaded Configuration File => /etc/php.ini 上記の書き方はphp.iniファイルが存在していますか? 次にls -al php.iniで編集を試みたのですが、ls: cannot access php.ini: No such file or directoryと書かれており、恐らくファイルが存在していない事だと思います。 php.iniファイルは作成する必要があるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問