Laravel Remote / SSH捕获SSH2异常

时间:2014-01-03 18:39:51

标签: php ssh laravel-4 phpseclib

当我尝试使用laravel 4.1的SSH / Remote类部署时,我偶尔会遇到此异常

[2014-01-03 18:26:21] production.ERROR: exception 'ErrorException' with message 'Connection closed by server' in /home/{user}/{location}/deploy/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php:918

我想知道是否有办法检测它是否连接失败以便再次尝试连接或多次?

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

Laravel使用phpseclib作为其SSH库。在连接失败时,phpseclib执行user_error('Connection closed by server');(参见Net / SSH2.php,第〜911行)。 Laravel有一个全局错误处理程序,可以选择并记录它(正如您在问题中看到的那样)。

不幸的是,phpseclib会触发错误,而不是抛出异常。如果它们是例外,您可以为Laravel的错误处理添加新条件:

App::error(function(Exception $exception){
    Log::error($exception);
    if($exception instanceof PHPSecLibException){
         // Let's handle this
    }
});

这绝对是做到这一点的“正确方法”,但这些不是 true 例外(它们是在触发错误时代表您生成的通用Laravel异常)。< / p>

幸运的是,Laravel代表您将错误转换为例外。见src/Illuminate/Exception/Handler.php(行~129-135)。因此,我们可以根据您拥有的信息添加条件:

App::error(function(Exception $exception){
    Log::error($exception);
    if(($exception->getMessage() == "Connection closed by server") &&
        ($exception->getFile() == "/home/{user}/{location}/deploy/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php")){
         // Let's handle this
    }
});

查看可用的Exception methods