我有将文件从一个已安装的网络共享复制并重命名到另一个(两个 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 脚本中是否有更简单的方法来处理这种情况?
我在搜索中找到的所有内容都表明只有运行时配置可用于套接字/网络超时,而不是文件系统调用。
胡子哥哥