Linux中php中的显式超时文件读取I/O操作?

我有将文件从一个已安装的网络共享复制并重命名到另一个(两个 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 脚本中是否有更简单的方法来处理这种情况?


我在搜索中找到的所有内容都表明只有运行时配置可用于套接字/网络超时,而不是文件系统调用。


慕斯王
浏览 134回答 1
1回答

胡子哥哥

据我所知,答案是否定的 - 没有内置的方法可以使 PHP 中的文件读取操作超时。但是,在 I/O 所在的系统上,您TASK_KILLABLE可以在子进程中执行 I/O 操作并使用timeout -s 9它来终止它。timeout然后 can 将返回一个非零的退出状态。例如,使用该cp实用程序:$ssrc = escapeshellarg($src);$sdst = escapeshellarg($dst);//10 second timeout, send KILLexec("timeout -s 9 10 cp $ssrc $sdst 2>&1", $output, $ret);if($ret != 0) {  log("Failed copying $src to $dst, exit status: $ret");}
打开App,查看更多内容
随时随地看视频慕课网APP