Phpseclib sftp put изчерпва паметта с 1 GB+ файлове

Опитвам се да прехвърля големи zip файлове, като използвам sftp метода put на phpseclib. Файлове под 1 GB или повече се прехвърлят без проблем. Въпреки това, по-големите файлове се провалят скоро след достигане на знака от 1 GB по време на прехвърляне.

Получавам тази 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 гигабайта RAM, не се колебайте да ни просветите.   -  person Marc B    schedule 26.04.2014
comment
Не мисля, че трябва да се нуждае от толкова много памет и вече казах точно това. Искам да кажа, че посочването на 3,7 милиарда байта = 3,7 GB не помага на OP да разбере защо скриптът ненужно иска толкова много памет.   -  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. Има 6 издания на версия след 0.2.1 (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