无论如何都要为file_exists或任何其他函数设置超时?

时间:2011-11-17 15:59:31

标签: php

我正在运行一个网站,我们从一个安装在Fuse上的文件夹(cloudfuse - 一个Rackspace Cloudfiles容器)提供大量文件,它在大多数情况下工作得非常好但是Fuse连接的所有连接都停止了所有我的Apache进程挂起,等待file_exists()函数返回。

我的问题是,无论如何都要为特定函数设置超时或使用其他函数检查文件是否存在但如果函数花费的时间超过x秒则返回false?

4 个答案:

答案 0 :(得分:2)

我认为file_exists()只是简单的功能,不适用于此类操作。

解决方法#1(相当优雅)

  • 制作正在检查文件存在的批处理文件
  • 使用system()函数执行批处理文件并解析结果

解决方法#2(更简单,根本不优雅)

  • 制作一个脚本file_exists.php?file = ...如果文件$ _GET ['file']存在,则返回字符串“TRUE”或“FALSE”。将此文件中的time_limit设置为1秒。
  • 使用fsockopen('http://localhost/file_exists.php?file ='。$ file,...,...,2)获取结果并解析结果。 (空或FALSE =文件不存在)。 2是fsockopen的超时。您也可以使用system('/ usr / bin / php /path/to/your/script.php')

答案 1 :(得分:1)

你可以试试这个:

  function file_exists_timeout($file, $timeout) {
      // try with both, as i mentioned in comment
      // this is just a shot :( maybe it will works for you
      ini_set('default_socket_timeout', $timeout);
      stream_set_timeout($timeout); 

      $file = fopen($file, 'r');
      if($file) {
          fclose($file);
          return true;
     }else{
          return false;
     }
   }

但我不确定它会对你有用。

答案 2 :(得分:1)

我认为你可以运行一个脚本来扫描挂载的cloudfuse中的所有文件,
(通常是一个cronjob)

然后将结果存储到存储器(memcache,数据库等......),
随后你的PHP脚本可以使用结果

为了使扫描结果保持最新,
您可以使用加载挂钩来更新/添加/删除文件时更新结果

答案 3 :(得分:-1)

您可以使用PHP的set_time_limit来限制“父”脚本的执行时间。 http://php.net/manual/en/function.set-time-limit.php