【问题标题】:Execute background php script with shell_exec command that works with SSH使用适用于 SSH 的 shell_exec 命令执行后台 php 脚本
【发布时间】:2022-04-08 20:24:14
【问题描述】:

我挣扎了几个小时的问题是:我想用 PHP 在后台执行一个脚本,所以我使用了 shell_exec() 函数,但我无法让它工作。但这不是与 shell_exec 函数相关的问题,因为我已经测试了 shell_exec('sleep 5') 命令并且它有效。我试图执行的命令是:

shell_exec('nohup /kunden/usr/local/bin/php5.4 /kunden/homepages/XX/dXXXXXXXX/htdocs/myproject/background_script.php > /dev/null 2>&1 & echo $!');

脚本在 MySQL 数据库中插入一行。我已经通过 SSH 和 putty 在引号内测试了完全相同的命令,它运行良好,但我无法从网络浏览器中运行它。

我觉得不重要,但是是和1and1共享的服务器。

【问题讨论】:

  • 你说“我无法让它在我的 php 代码中工作”。发生什么或不发生什么?您收到任何错误消息吗?也许您可以删除命令中的重定向,这样您就不会丢弃程序发出的任何错误消息。
  • 我知道它不起作用,因为没有在数据库中插入行。如果我从浏览器中的 php 回显 shell_exec('...') 返回 pid 号。在最后一次执行 13885 中。我缺少什么吗?

标签: php shell ssh putty shell-exec


【解决方案1】:

根据原海报:

最后我使用了库 phpseclib,现在我可以使用它了。

$ssh = new Net_SSH2('myhosting');
if (!$ssh->login('user', 'pass')) {
    exit('Login Failed');
}

$this->pid = $ssh->exec(sprintf(
    '%s > %s 2>&1 & echo $!',
    $this->command,
    $outputFile
));

【讨论】:

    【解决方案2】:

    它对我有用:

    $connection = ssh2_connect('host', 22);
    ssh2_exec($connection, "screen -dmS 'php-script' /kunden/usr/local/bin/php5.4 /kunden/homepages/XX/dXXXXXXXX/htdocs/myproject/background_script.php 2>&1");
    

    【讨论】: