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

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

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

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

Q&A

解決済

5回答

1206閲覧

それほど高負荷でしょうか???

Take_it

総合スコア357

PHP

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

0グッド

1クリップ

投稿2019/06/28 11:32

月初から今日の二日前までの日付を配列で取得しようとしています。

PHP

1$config['now'] = new DateTimeImmutable; 2 3function get_day_list($config){ 4 $day_list = array(); 5 $ed_date = $config['now']->modify('-2 day')->format('Y-m-d');//2日前 6 $st_date = $config['now']->modify('first day of this month')->format('Y-m-d'); 7 $ed_ob = new DateTimeImmutable($ed_date); 8 $st_ob = new DateTime($st_date); 9 10 $stop = 0; 11 if($st_ob<$ed_ob): 12 while($stop<1): 13 $date = $st_ob->format('Y-m-d'); 14 $day_list[] = $date; 15 if($date==$ed_ob): 16 ++$stop; 17 else: 18 $st_ob = $st_ob->modify('+1 day'); 19 endif; 20 endwhile; 21 elseif($st_ob==$ed_ob): 22 $day_list[]=$st_date;//1日だけ 23 else://($st_ob>$ed_ob) 24 return;//何もせずに関数を終える。返り値なし。 25 endif; 26 27 return $day_list; 28}

起きている現象

やけに時間がかかり、

Fatal error: Allowed memory size of 1342177280 bytes exhausted (tried to allocate 4096 bytes) in* * * * * function.php on line 48

となる。
該当する箇所がwhileのところなので無限ループを疑い、$stop=0;の直前でこの二つのDateTimeオブジェクトをチェックしてみたが特に異常はない。

//$st_ob DateTime Object ( [date] => 2019-06-01 00:00:00.000000 [timezone_type] => 3 [timezone] => Asia/Tokyo ) //$ed_ob DateTimeImmutable Object ( [date] => 2019-06-26 00:00:00.000000 [timezone_type] => 3 [timezone] => Asia/Tokyo )

このエラーはどう回避すればよいのでしょうか・・・。

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

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

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

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

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

scsi

2019/06/28 11:42

While分の中の変数を標準出力に出してみたらわかるのでは?
guest

回答5

0

if($date==$ed_ob):

文字列とオブジェクトの比較になっているので無限ループしていると思われます。
こうかな。

if($date==$ed_date):

投稿2019/06/28 11:47

ttyp03

総合スコア16998

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

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

0

ベストアンサー

$date==$ed_ob がずっと false
$date,$ed_obの推移を確認するといいです。

投稿2019/06/28 11:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/06/28 11:47

実際には推移以前の問題ですけど。。。
Take_it

2019/06/28 11:50

while($stop<1): $date = $st_ob->format('Y-m-d'); $day_list[] = $date; if($st_ob==$ed_ob): ++$stop; else: $st_ob = $st_ob->modify('+1 day'); endif; endwhile; とすべきでした。。
guest

0

バッチなどで利用していると時々出ますね。
Fatal error: Allowed memory size of

メモリーの使用量を計測する事と、下記にて使用量を変更してみては如何でしょうか?

php

1ini_set("memory_limit", "200M");

投稿2019/06/28 11:50

hide0128

総合スコア245

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

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

0

こんな感じでよいのでは?

PHP

1$offset=2; 2$d1=range(strtotime(date("Y-m-1")),strtotime(date("Y-m-d")),60*60*24); 3$d1=array_splice($d1,0,count($d1)>$offset?count($d1)-$offset:0); 4$d2=array_map(function($x){return date("Y-m-d",$x);},$d1); 5print_r($d2);

投稿2019/06/28 11:46

yambejp

総合スコア114825

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

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

yambejp

2019/06/28 11:49 編集

今日が1日や2日だったときに2日前をどうするか次第ですね わざわざ日付の処理をwhileでループする必要もないでしょう。 m日からn日までをrangeでとってo日前ということなら後ろからo個 データを削ればよいので
guest

0

メモリの増減を追ってみては。

もし大きなデータを保持している変数があるのでしたら用が済んだらunset()するとか、
必要な情報のみを取得するように配慮した方がいいかもしれません。

投稿2019/06/28 11:40

m.ts10806

総合スコア80850

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問