1

次のphpコードを使用して、phpソケット接続を介してリモートサーバーに接続してリクエストを送信しています。

<?php 
$host    = "X.X.X.X";
$port    = 1234;
$message = "<request>test</request>";
echo "Message To server :".$message;
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
// connect to server
$result = socket_connect($socket, $host, $port) or die("Could not connect to server\n");  
// send string to server
socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n");
// get server response
stream_set_timeout($socket, 10);
$result = socket_read ($socket, 1024) or die("Could not read server response\n");
//echo "Reply From Server  :".$result;
$info = stream_get_meta_data($socket);
if (isset($info['timed_out']) && $info['timed_out'])
{
    echo 'Connection timed out!';
}
else
{
    var_dump($result);
}
// close socket
socket_close($socket);
?>

確認したとおり、リモート マシンはリクエストを受信し、同じセッションで適切なレスポンスを送信しています。しかし、残念ながら、スクリプトを実行すると次の応答が返されます -

504ゲートウェイのタイムアウト。サーバーが時間内に応答しませんでした。

Putty (コードが実行されたのと同じサーバー) から試行すると、ほぼ瞬時に (1 秒未満で) 応答が得られます。

応答をブロックするファイアウォールが実行されていません。すべての VPN トラフィックは、telnet の要求と応答に見られるように、ブロックされることなくトンネルを通過します。

今、このphpスクリプトを介して応答を得られない正確な理由を理解することができません. 多くのチュートリアルとサンプル コードを試しましたが、うまくいきませんでした。:(

会員の皆様、お助けください。

4

3 に答える 3

0

これは時代遅れかもしれませんが、PHPマニュアルのメモには次のように書かれています:

誰かが困惑した場合に備えて、stream_set_timeout は socket_create または socket_accept で作成されたソケットに対しては機能しません。代わりに socket_set_option を使用してください。

それ以外の:

<?php
stream_set_timeout($socket,$sec,$usec);
?>

使用する:

<?php
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec'=>$sec, 'usec'=>$usec));
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec'=>$sec, 'usec'=>$usec));
?>
于 2014-02-28T19:31:59.017 に答える
-1

socket_read の読み取りモードを PHP_NORMAL_READ に設定してみてください

于 2014-04-20T07:22:17.057 に答える