0

redis データベースの PHP db ラッパーを変更しています。

私の関数は次のようになります。

public function connect() {

    $sock = @fsockopen('localhost', '6379',  $errno, $errstr, 2);

    if ($sock === FALSE) {
        return FALSE;
    }
    else {
        stream_set_timeout($sock, 2); 
        return $sock;
    }
}

私がしたいことは、ラッパーの別の部分からこの関数を呼び出すことです:

 if ($this->connect() !== FALSE) {
      // Do stuff
 }

fsockopen が機能していないときに接続関数が FALSE を送信するようにするにはどうすればよいですか?

ありがとう!

4

4 に答える 4

3

ページの少し下からfsockopen()(ほぼ一番下までスクロールする必要があります):

リモート ホストに到達できない場合でも、UDP ソケットがエラーなしで開いているように見えることがあります。エラーは、ソケットとの間でデータを読み書きするときにのみ明らかになります。これは、UDP が「コネクションレス」プロトコルであるためです。つまり、オペレーティング システムは、実際にデータを送受信する必要があるまで、ソケットのリンクを確立しようとしません。

それがあなたの問題だと思います。本当に成功したかどうかを確認するには、読み取り/書き込みのテストを行う必要があると思います。

于 2010-05-20T18:20:17.153 に答える
1

次のコードを試して、これが意図したとおりに機能するかどうかを確認してください。

public function connect()
{
    $sock = @fsockopen('localhost', '6379',  $errno, $errstr, 2);

    if (!is_resource($sock))
        return FALSE;

    stream_set_timeout($sock, 2); 
    return $sock;
}
于 2010-05-20T18:27:37.340 に答える
0

回答が遅くなる可能性があることは承知しています。しかし、 fsockopen は「localhost」にちょっと問題があります..「127.0.0.1」nimを使用してみて、接続できることを確認してください。;)

于 2010-10-16T17:40:51.660 に答える
0
@fsockopen

関数の前に @ があり、エラーを抑制します。エラーが原因でゼロ リターンが発生している場合は、何も得られません。@ を削除し、結果のエラーまたは警告をログに記録または表示します。

于 2010-05-20T18:00:59.010 に答える