我基本上已经不再使用 SSH2 和 PHP 了。有些人可能已经发现,在使用时,PHP 代码实际上会等待 SSH 中列出的所有命令执行完毕,然后当所有命令完成后,它才会返回结果。这对于我所做的工作来说没问题,但我需要一些命令是多线程的。
$cmd= MyCommand; 回显 $ssh->exec($cmd);
所以我只想让它并行运行 2 次。我在 Google 上搜索了一些东西,但没有找到。对于一个基本的东西,我偶然发现了有人发布的这种方法,但对我来说不起作用。
for ($i = 0; $i < 2; $i += 1)
{
exec("php test_1.php $i > test.txt &");
//this will execute test_1.php and will leave this process executing in the background and will go to next iteration of the loop immediately without waiting the completion of the script in the test_1.php , $i is passed as argument .
}
我试着这样说exec("echo $ssh->exec($cmd) $i > test.txt &"); 在循环中,但它从未进入循环,或者 echo $ssh->exec 失败。我真的不需要非常整洁的多线程。即使是一秒钟的延迟也很好,谢谢。
答案1
...除了执行系统命令与 PHP 关系不大之外,是的,在没有任何进一步准备的情况下执行系统命令将导致调用者等待命令完成。
传统上,人们使用 fork() 来做这种事。
答案2
我发现 ServerFault 上的另一个用户发布了这个帖子,但这基本上不作为多线程。我的 $cmd3 exec 命令基本上会在 10 秒后自动关闭,这些命令会运行 30 秒,而且无论如何都不是同时运行的。
$i=0;
while($i < 3)
{
$pid = pcntl_fork();
if($pid == -1)
{
echo "Couldn't fork process";
exit(1);
}
else
{
if($pid)
{
pcntl_wait($status);
}
else
{
echo $ssh->exec($cmd3);
}
}
$i++;
}