【问题标题】:Explicitly timeout file read I/O operation in php in Linux?在 Linux 中的 php 中显式超时文件读取 I/O 操作?
【发布时间】:2019-05-22 16:27:53
【问题描述】:

我有生产脚本,可以将文件从一个已挂载的网络共享复制并重命名到另一个(都是 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 秒后超时,这样我可以记录错误,但 PHP 中似乎没有办法做到这一点。

我正在考虑将复制或读取操作委托给由timeout 命令监控的子进程并根据退出代码进行响应,但是 PHP 脚本中有更简单的方法来处理这种情况吗?

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

【问题讨论】:

    标签: php linux io


    【解决方案1】:

    据我所知,答案是否定的——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");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-10
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多