PHPの気を付けたいところ

ファイルの中身を配列として読み込む file という便利関数があるんですが、
これにはちょっと使い時があります。

PHP には memory_limit という設定があり、この設定値を超えると
処理が出来ないため、エラーになってしまいます。

実は file 関数とこの設定値は結構リンクしていて、memory_limit?をバケツに例えると
バケツに対してバケツの容量以下の水を扱うには良いのですが、
バケツに対して、25mプール一杯の水を注ごうとするとあふれてしまうのと同じように下記のエラーになってしまいます。
Allowed memory size of xxx bytes exhausted (tried to allocate xxx bytes)

つまり、あまりにも大きいデータを読み込む時に file 関数は向いていないのです。

こういった場合、どうしたらいいのか?
答えは簡単で、 fopen でファイルを開いて fgets すれば良いだけです。

fopen はファイルポインタですから、使用した時点ではファイルの内容は読み込みません。
fgets を使用してはじめて読み込むわけですが、 ?fgets は指定バイト数もしくはEOFまでの読み込みであり、
巨大なデータでも行端で切り刻んで読み込むことが出来るため、前述のようなエラーにはならなかったりします。

file_get_contents も file と同じようなものと考えて組んでいかないと変なところでエラーが出てしまうので、
使い所には注意するべきですね。

あと、 PHP は一度スカラー変数として定義したものは、スカラー変数としてしか使えないので、

<?
$hoge = 1234;

$hoge[0] = 5678;
?>

というようなものを書くと?Cannot use a scalar value as an array というエラーになりますよん。

フォローする