解決策: PHP ソケットの問題

WBOY
リリース: 2016-06-23 14:00:30
オリジナル
1009 人が閲覧しました

次のテストコードは、appserv を使用してローカルに構築した環境で正しく実行されます。そして、クライアントを使用してそれに接続し、実行することができます。

<?php //Reduce errorserror_reporting(~E_WARNING); //Create a UDP socketif(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0))){    $errorcode = socket_last_error();    $errormsg = socket_strerror($errorcode);         die("Couldn't create socket: [$errorcode] $errormsg \n");} echo "Socket created \n"; // Bind the source addressif( !socket_bind($sock, "localhost" , 9999) ){    $errorcode = socket_last_error();    $errormsg = socket_strerror($errorcode);         die("Could not bind socket : [$errorcode] $errormsg \n");} echo "Socket bind OK \n"; //Do some communication, this loop can handle multiple clientswhile(1){    echo "Waiting for data ... \n";         //Receive some data    $r = socket_recvfrom($sock, $buf, 512, 0, $remote_ip, $remote_port);    echo "$remote_ip : $remote_port -- " . $buf;         //Send back the data to the client    socket_sendto($sock, "OK " . $buf , 100 , 0 , $remote_ip , $remote_port);} socket_close($sock);?>
ログイン後にコピー


しかし、vps に置いた後、ポートが開いていることが表示され、再び開くことができなくなりました (このスクリプトを 2 回目に実行すると、エラー メッセージが返され、ポートが占有されました)。ポートをスキャンしたところ、9999 が実際に開いている UDP ポートであることがわかりました。ただし、クライアントと接続できますが、通信を完了できません (送信していない、受信していない可能性があります...)

以下はphpinfo その結果、ソケットのサポートがオンになっていることがわかります。 (長すぎます。ctr+f で見つかったソケットはすべてここにあります)
Configure Command	 './configure' '--prefix=/usr/local/php5' '--enable-force-cgi-redirect' '--enable-fastcgi' '--with-config-file-path=/usr/local/etc/php5/cgi' '--with-curl=/usr/local/lib' '--with-gd' '--with-gettext' '--with-jpeg-dir=/usr/local/lib' '--with-freetype-dir=/usr/local/lib' '--with-kerberos' '--with-openssl' '--with-mcrypt' '--with-mhash' '--with-mysql=/usr' '--with-mysqli=/usr/bin/mysql_config' '--with-pcre-regex=/usr/local' '--with-pdo-mysql=/usr' '--with-pear' '--with-png-dir=/usr/local/lib' '--with-xsl' '--with-zlib' '--with-zlib-dir=/usr/local/lib' '--enable-zip' '--enable-gd-native-ttf' '--with-iconv=/usr/local' '--enable-bcmath' '--enable-calendar' '--enable-ftp' '--enable-magic-quotes' '--enable-sockets' '--enable-mbstring'
ログイン後にコピー

Registered Stream Socket Transports	tcp, udp, unix, udg, ssl, sslv3, sslv2, tls
ログイン後にコピー

socketsSockets Support	enabled
ログイン後にコピー

default_socket_timeout	60	60
ログイン後にコピー


えー、経験のある方、よろしくお願いします~


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

ポート番号を変更します

一度開いたポートは再度開くことはできません

localhost をサーバー IP に手動で変更し、set_time_limit(2); を追加しました

実行結果は上記と同じです。スキャンにより、ポートが開いていることが示されますが、クライアントは通信できません。

しかし、私はすぐにこれを見ました:

The server encountered an internal error or misconfiguration and was unable to complete your request
ログイン後にコピー


ポート番号を変更します

一度開いたポートは再度開くことはできません
まあ、毎回変更されます。

サーバーで内部エラーまたは構成ミスが発生したため、リクエストを完了できませんでした
サーバーで内部エラーまたは構成ミスが発生したため、リクエストを完了できませんでした

サーバーで内部エラーまたは構成ミスが発生したため、リクエストを完了できませんでした
サーバーで内部エラーまたは構成エラーが発生したため、リクエストを完了できませんでした

何か提案はありますか?たとえば、ログを確認したり、どのように試してみますか?

ファイアウォールか何かを確認してください

9999 は開いているポートですが、他のプログラムによって占有されていますか? 他のプログラムによって占有されていない場合は、ファイアウォールを設定することを検討してください

それ以外の場合は、新しいポートを変更するか、ポート 9999 を占有しているプログラムを閉じるだけです
そのプログラムを別のポートに変更することもできます

つまり、1 つのポートは 1 つのプログラムにのみマッピングできます

さて、最後の試みは無駄でした。 VPS上でも移動できません。それでいいのです。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート