phpSpreadsheetでのエクセル生成を実装しています。
composerインストール、phpSpreadsheetインストールは完了しています。
エクセルを生成しようとすると、下記エラーが発生します。
<b>Fatal error</b>: Out of memory (allocated 8388608) (tried to allocate 16777248 bytes) in <b>/home/account_name/bin/vendor/maennchen/zipstream-php/src/File.php</b> on line <b>332</b><br />
このエラーメッセージ "Fatal error: Out of memory (allocated 8388608) (tried to allocate 16777248 bytes)" は、PHPスクリプトがメモリ不足に陥ったことを示しています。具体的には、8,388,608バイト(8MB)のメモリしか割り当てられていませんが、16,777,248バイト(16MB)を割り当てようとしています。このエラーは、maennchen/zipstream-php
ライブラリのFile.php
ファイルの332行目で発生しています。
対策としてphp.iniをコントロールパネルで編集して、memory_limitの割り当てを増やしました。が、結果は変わりません。
対処法としてなにが考えられるでしょうか。お力添えくださいませ。
ご指摘のプログラムをいずれも使っていないため、あくまで一般的な、漠然とした回答ですが。
サーバーパネルの「php.ini」の設定値について、「512M」や「1G」ぐらいにする。
※無制限とか極端に多い数字とかにするとサーバー側で制限されるかもしれないので、ある程度現実的な数字に。
「1G」はドメイン設定を追加したときの初期値で、利用サーバーによるかもしれませんがおそらく問題ない数字のはずです。
↓
サーバーパネルからphp.iniを変更した結果が適切に反映されているか、phpinfoで確認する
↓
phpinfoの結果が適切に反映されている場合、プログラムの中でmemory_limitを動的に書き換えていないかをチェックする
↓
memory_limit以外にも、composer_memory_limitのような「そのプログラムだけで通用する設定」を作っていないか、チェックする
あたりができそうなことでしょうか。
最近だとエックスサーバーでドメイン設定を追加したときのmemory_limitの初期値は「1G」で、それが質問にあるような「8M」で制限されているのであれば、ini_set で書き換えているんじゃないかと思いますが…どうでしょうか。
解説ありがとうございます!
自己解決しましたので、共有させていただきます。
当該サイトはサブドメインを使用しているのですが、
本ドメイン→PHP7
サブドメイン→PHP8
という構成になっています。本ドメインはPHP7でしか動かないCMSで構築されており、PHP8に統一することができなかったという背景です。
エックスサーバーでは本ドメインとサブドメインで別のPHPを使う場合、一方をcgi版にする必要があります。cgi版PHPはユーザーが変更可能なphp.iniとは別のファイルを参照しているようで、当方が編集していたphp.iniとは別のものでした。
今回はサブドメインを諦め、別ドメインでの運用に切り替えました。
同様の事象で困っている方の参考になれば幸いです。