2011-11-17 46 views
3

我正在運行一個網站,我們正在從一個安裝在Fuse上的文件夾(cloudfuse - Rackspace Cloudfiles容器)提供大量文件,但大部分時間都工作得非常好,但是現在每隔一段時間,保險絲連接就會停止,我所有的Apache進程掛起等待file_exists()函數返回。無論如何設置file_exists或任何其他功能的超時?

我的問題,有無論如何設置特定函數的超時或使用另一個函數來檢查文件是否存在,但如果函數需要超過x秒返回false返回?

回答

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的暫停。你也可以使用系統('/ usr/bin/php /path/to/your/script.php')
-1

你可以使用PHP的set_time_limit來限制「父」腳本的執行時間。 http://php.net/manual/en/function.set-time-limit.php

+2

OP要T用於'file_exists'的IMEOUT,所以這不是一個答案。 – Peter

+1

停止拖動。讓他/她決定是否有助於解決file_exists過於簡單的問題。 – Tim

+2

拖輪?也許你應該讀這個問題,而不是侮辱我? '我的問題是,無論如何設置一個特定函數的超時時間' – Peter

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; 
    } 
    } 

,但我不知道它會爲你工作。

+0

['stream_set_timeout()'](http://php.net/stream_set_timeout)可能會比['ini_set()'] //php.net/ini_set)。 –

+0

謝謝,更新。但如果你想讓我坦白說它只是一個鏡頭。我認爲流/套接字超時只適用於'http://'等,不適用於unix文件系統,所以問題很有趣 – Peter

1

我認爲你可以運行一個腳本來掃描安裝cloudfuse所有文件,
(通常是一個cronjob)

然後存儲結果到存儲(內存緩存,數據庫,等...) ,
後來你的PHP腳本可以對結果

爲了保持掃描結果上最新,
可以附加掛鉤,以更新結果時,文件更新/添加/刪除的

使用
+0

其實這是一個好主意,我們將來肯定會實現。 – anteatersa

相關問題