[PHP]よくあるエラーメッセージの原因と対処法 2

Pocket

前回の続きです。

PHP でよくあるエラーメッセージの意味と解決方法を具体例とともに紹介します。


Notice: Undefined offset: (キー)

<?php
$arr = array("test", "sample");
echo $arr[2];

配列変数で、定義されていないキーを指定した時に起こるエラーです。
例ではキー 0 と 1 は値が定義されていますが、2 は未定義です。


Warning: Invalid argument supplied for foreach()

<?php
$arr = "";

foreach($arr as $value){
	echo $value;
}

foreach が扱えるのは配列変数等のオブジェクトに限られます。(厳密にはイテレータを持つオブジェクト)
文字列や null、 false ではエラーが発生します。
例のようにわかりやすければいいのですが、たいていのプログラムは次のようになっていることが多いかと思います。

<?php
$result = get_results();

foreach($result as $value){
  echo $value;
}

仮に何らかの結果を配列で返すユーザー定義関数 get_results があったとして、
結果がない場合に空の配列を返すのであれば問題ないのですが、
もし一つも結果が得られなかったときに false や null を返す仕様になっていた場合、
このエラーが起きる可能性があります。


Warning: Cannot modify header information – headers already sent

<?php
echo "sample";
header("Location: index.php");
exit;

指定したページに移動させるとき、header() で Location を指定するのですが、
ヘッダーを出力するよりも前に何らかの文字等が出力されているとエラーが起こります。
header() より前に echo をしていたり、<?php の前に無駄な文字や改行などが無いか確認して下さい。
setcookie() を使う場合も、使用している行より前に他のヘッダーや文字の出力を行わないように気をつける必要があります。
文字コード UTF-8 の BOM(Byte Order Mark) が原因で起こる可能性もあります。
その場合は BOM なしで保存できるテキストエディタを利用して UTF-8N で保存して下さい。

<?php include "test.php";?>
<?php
header("Location: index.php");
exit;
?>

上の例では一見無駄な文字は無いように見えますが、1行目の末尾で改行を出力しているとみなされ、エラーになる場合があります。


Notice: A session had already been started

<?php
session_start();
session_start();

例はやや極端ですが、既にセッションが開始されている時、session_start() することはできません。
サーバー側の php.ini 等で session.auto_start が有効になっていると、session_start() していなくても
自動的にセッションがスタートしていることがあります。また、include しているファイルの中でも session_start() が使われていないか確認して下さい。

<?php
if( !isset($_SESSION) ) {
  session_start();
}

セッションが開始されていれば重ねてスタートしないようにすれば回避出来ます。


Fatal error: Cannot access private property

<?php
class Test {
	private $sample;
}

$test = new Test();
$test->sample = 10;

private で保護されたプロパティ(クラス内の変数)には直接アクセスできません。
public で宣言すれば可能ですが、クラス内に操作するためののメソッド(セッターメソッド又はゲッターメソッド)がないか確認して下さい。


Fatal error: Maximum execution time of 30 seconds exceeded

具体例は省略しますが、処理に 30 秒以上(環境によります)かかってしまうような重い処理や、
無限ループができてしまっている場合にこのようになる場合があります。
php.ini の max_execution_time を必要な秒数に変更するか、phpファイルに

ini_set("max_execution_time", 120);

あるいは

set_time_limit(120);

のように書いてタイムアウト時間を変更します

共用サーバーなどでタイムアウト時間の変更に制限がある場合があるので気をつけて下さい。
また、処理に長い時間のかかるスクリプトの実行はサーバーに高い負荷をかけるため、
可能な限りスクリプト側の実行時間を短く出来るように改良するのが理想です。
あくまで大型プログラムのインストール時など、一時的に時間が掛かるケースでのみ変更して下さい。


Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes)

サイズの大きなファイルを開こうとした場合や画像のリソースなどを開放し忘れている場合など、サーバーが確保した容量が不足している場合に表示されるメッセージです。数値はサーバーの設定により異なります。
画像ファイルのリソースを開放する必要がある場合は imagedestroy() で開放します。
サーバー側の上限を変更するにはサーバーの php.ini にある memory_limit を修正するか、ソースコードに ini_set() を記述して上限を設定します。(例は 512MB の場合)

ini_set('memory_limit', '512M');

あまり大きな数値は設定できない可能性があります。また、極端にメモリを消費する場合はプログラムの書き方を見なおしたほうがいいかもしれません。


Similar Posts:




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です