Phpseclib sftp put не хватает памяти с файлами размером более 1 ГБ

Я пытаюсь передать большие zip-файлы, используя метод sftp put phpseclib. Файлы до 1 ГБ или около того передаются без проблем. Тем не менее, файлы большего размера терпят неудачу вскоре после достижения отметки в 1 ГБ во время передачи.

Я получаю эту ошибку PHP:

"PHP Fatal error:  Out of memory (allocated 89653248) 
(tried to allocate 3717163274 bytes) in 
../lib/phpseclib/Net/SSH2.php on line 1553".   

Код:

require_once('phpseclib/Net/SFTP.php');
require_once('phpseclib/Crypt/RSA.php');

$sftp = new Net_SFTP($host);
$key = new Crypt_RSA();
$key->loadKey(file_get_contents($privatekey));
$sftp->login($username, $key);

$sftp->put($remotefile, $localfile, NET_SFTP_LOCAL_FILE);

Параметр memory_limit в моем php.ini установлен на -1. Существуют ли какие-либо другие настройки PHP, которые могут вызывать это ограничение? Или какие-либо настройки в библиотеке phpseclib, которые могут помочь?


person brendanmckeown    schedule 25.04.2014    source источник
comment
Вы используете 32-битный PHP? Вы пытаетесь выделить 3,7 гигабайта оперативной памяти. По разным причинам максимальное количество 32-битных программ, которое может выделить в одном блоке, составляет ~ 3 гигабайта, в зависимости от некоторых настроек ОС и многого другого.   -  person Marc B    schedule 26.04.2014
comment
@MarcB, это верное утверждение, но не особенно полезное. Процесс SFTP-обработки файла не должен сразу считывать все это в память.   -  person nobody    schedule 26.04.2014
comment
Какую версию phpseclib вы используете?   -  person nobody    schedule 26.04.2014
comment
@AndrewMedico: если вы можете придумать причину, по которой скрипту, который может передавать 1 мегабайт за раз (или что-то еще), может потребоваться 3,7 гигабайта оперативной памяти, не стесняйтесь просветить нас.   -  person Marc B    schedule 26.04.2014
comment
Я не думаю, что ему нужно так много памяти, и я уже сказал именно это. Я хочу сказать, что указание 3,7 миллиарда байт = 3,7 ГБ не помогает ОП понять, почему скрипт без необходимости запрашивает так много памяти.   -  person nobody    schedule 26.04.2014
comment
@MarcB - он работает на 64-битном PHP. phpseclib/Net/SFTP.php — это версия 1.21, а phpseclib/Net/SSH2.php — это версия 1.46.   -  person brendanmckeown    schedule 28.04.2014


Ответы (1)


Вы используете очень старую версию phpseclib. Версии 1.21/1.46, на которые вы ссылаетесь, заполняются через ключевое слово CVS $Id: $ и phpseclib уже много лет не использует CVS.

Последняя версия выпуска (в отличие от версии фиксации отдельного файла) phpseclib, в которой они использовались, была 0.2.1, а последняя фиксация для этой версии была в апреле 2010 года:

https://github.com/phpseclib/phpseclib/blob/0.2.1/phpseclib/Net/SFTP.php#L51

Сравните это с выпуском 0.2.2, в котором нет CVS keyword $Id: $ материала:

https://github.com/phpseclib/phpseclib/blob/0.2.2/phpseclib/Net/SFTP.php#L48

В настоящее время phpseclib имеет версию 0.3.7. Начиная с 0.2.1 было выпущено 6 версий (0.2.2, 0.3.0, 0.3.1, 0.3.5, 0.3.6 и 0.3.7), поэтому попробуйте обновление.

person neubert    schedule 28.04.2014
comment
Обновление до последней версии phpseclib, похоже, устранило проблему. Magento EE 1.11 упакован с этой старой версией, поэтому я просто пытался использовать то, что уже было доступно. - person brendanmckeown; 28.04.2014