PHP: curl пишет в память вместо того, чтобы выдавать поток файлов - PullRequest
1 голос
/ 15 января 2012

об этом основном 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 max memory = 64MB

этот скрипт работает без проблем с сервером1 (php 5.2.17 $ urltofile, даже когда$ urltofile имеет размер, например, 2 ГБ. Но на server2 также 'php v5.2.17) я получаю эту ошибку при запуске сценария: (error_log)

[DATE] PHP Fatal error: допустимый объем памяти134217728 байт исчерпано (попытался выделить xxxxxxx байт) в /home/user/public_html/test.php в строке x

Похоже, что на сервере 2 файл полностью записывается в память доэто выводится, в то время как server1 передает файл, как и должно быть.

1 Ответ

0 голосов
/ 01 февраля 2012

Что ж, max_memory_size одинаково на обоих серверах? Кроме того, другие параметры ini одинаковы для всех серверов?

Независимо от этих вещей, вы можете заставить CURL поддерживать файл меньшего размера, чем max_memory_size в PHP, установив CURLOPT_BUFFERSIZE , но даже тогда я сомневаюсь, что проблема ... Если вы читаете удаленный файл в переменную, то независимо от размера буфера, PHP будет поглощать память, пытаясь сохранить там весь удаленный файл. Так что не буфер исчерпывает память, а содержимое удаленного файла.

Моя ставка, если вы укажете CURLOPT_FILE , CURL запишет содержимое удаленного файла на диск в буферизованном виде, и вы сможете выгрузить файл на обоих серверах без изменения max_memory_size .

EDIT:

Теперь я вижу, где output_buffering вступит в игру с curl, и, конечно же, это тот случай, если CURLOPT_RETURNTRANSFER не установлен в значение true. Это было бы чем-то, чтобы проверить, использует ли OP _ob_start () _ и др. где-то; но это может быть причиной проблемы, если она действительно включена. Скорее всего, так обстоит дело на сервере server2, как предложил @DaveRandom.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...