我有将文件从一个已安装的网络共享复制并重命名到另一个(两个 CIFS)的生产脚本,有时该copy函数在读取 I/O 时无限期挂起,使进程进入不间断的睡眠状态,只能用SIGKILL.(谢天谢地,TASK_KILLABLE,显然。)由于操作在copy调用时被阻塞,我无法优雅地处理 I/O 故障,更重要的是,也无法记录它。$res = copy("/path/to/mount/file.pdf", "/path/to/productionqueue/newfile.pdf");//This doesn't run because of the process state.if($res) { //Report success to the log.} else { //Report failure to the log.}这是一个环境,特定于文件的问题,手动干预可以修复它,但我需要记录失败,以便管理员可以了解情况。(旁白:我认为这是一个锁竞争条件。我可以通过卸载和重新安装源共享来解决这个问题,但重现它有点问题。)理想情况下,我希望copy在 10 秒后调用 timeout,这样我就可以记录错误,但 PHP 中似乎没有办法做到这一点。我正在考虑的是将复制或读取操作委托给由timeout命令监控的子进程并根据退出代码进行响应,但是在 PHP 脚本中是否有更简单的方法来处理这种情况?我在搜索中找到的所有内容都表明只有运行时配置可用于套接字/网络超时,而不是文件系统调用。
1 回答
胡子哥哥
TA贡献1825条经验 获得超6个赞
据我所知,答案是否定的 - 没有内置的方法可以使 PHP 中的文件读取操作超时。但是,在 I/O 所在的系统上,您TASK_KILLABLE可以在子进程中执行 I/O 操作并使用timeout -s 9它来终止它。timeout然后 can 将返回一个非零的退出状态。
例如,使用该cp实用程序:
$ssrc = escapeshellarg($src);
$sdst = escapeshellarg($dst);
//10 second timeout, send KILL
exec("timeout -s 9 10 cp $ssrc $sdst 2>&1", $output, $ret);
if($ret != 0) {
log("Failed copying $src to $dst, exit status: $ret");
}
- 1 回答
- 0 关注
- 133 浏览
添加回答
举报
0/150
提交
取消