2014-04-25 23 views
2

我試圖使用phpseclib的sftp put方法傳輸大型zip文件。低於1 GB的文件傳輸沒有任何問題。但是,在傳輸過程中達到1 GB標記後,較大的文件很快就會失敗。Phpseclib sftp提出用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); 

在我的php.ini中memory_limit的設置爲-1。是否有任何其他PHP設置可能導致此限制?或者phpseclib庫中的任何設置可以幫助?

+1

你在使用32位PHP嗎?你正在試圖分配3.7g的內存。由於各種原因,32位程序可以在一個塊中分配的最多是〜3gig,具體取決於某些操作系統的調整等等。 –

+0

@MarcB這是一個真實的陳述,但不是特別有用。 SFTP處理文件的過程不需要將整個內容一次讀入內存。 –

+1

您使用的是哪種版本的phpseclib? –

回答

4

您正在運行超級舊版本的phpseclib。您所指的1.21/1.46版本通過CVS keyword $Id: $進行填充,並且phpseclib多年未使用CVS。

最後發行版本(而不是單獨的文件提交版本)phpseclib所使用的那些是0.2.1,最後提交該版本是在2010年4月:

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(0.2.2,0.3.0,0.3.1,0.3.5,0.3.6和0.3.7)以來,已有6個版本發佈,因此請嘗試upgrading

+0

升級到最新版本的phpseclib似乎解決了這個問題。 Magento EE 1.11與舊版本打包在一起,所以我只是試圖使用已有的版本。 – brendanmckeown