2016-11-10 14 views
2

file_get_content(HTTP URIでない)でローカルファイルにタイムアウトを設定する方法を知りたい場合は、 いつかNFSマウントパーティションが非常に遅く、私はあきらめてしまいがちですまた、私はPHP file_get_contents timeout "ローカルファイル"(NFS /マウント)

$ctx = stream_context_create(array('http'=>array('timeout' => 1200))); 

:アウト時間の後(exemple用5S)、

file_get_contents("/mnt/photo/photo.jpg"); 

私は他の同様の質問に対する回答を読んで、私は解決策は、ローカルファイルに対してHTTPでのみ動作し、ないと思いますこの解決策は私のためではなく、Webのための解決策だと思いますよね?

ini_set('default_socket_timeout', 900); 
+0

fstabにエントリを私たちにmountコマンドを表示、または 'の/ etc/fstab'エントリ –

+0

:192.168.0.167:/dataを/ mnt /写真NFSのデフォルトは0 0 – NicoMinsk

答えて

1

は、あなたはNFSプロトコルオプションが唯一のマウントオプションを介して制御されているようNFSは、PHP経由でタイムアウトを制御することはできません。 PHPはファイルがNFS上にあるのかローカルのハードディスク上にあるのかは分かりません。ファイルがNFS上にあるという事実を判断する方法はありますが、タイムアウトを制御することはできません。

NFSには、マイナーメジャーの2種類のタイムアウトがあります。マイナータイムアウトは、マウントオプション(timeo)で指定されたタイムアウト時間内にサーバーから確認を受信しなかった場合に発生します。その後、操作が再試行され、タイムアウトが2倍になります。タイムアウト間隔が60秒に達すると、大きなタイムアウトが発生します。次に起こることは、他のオプションによって決まります。

デフォルトでは、元のタイムアウトは2倍になり、リトライは無限に続きます。ボリュームがハードマウントされていると言われています(デフォルトではhardオプションがオン)。ボリュームがsoftオプションでマウントされている場合、大きなタイムアウトはI/Oエラーを引き起こします。あなたはソフトマウントを考慮する必要があります。ただし、デフォルトのタイムアウトは(0.7秒)にすぎず、ソフトマウントにはやや小さすぎる可能性があります。可能な待ち時間を見積もり、timeoオプションをそれに応じて調整する必要があります。

さらに興味深いオプションは、intrです。これは、保留中のNFS操作の中断を許可するものです。ただし、このオプションはカーネルバージョン2.6.25以降では非推奨です。 SIGKILLだけがNFS操作を中断することがあります。 fork()関数を使用してウォッチドッグプロセスを実装することができます。子プロセスはNFS操作を実行する可能性があり、一定時間後には親プロセスがkillになることがあります。

+0

ありがとう、この場合私はPHPを使用しています+ apache、forkは利用できません。 PHPソリューションが利用できない場合、マウントパラメータを調べます!ありがとう – NicoMinsk

1

あなたはstream_set_blockingと非ブロッキングモードでストリームを設定し、タイムアウトになるまでファイルを読み込むしようとすることができます。以下のようなもの:私は怖い

function readReallyBigFile($path, $timeoutSeconds = 5) { 
    if (false === $stream = fopen($path, "r")) { 
     throw new \RuntimeException('Cannot open file'); 
    } 

    stream_set_blocking($stream, 0); 

    $timeout = time(); 

    $contents = ''; 
    while (!feof($stream)) { 
     $contents .= fread($stream, 8192); 
     if ((time() > $timeout + $timeoutSeconds)) { 
      throw new \RuntimeException('Timeout reached out'); 
     } 
    } 

    fclose($stream); 

    return $contents; 
} 

$img = readReallyBigFile('/mnt/photo/photo.jpg'); 
+0

良いアイデア、それはいくつかの他の人々を助けることができるが、それ私の場合は問題はないが、問題は大きなファイルと長いファイルが原因ではなく、マウントされていないため(読み込みができないため)、 – NicoMinsk

関連する問題