我最近在Laravel 4.1中一直在使用SSH远程组件和Envoy,我遇到了两个问题。我们有10多台服务器,我正在寻找通过Envoy或Laravel中的SSH组件部署更新。
首先是SSH - 我在app/config/remote.php
内设置了它,并将服务器声明为一个组。作为测试,我想循环遍历每个服务器,只返回主机名,以确保它们都连接好。我可以在app/routes.php
Route::get('/test', function(){
$commands = array(
'hostname'
);
$servers = Config::get('remote.groups.servers');
foreach($servers as $server){
SSH::into($server)->run($commands,function($output){
echo $output.PHP_EOL;
});
}
});
然而,每运行2到3次我运行这个脚本我都会收到错误,虽然在哪个服务器错误方面都没有模式,但每次都不会发生 - 有时候工作正常。
我得到的错误是:
无法连接到192.168.0.1:8899。横幅超时
(其中192.168.0.1是我的服务器IP)
所以,我有一个间歇性的问题,但它足以表示我不能依赖此功能进行可靠的部署,除非我修复它。我对错误进行了一些调查,它来自 phpseclib ,但大多数提到我看到的似乎暗示这已被修复。但是,我在这里感到困惑的是,如果有人,我应该报告此错误。它是phpseclib的问题,还是Laravel的问题,或我的服务器的问题或本地机器的问题(运行Mavericks的新rMPB,但也在运行CentOS 6.4的流浪盒上看到)。
我决定在此之后查看特使,看看这是否会更好。简而言之,我也有类似的问题。我不确定究竟是什么问题因为Envoy似乎在没有显示任何错误的情况下默默地失败但是在envoy上运行的类似脚本(只是为了返回基本类似“ls -l”或“hostname”的输出)有时工作,有时失败 - 我必须按CTRL + C命令停止它。
我认为在引擎盖下Envoy使用相同的SSH代码,因此问题属于两者。
有没有其他人看过这些问题,有人可以推荐我如何解决这个问题吗?
修改
在此之后通过SSH2.php
(在phpseclib内)
if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) {
user_error(rtrim("Cannot connect to $host. Banner timeout"));
return false
}
似乎由于某种原因$read
在发生此问题后将为空 - 它在调用stream_select之前有一个值,但之后为空。成功调用后,将保留该值。不知道那意味着什么!
感谢。