私の PHP アプリケーションでは、Postmarks のインバウンド フックを使用してメールを受信します。このサービスはメールを受信し、JSON エンコードされたメールをサーバー上の URL に送信します。これは正常に機能します。
私が抱えている問題は、メールに 10MB を超える添付ファイルがある場合です。
その結果、
PHP 致命的なエラー: 104857600 バイトの許容メモリ サイズを使い果たしました (1821693 バイトを割り当てようとしました)
私がこの行でやっていることは次のとおりです。
$in = json_decode(file_get_contents("php://input"));
2 つの質問があります。
- これをよりメモリ効率的に行う方法はありますか?
- メモリ制限が実際には 100MB であるのに、10MB のメールで失敗するのはなぜですか? Base64 + JSON エンコーディングでは、元のサイズの 10 倍のオーバーヘッドが発生しますか?
memory_get_usage() でデバッグした後に編集します。
Script start
47MB memory usage.
$in = file_get_contents("php://input");
63MB memory usage.
json_decode($in);
PHP terminates, due to memory size exhausted.
興味深いことに、コマンドを発行せずに、スクリプトが既に 47MB のメモリ使用量で開始されています。これは入力データが大きいためだと思いますか?たぶん、PHP が $HTTP_RAW_POST_DATA に保存するためでしょうか?
PHP がより少ない変数を作成できるようにするために使用できる php.ini ディレクティブはありますか?