2014-05-07 142 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的嵌套包含语句中的相对路径可以工作。