后台执行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
相关产品推荐
相关产品推荐

