ホームページ  >  記事  >  バックエンド開発  >  EXE サーバーへの PHP クライアント ソケット接続に関連する問題

EXE サーバーへの PHP クライアント ソケット接続に関連する問題

WBOY
WBOYオリジナル
2016-06-20 12:28:291184ブラウズ

PHP 動作環境: Windows Server 2012 R2 VL (阿里雲 - 青島) + PHP5.4.44 + MYSQL 5.6 + IIS8.5 + URL Rewrite 2.0 + FastCGI
サーバー EXE 動作環境: Windows Server 2012 R2 VL (阿里雲 - QingDao) + E Language 5.3

function send($in){	try{		$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);		socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 5, "usec" => 0));		socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 180, "usec" => 0));		$result = socket_connect($socket, '127.0.0.1', 9999);		$out = "";		socket_write($socket, $in, strlen($in));		$out = socket_read($socket, 10240);		socket_close($socket);		return $out;	}catch(Exception $e){		exit ("<script>alert('ERR::0');</script>");	}}

これは私のコードです。これまでに trycatch ステートメントを追加していなかった場合、訪問者がこのページを開くと、別の訪問者もそうなってしまいます。このページを開くと、2 番目のユーザーが 500 サーバー エラーを報告します。専門家からの投稿を読んだところ、サーバーへの接続の失敗が原因であることがわかりました。接続数を制限せず、最初の接続が 2 番目の接続に接続できない場合はどうすればよいでしょうか。 PHP-CGI.EXE プロセスは同時に 1 つのソケット接続のみを開始できますか?
補足: 最初のユーザーが Web ページを開いてソケットを開始しましたが、処理が完了せず、接続が閉じられなかった場合、2 番目のユーザーがページにアクセスしてソケットを作成した場合、2 番目のユーザーは接続に失敗し、エラーを報告しました。エラー。
すべてのエラーは、socket_connect ステートメントが配置されている行でプロンプト表示されます。


ディスカッション (解決策) への返信

あなたはサーバー側プログラムはどのように起動されるのでしょうか?

すでに例外処理が行われているので、例外情報を隠蔽すべきではありません
エラーが発生した場合は、エラー情報も提供する必要があります
こうすることで、エラーの原因を判断する根拠を得ることができます、 右?

例外情報をエコーするか、socket_strerror(socket_last_error($socket)) を使用してソケットによって生成されたエラーを出力します。

サーバー側プログラムは exe です。もちろん、ダブルクリックするだけです。システムサービスを作成しません。 。 。 PHP から返される例外情報は、5 行目のsocket_connect での予期しないエラーです。接続に失敗し、すべてが予想外でした。 。 。 socket_strerror(socket_last_error($socket)) はどこに配置する必要がありますか?

サーバー プログラムはどのように起動しますか?

すでに例外処理が行われているので、例外情報を隠蔽すべきではありません
エラーが発生した場合は、エラー情報も提供する必要があります
こうすることで、エラーの原因を判断する根拠を得ることができます、 右?

システムサービス項目を書き込まずに、exeファイルをダブルクリックするとサーバー側プログラムが起動します。なお、例外処理は後から追加したものなので無視してください。
function send($in){        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);        socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 5, "usec" => 0));        socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 180, "usec" => 0));        $result = socket_connect($socket, '127.0.0.1', 9999);        $out = "";        socket_write($socket, $in, strlen($in));        $out = socket_read($socket, 10240);        socket_close($socket);        return $out;}

例外情報をエコーすることも、socket_strerror(socket_last_error($socket)) を使用してソケットによって生成されたエラーを出力することもできます

PHP によって返された例外情報は、 5 行目のsocket_connect


例外情報をエコーするか、socket_strerror(socket_last_error($socket)) を使用してソケットによって生成されたエラーを出力します

によって返される例外情報PHP は、socket_connect の 5 行目で予期しないエラーが発生します
if ($result == false)         echo socket_strerror(socket_last_error($socket));

if ($result == false)         echo socket_strerror(socket_last_error($socket));


いいえ、解決されました。ありがとう。


if ($result == false)         echo socket_strerror(socket_last_error($socket));


いえいえ、解決しました。ありがとう。 あなたの経験を共有して、みんなに学んでもらいましょう
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。