2012-01-15 8 views
1

を与えるのメモリへの書き込み:PHP:カールではなく、この基本的なcurlscipt(PHP)について、ファイルストリーム

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $urltofile); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 

curl_setopt($ch, CURLOPT_BINARYTRANSFER,1); 
curl_exec ($ch); 
curl_close ($ch); 

php.iniの最大メモリ= 64メガバイト

このスクリプトはwithou問題OMサーバ1(PHPを動作します5.2.17 $の$ urltofileは、例えば2ギガバイトの大きさを有していてもurltofile、 しかし、server2の上のものPHP v5.2.17)スクリプトを実行しているとき、私はこのエラーを取得:。(error_logを)

[DATE] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate xxxxxxx bytes) in /home/user/public_html/test.php on line x

それは見ますmsはサーバー2でファイルが出力される前にメモリに完全に書き込まれ、server1はファイルをストリームします。

+2

私はこれが出力バッファリングに関連していると推測しています。具体的には、server1ではなくserver2では有効です。 [こちら](http://php.net/manual/en/outcontrol.configuration.php)、より具体的には[this](http://php.net/manual/en/zlib.configuration.php)を参照してください。 #ini.zlib.output-compression) – DaveRandom

+2

サーバ2ではphp.iniの設定 'output_buffering'や' zlib.output_compression'が有効になっていますが、サーバ1ではできませんか? –

答えて

0

ウェルはですmax_memory_size両方のサーバーで同じですか?また、他のiniの設定はサーバー間で同じですか?

かかわらず、これらのものの、あなたはCURLOPT_BUFFERSIZEを設定することで、PHPのmax_memory_sizeよりも小さいファイルを維持するためにCURLを強制することができるかもしれないが、それでも、私はそれが問題だ疑う...あなたは、リモートを読んでいる場合ファイルを変数に入れると、バッファサイズにかかわらず、PHPはリモートファイル全体を格納しようとするメモリを使い果たします。つまり、メモリを使い果たすバッファではなく、リモートファイルの内容です。

私の賭けは、あなたがCURLOPT_FILEを指定した場合、CURLがバッファ形式でディスクにリモートファイルの内容を書きますし、あなたがmax_memory_sizeを変更せずに、両方のサーバー上のファイルをプルダウンすることができるようになりますです。

EDIT:

にoutput_bufferingがカールして遊びに来る場所私が今見ると、確かにこれはCURLOPT_RETURNTRANSFERがtrueに設定されていない場合場合があります。これは、OPが_ob_start()_ et alを使用しているかどうかを確認するためのものです。どこか。それが本当に有効になっていれば、それが問題の原因になっている可能性があります。 @DaveRandomが示唆しているように、これはserver2の場合の可能性が高いです。

関連する問題