【问题标题】:Laravel Remote/SSH catch SSH2 ExceptionLaravel Remote/SSH 捕获 SSH2 异常
【发布时间】:2014-01-06 05:15:25
【问题描述】:

当我尝试使用 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

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

有什么想法吗?

【问题讨论】:

    标签: php ssh laravel-4 phpseclib


    【解决方案1】:

    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
        }
    });
    

    这绝对是“正确的方法”,但这些不是真正的异常(它们是在触发错误时代表您生成的通用 Laravel 异常)。

    幸运的是,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

    【讨论】:

    • 那么考虑到这一点,是否有可能例如如果触发此错误再次尝试连接?
    • @ClarkT。绝对地。我对您的代码库知之甚少,无法告诉您具体如何操作,但如果您仅将 SSH 库用于这一项任务,那么只需在条件 (在我提供的第二个代码 sn-p 中)。
    • 这是您建议的正确实施吗? pastebin.com/XfWhu2iQ
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2017-03-22
    • 2014-12-25
    • 2017-09-11
    相关资源
    最近更新 更多