【问题标题】:PHP background job stops when calling php script ends调用 php 脚本结束时 PHP 后台作业停止
【发布时间】:2012-11-22 09:09:31
【问题描述】:

在 LAMP 盒子上,我通过 PHP 的 exec 函数循环调用 SCP 复制函数,将多个图像复制到远程服务器:

exec("scp ".$this->GetUploadPath(true)." ".$currentServer->Scp.":".$this->GetServerPath($currentServer, true));

结果:工作正常,但 PHP 脚本需要几秒钟才能完成。

但是我不希望 PHP 脚本等待 SCP 作业完成,所以我尝试了以下方法之一:

exec("nohup scp ".$this->GetUploadPath(true)." ".$currentServer->Scp.":".$this->GetServerPath($currentServer, true) . " 1>/dev/null/ 2>&1 &");

结果:PHP 脚本要快得多,但 SCP 尚未完成。图像不会复制到远程服务器。

exec("nohup scp ".$this->GetUploadPath(true)." ".$currentServer->Scp.":".$this->GetServerPath($currentServer, true) . " &");

结果:图像被复制,但是 php 脚本运行时间没有改善,所以我猜 php 脚本仍然等待 SCP 例程完成,尽管我“后台”调用。

任何想法如何实现它,PHP 脚本不等待,但 SCP 过程已完成?

提前谢谢你!

【问题讨论】:

  • 您是否尝试过将 SCP 命令的输出通过管道传输到日志文件中,这可能包含有关 SCP 失败原因的一些信息?
  • 是的,我做到了。里面什么都没有。我发现的一个错误是我删除本地文件太快了。但是我将删除功能注释掉了,但是现在复制了 10 个图像中的 4 个。错误和输出日志保持为空。
  • 这是一个有根据的猜测,但请尝试 ignore_user_abort(true);可能是它看到客户端断开连接并结束脚本及其子进程。
  • 现在它正在上传一些文件,而另一些则没有。我得到的错误信息是:“ssh_exchange_identification: Connection closed by remote host lost connection”
  • 离开 nohup 似乎效果更好。

标签: php linux scp


【解决方案1】:

超过与服务器的最大同时连接数可能是问题所在。所以限制同时连接或简单地一一上传。如果在浏览器之前等待是您的问题,您可以将以下内容添加到您的 php 脚本中

ignore_user_abort(true);
set_time_limit(0);

并使用以下循环上传

exec("scp ".$this->GetUploadPath(true)." ".$currentServer->Scp.":".$this->GetServerPath($currentServer, true) . " 1>/dev/null/ 2>&1");

从你的浏览器触发php脚本后,你甚至可以关闭浏览器,上面的代码会为你做魔法。

【讨论】:

    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    相关资源
    最近更新 更多