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

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

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

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

Q&A

解決済

2回答

1163閲覧

Allowed memory size ofが出てしまいます

higa_yomityu

総合スコア41

PHP

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

0グッド

0クリップ

投稿2020/10/25 16:14

Allowed memory size ofというエラー文が出てしまいます。

メモリが不足していることは理解できたのですが、どうやって解決したら良いのかが分かりません。

試したこと

memory_limitがデフォルトの128Ⅿだったのでini_set("memory_limit", "200M");にしました。←エラー文消えず。。

試してみたいこと

ini_set("memory_limit", "-1");を使ってメモリの上限を開放することです。
しかし、調べてみると危険という風に記載されていたので試していません。どういう風に危険なのかも教えていただけると幸いです。

問題と思われるコード

<?php date_default_timezone_set('Asia/Tokyo'); $year=date('Y'); $month=date('m'); //月末日を取得 $end_month=date('t',strtotime($year.$month.'01')); //一日の曜日を取得 $first_week=date('w'.strtotime($year.$month.'01')); //月末の曜日を取得 $last_week=date('w',strtotime($year.$month.$end_month)); $calender=[]; $j=0; //一日開始曜日までの穴埋め for($i = 0; $i < $first_week; $i++){ $calender[$j][]=''; } //一日から月末日までループ for($i = 1; $i <=$end_month;$i++){ if(isset($calender[$j]) &&count($calender[$j])===7){ $j++; } $calender[$j][]=$i; } //月末の曜日の穴埋め for($i=count($calender[$j]);$i<7;$i++){ $calender[$j][]=''; } $aryweek=['日','月','火','水','木','金','土']; ?> <table> <tr> <?php foreach($aryweek as$week){?> <th> <?php echo $week?> </th> <?php }?> </tr> <?php foreach($calender as$tr){?> <tr> <?php foreach($tr as$td){?> <?php if($td !=date('j')){?> <td> <?php echo $td ?> </td> <?php }else{?> <td class="today"> <?php echo $td?> </td> <?php }?> <?php }?> </tr> <?php }?> </table>

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

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

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

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

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

m.ts10806

2020/10/26 02:13

聞きたいのはどっちですか? 方向性が違うのでどちらかにしたほうが良いかと思いますが。 > メモリが不足していることは理解できたのですが、どうやって解決したら良いのかが分かりません。 > しかし、調べてみると危険という風に記載されていたので試していません。どういう風に危険なのかも教えていただけると幸いです。 あと、エラー文は全文コピペしてください。 https://teratail.com/help/question-tips#questionTips3-4-2
guest

回答2

0

メモリが不足していることは理解できたのですが、どうやって解決したら良いのかが分かりません。

疑わしい場所の前後のメモリ使用量の確認、ループ処理の最中にの最中にmemory_get_usageを適度に挟んでメモリ使用量を確認し、不自然にメモリが増えている箇所が特定出来たら修正しましょう。
が、大抵は些細なミスなので特定の個所で処理をexitしながらどこまで動作するかを確認し、動作しない行に出くわしたらその行を見直せば解決する事が多いと思われます。

しかし、調べてみると危険という風に記載されていたので試していません。どういう風に危険なのかも教えていただけると幸いです。

メモリ使用量が際限なく増える事が問題なので、メモリを食いつぶしたサーバーがどうなるかを調べたら良いでしょう。

投稿2020/10/25 17:57

hentaiman

総合スコア6415

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

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

0

ベストアンサー

前置き

まず、PHP xdebug ブレークポイントPHP デバッグ方法で検索して、PHPのデバッグの方法を調べてください。
エラーメッセージで検索するのは、基本的なデバッグ方法を把握した後にしないと(今回の様に)効果的ではありませんし、(これも今回の様に)誤った解決をしてしまうケースも多いです。

回答

PHP

1 $first_week=date('w'.strtotime($year.$month.'01'));

PHP

1 $first_week=date('w',strtotime($year.$month.'01'));

でメモリ不足は解決すると思います。

解説

今回のケースだと

Allowed memory size ofというエラー文が出てしまいます。

メモリが不足していることは理解できたのですが、どうやって解決したら良いのかが分かりません。

という解釈は正しいのですが、処理的にはメモリがいっぱいになるようなことはしていないので、
どこかで処理をミスってメモリを食いすぎているという事になります。

ブレークポイントを仕掛けるか、以下の様な形で処理を無理やり止めてそこまではたどり着くか、その時点での変数は想定通りであるかを確認してみてください

処理をミスってメモリを食い尽くすようなケースは、大量のデータを用意していたり、ループが想定より多すぎる場合が多いです。
*ソースコードを修正してのデバッグはミスが多くなるので推奨しません。前述のxdebugを使うことをお勧めします。

PHP

1<?php 2 date_default_timezone_set('Asia/Tokyo'); 3 4 $year=date('Y'); 5 $month=date('m'); 6 7 //月末日を取得 8 $end_month=date('t',strtotime($year.$month.'01')); 9 //一日の曜日を取得 10 $first_week=date('w'.strtotime($year.$month.'01')); 11 //月末の曜日を取得 12 $last_week=date('w',strtotime($year.$month.$end_month)); 13 14 $calender=[]; 15 $j=0; 16 //一日開始曜日までの穴埋め 17//以下のコメントがブラウザに表示されればにまではクリアしているので、コードをコメントアウトして再度実行 18//一つ目のループで使用する変数が想定通りか確認 19var_dump($first_week);//今回のケースはここが想定外の値になっているはず 20die("一つ目のループの前までは処理完了"); 21 22 for($i = 0; $i < $first_week; $i++){ 23 $calender[$j][]=''; 24 } 25//以下のコメントがブラウザに表示されれば一つ目のループはクリアしているので、コードをコメントアウトして再度実行 26var_dump($end_month); 27die("一つ目のループは処理完了"); 28 //一日から月末日までループ 29 for($i = 1; $i <=$end_month;$i++){ 30 if(isset($calender[$j]) &&count($calender[$j])===7){ 31 $j++; 32 } 33 $calender[$j][]=$i; 34 } 35 36//以下のコメントが(略) 37var_dump($calender[$j]); 38die("二つ目のループは処理完了"); 39 40 //月末の曜日の穴埋め 41 for($i=count($calender[$j]);$i<7;$i++){ 42 $calender[$j][]=''; 43 } 44//以下のコメントが(略) 45var_dump($aryweek); 46die("三つ目のループは処理完了"); 47 48 $aryweek=['日','月','火','水','木','金','土']; 49 ?> 50 <table> 51 <tr> 52 <?php foreach($aryweek as $week){?> 53 <th> 54 <?php echo $week?> 55 </th> 56 <?php }?> 57 </tr> 58 59 <?php foreach($calender as$tr){?> 60 <tr> 61 <?php foreach($tr as$td){?> 62 <?php if($td !=date('j')){?> 63 <td> 64 <?php echo $td ?> 65 </td> 66 <?php }else{?> 67 <td class="today"> 68 <?php echo $td?> 69 </td> 70 <?php }?> 71 <?php }?> 72 </tr> 73 <?php }?> 74 </table>

投稿2020/10/25 16:57

tanat

総合スコア18713

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問