2014-05-07 183 views
0

我想使用phpseclib庫將文件上傳到sftp服務器。下面是我寫PHPSECLIB調用未定義的函數crypt_random_string()

set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib0.3.5'); 
    $fileName = "sImg3.jpeg"; 
    $fileData = file_get_contents($fileName); 
    $b64Data = base64_encode($fileData); 

    // upload the file to ftp server 
    include('Net/SFTP.php'); 
    include_once('include/config.php'); // contains sftp connection details 

    $sftp = new Net_SFTP($ftpHost); 
    if (!$sftp->login($ftpUser, $ftpPasswd)) 
    { 
     die("Failed to connect to SFTP server"); 
    } 
    else 
    { 
     $sftp->put($filename,$b64Data); 
     echo "Uploaded the file (".$filename.")\n"; 
    } 

當我嘗試運行此代碼,我得到「PHP致命錯誤:調用到/var/www/phpseclib0.3.5/Net/SSH2未定義功能crypt_random_string()第1014行的.php「。

我已經安裝了php5-mcrypt和phpseclib。我是否需要爲phpseclib安裝任何其他依賴項?請告訴我。

感謝很多提前, 問候, Sudheer

回答

0

crypt_string_random在地穴/ Random.php定義:

https://github.com/phpseclib/phpseclib/blob/0.3.5/phpseclib/Crypt/Random.php

但話又說回來Net_SSH2自動包括地穴/ Random.php:

https://github.com/phpseclib/phpseclib/blob/0.3.5/phpseclib/Net/SSH2.php#L749

And Net_SF TP擴展Net_SSH2:

https://github.com/phpseclib/phpseclib/blob/0.3.5/phpseclib/Net/SFTP.php#L253

而且Net_SSH2做了require_once所以如果有什麼你應該得到某種「找不到文件」的錯誤,如果你得到一個錯誤可言,不是一個「功能不定義「錯誤。

+0

感謝您的回覆。是的,我查了你上面提到的代碼。這就是我得到的錯誤!它的'函數未定義'錯誤,而不是'文件未找到'錯誤。真的很困惑,爲什麼我看到函數未定義的錯誤。 – user591912

+0

如果你在net/SSH2.php的'require_once'之前加一個'echo'到目前爲止x1
\ r \ n「'這個x2
\ r \ n」'之後? – neubert

+0

試過了。增加了這個回聲「this far x1
\ r \ n」; (!function_exists('crypt_random_string')){ echo「this far x2
\ r \ n」; require_once('Crypt/Random。PHP'); echo「this far x3
\ r \ n」; } 而且,這裏是我「這麼遠X1輸出
這麼遠X2
這一步X3
PHP致命錯誤:調用到/var/www/phpseclib0.3.5/Net/SSH2未定義功能crypt_random_string() .php on line 1017「 – user591912

0

該問題是由PHP如何處理嵌套包含語句和相對路徑引起的。如果你看一下當前的phpseclib編程,至少包含'some'的包仍然使用include()而不是require_once(),這會失敗 - 這就是爲什麼你看不到失敗包含的錯誤。

這一切都歸結爲PHP如何解決嵌套包含的相對路徑 - 使用父腳本的起始位置或當前/子腳本的起始位置。在PHP中嵌套的難題更多信息包括與相對尋路在這裏:

php nested include behavior

當我遇到了這個問題,我自己,我的工作圍繞它通過促進/ phpseclib出它自己的子文件夾,進入我的現有/包括夾。然後,我只在我的/ includes文件夾中的php腳本中包含phpseclib文件,以便phpseclib的嵌套包含語句中的相對路徑可以工作。