You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

后台执行exec(scp)未发现速度差异问题求助

PHP exec执行scp异步复制无时间差异的原因及解决方法

问题本质

你当前的写法不管加不加2>&1 > out.log,都没有实现异步复制——exec会同步等待每个scp命令执行完毕才会继续下一个,所以总时间始终是10个scp串行执行的总和,自然看不到时间差异。

2>&1 > out.log只是把命令的标准错误和标准输出重定向到日志文件,并没有让scp进程后台运行,对执行模式(串行/并行)没有影响。

实现真正异步的方法

要让多个scp并行执行,必须在每个命令末尾加上&,让进程在后台运行,这样exec会立即返回,不用等待scp完成,多个复制任务就能同时进行。同时要处理输出重定向,避免因输出缓冲区满导致进程挂起。

修改后的PHP代码示例:

// 每个scp命令单独用不同的日志文件,避免内容覆盖
exec("scp -o StrictHostKeyChecking=accept-new -i /var/keys/devDevices_rsa MarTianez1.mp4 awong@10.1.1.16:/tmp/test1 > /tmp/scp_task1.log 2>&1 &", $output, $exitCode);
exec("scp -o StrictHostKeyChecking=accept-new -i /var/keys/devDevices_rsa MarTianez2.mp4 awong@10.1.1.16:/tmp/test2 > /tmp/scp_task2.log 2>&1 &", $output, $exitCode);
// ... 依次处理剩下8个文件

如果不需要保留日志,可以把输出直接丢弃:

exec("scp -o StrictHostKeyChecking=accept-new -i /var/keys/devDevices_rsa MarTianez1.mp4 awong@10.1.1.16:/tmp/test1 > /dev/null 2>&1 &", $output, $exitCode);

额外注意事项

  • 确保Apache运行用户(通常是www-data)拥有:源视频文件的读取权限、密钥文件/var/keys/devDevices_rsa的读取权限,以及目标服务器10.1.1.16上/tmp目录的写入权限。
  • 如果需要确保复制任务不受Apache进程重启影响,可以在命令前加上nohup:
    exec("nohup scp -o StrictHostKeyChecking=accept-new -i /var/keys/devDevices_rsa MarTianez1.mp4 awong@10.1.1.16:/tmp/test1 > /tmp/scp_task1.log 2>&1 &", $output, $exitCode);
    

内容的提问来源于stack exchange,提问作者tirenweb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 09:57:27