2017-08-14 19 views
0

Blobフィールドを持つテーブルがあります。ときには、このデータの概要ページ(すべてのデータを表示する、バックエンドの通常のSELECT *ステートメント)を読み込むと、メモリ不足のエラーが発生することがあります - 最新のものが以下に示されています(複数の行に分かれています):Doctrine Blob型のメモリ不足エラー

それはDoctrineのライブラリにを参照
request.Critical: Uncaught PHP Exception 
Symfony\Component\Debug\Exception\OutOfMemoryException: "Error: Allowed memory size of 
134217728 bytes exhausted)tried to allocate 1679360 bytes)" at /var/www/html/my_project/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/BlobType.php 
line 50 ("exception":"[object] 
(Symfony\\Component\\Debug\\Exception\\OutOfMemoryException(code: 0): Error: Allowed memory 
size of 134217728 bytes exhausted (tried to allocate 1679360 bytes) at /var/www/html/my_project/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/BlobType.php:50)") 
[] 

ライン50は、私はこれに対処するにはどうすればよい

48. if (is_string($value)) { 
49. $fp = fopen('php://temp', 'rb+'); 
50. fwrite($fp, $value); // Exception occurs here 
51. fseek($fp, 0); 
52. $value = $fp; 
53. } 

のですか?私はまったく同じ問題をオンラインで見つけられませんでした。 fwriteで発生するメモリ不足の例外に関するその他の問題は、ストリームを使用してデータを書き込むことについて話していますが、これはDoctrineライブラリを迷惑にしてしまいます。他の解決策は、php.iniのメモリ制限を引き上げることを提案しますが、これは一時的な解決策ではありませんか?すべてのアイデアは役に立ちます

+0

BLOBとして保存するのは何ですか? – svgrafov

+0

@svgrafovこれはPDFです。レコードを1つ追加する必要があります(ただし、レコードにはレコードが1つもありませんが、その場合はnullです)。 – Kvothe

+0

@svgrafov私は実際には、これらをファイルストレージに移動することについて考えるべきだと思います。現在、私はEC2インスタンス上で実行されているWebサーバーを持っており、データベースはオーロラRDSインスタンスです。この設定にS3ストレージバケットを追加して、そこからPDFを配信しますか? – Kvothe

答えて

0

問題はSELECT *です。私はあなたがすべてのテーブルを必要とすることを非常に疑う。そのデータをチャンクで表示します。 ページネーションが役立ちます。

UPD ページングよりも優れたアイデア - ファイルとしてファイルを扱います。つまり、それらをファイルとして保存することを意味します。エンティティにはファイル名(またはその他の識別子)のみを保持します。

+0

私はそれをやろうと考えていました。ページネーションを使う時間にする必要があります。しかし、それが時折起こるのはなぜ? – Kvothe