【问题标题】:Return correct array from closure从闭包返回正确的数组
【发布时间】:2017-04-17 18:19:15
【问题描述】:

我在 Laravel 5.3 上使用带有 SSH 的 LaravelCollective 闭包

但令我惊讶的是,当任何命令尝试 return exit 时,都会得到截断结果。

$exit = array();
SSH::run($cmd, function ($line) use (&$exit) {
    echo $line.PHP_EOL;
    $exit[] = $line; 
});
dd($exit) // dd it's a var_dump + exit helper on Laravel

这段代码返回正确的第一部分(echo $line.PHP_EOL),如下所示

/Volumes/MACBACKUP/cprsync_remote/hq/daily/users/tamainut/home
/Volumes/MACBACKUP/cprsync_remote/hq/daily/users/tamainut/home/daily.0
/Volumes/MACBACKUP/cprsync_remote/hq/daily/users/tamainut/home/daily.0/.appdata
/Volumes/MACBACKUP/cprsync_remote/hq/daily/users/tamainut/home/daily.0/.autorespond
/Volumes/MACBACKUP/cprsync_remote/hq/daily/users/tamainut/home/daily.0/.cpanel
/Volumes/MACBACKUP/cprsync_remote/hq/daily/users/tamainut/home/daily.0/.cphorde
/Volumes/MACBACKUP/cprsync_remote/hq/daily/users/tamainut/home/daily.0/.cpremote
/Volumes/MACBACKUP/cprsync_remote/hq/daily/users/tamainut/home/daily.0/.elinks
... 

数组上的结果错误。 4

array:5 [
  0 => """
    /Volumes/MACBACKUP/cprsync_remote/hq/daily/users/tamainut/home\n
    /Volumes/MACBACKUP/cprsync_remote/hq/daily/users/tamainut/home/daily.0\n
    /Volumes/MACBAC
    ...
    """
  4 => """
    UP/cprsync_remote/hq/daily/users/tamainut/home/daily.8/tmp\n
  /Volumes/MACBACKUP/cprsync_remote/hq/daily/users/tamainut/home/daily.8/updates\n
    /Volumes/MACBACKUP/cprsync_remote/hq/daily/users/tamainut/home/daily.9\n
    /Volumes/MACBACKUP/cprsync_r

我尝试了几个选项,但都可以正常工作。

我不明白为什么我看到完美的回声线,但不能插入数组以供以后工作。

在一些 cmets 之后编辑。

我看到问题是关闭,获取lineof SSH 命令如何使用“\n”字符串。在获得字符串截断的最大大小后,并运行新的闭包迭代。这是问题。

【问题讨论】:

  • 你不是要在最后做dd($exit); 来查看你存储的所有行的完整数组吗?
  • 我只使用 dd 查看 $exit 上的值。
  • 我意识到这一点。但是你的数组是$exit;
  • 好的...抱歉输入错误。问题不是 dd()。 dd() 它是一个帮手。忘记 dd() 并考虑 $exit 的值。
  • 我非常了解dd() 的工作原理。并且需要dd($exit)调试查看$exit的值!

标签: php arrays laravel closures laravelcollective


【解决方案1】:

经过一些测试,我找到了一个解决方案,虽然它看起来不太合适。

问题是 SSH 运行方法返回尽可能多的字符串,用于字节限制,我不知道。

我们不能使用数组,因为数组会包含被截断的元素,所以我认为最好的方法是将行提取为字符串并稍后处理。

如果有人能以最感激的方式回复,

$exit = '';
SSH::run($cmd, function ($line) use (&$exit) {
   $exit = $exit.$line;
});
$arr = explode("\n",$exit);
dd($arr);

显示正确的结果

array:863 [
  0 => "/Volumes/MACBACKUP/cprsync_remote/hq/daily/users/tamainut/home"
  1 => "/Volumes/MACBACKUP/cprsync_remote/hq/daily/users/tamainut/home/daily.0"
  2 => "/Volumes/MACBACKUP/cprsync_remote/hq/daily/users/tamainut/home/daily.0/.appdata"
...

 861 => "/Volumes/MACBACKUP/cprsync_remote/hq/daily/users/tamainut/home/daily.9/updates"
  862 => ""
]

注意字符串的限制(2GB,但memory_limit 施加了其他限制)

【讨论】:

    猜你喜欢
    • 2013-01-16
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多