私がやろうとしているのは、ゲームサーバーがオンラインであるかどうかを確認し、そこから情報を取得する単純な PHP スクリプトを実行することです。php_openssl.dll と php_sockets.dll のコメントを外したところ、WAMP サーバーを使用してローカル ボックスでまったく同じスクリプトを実行しています。
しかし、その後、本番環境が登場しました! 私は通常 Debian を使用していますが、ホストは Debian で NIC に障害が発生していたため、CentOS を専用サーバーにインストールすることにしました。
私はいくつかの問題を克服しましたが、この問題が残っています: PHP ソケットを修正するにはどうすればよいですか? 私はphp-commonが必要だと読んだので、これをインストールしました:
# yum install php-common
それから私はチェックphpinfo()
しました、そして私はこれを手に入れました
'./configure' '--with-openssl' '--enable-sockets' ...
あなたが私に尋ねると、これは良さそうに見えます.opensslとソケットの両方がインストールされており、機能しているはずですが、そうではありません. このスクリプトは、Stack Overflow で見つけました。
<?php
//just in case
if (!extension_loaded('sockets')) {
die('The sockets extension is not loaded.');
}
echo '<p><strong>Establishing connection...</strong></p>';
$socket = socket_create(AF_INET,SOCK_STREAM,0);
if (!socket_connect($socket, "stackoverflow.com", 80))
{
die('Socket error : '.socket_strerror(socket_last_error()));
}
echo '<p><strong>Connection successful!</strong></p>';
$request = join("\n",array(
"GET / HTTP/1.1",
"Connection: close",
"Host: stackoverflow.com",
"User-Agent: Mozilla/5.0 (Windows NT 6.1)",
"Accept: text/html,*/*;q=0.8",
""));
socket_write($socket,$request,strlen($request));
$response = socket_read($socket,2048);
echo "<p><strong>This is the received data : </strong></p>";
echo '<pre>'.htmlentities($response).'</pre>';
socket_close($socket);
これが出力するものは私を完全に驚かせます:
Establishing connection...
Connection successful!
This is the received data :
HTTP/1.0 408 Request Time-out
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html><body><h1>408 Request Time-out</h1>
Your browser didn't send a complete request in time.
</body></html>
それでも、私のスクリプトは機能していませんか? :(私はiptablesを無効にしました
# service iptables stop
ファイアウォールの問題ではないことを確認してください。ゲームサーバー名の代わりにページを開くと、次のようになります。
警告: socket_connect(): 接続できません [13]: 9 行目の /var/www/test.php で許可が拒否されました <<<
これは私が使用しているコードです。これは xPaw のオープン ソースなので、信用はしません。
<?php
function queryserver( $IP, $Port = 25565, $Timeout = 2 )
{
$Socket = Socket_Create( AF_INET, SOCK_STREAM, SOL_TCP );
Socket_Set_Option( $Socket, SOL_SOCKET, SO_SNDTIMEO, array( 'sec' => (int)$Timeout, 'usec' => 0 ) );
Socket_Set_Option( $Socket, SOL_SOCKET, SO_RCVTIMEO, array( 'sec' => (int)$Timeout, 'usec' => 0 ) );
if( $Socket === FALSE || Socket_Connect( $Socket, $IP, (int)$Port ) === FALSE )
{
return FALSE;
}
Socket_Send( $Socket, "\xFE\x01", 2, 0 );
$Len = @Socket_Recv( $Socket, $Data, 256, 0 );
Socket_Close( $Socket );
if( $Len < 4 || $Data[ 0 ] !== "\xFF" )
{
return FALSE;
}
$Data = SubStr( $Data, 3 );
$Data = iconv( 'UTF-16BE', 'UTF-8', $Data );
if( $Data[ 1 ] === "\xA7" && $Data[ 2 ] === "\x31" )
{
$Data = Explode( "\x00", $Data );
return Array(
'HostName' => $Data[ 3 ],
'Players' => IntVal( $Data[ 4 ] ),
'MaxPlayers' => IntVal( $Data[ 5 ] ),
'Protocol' => IntVal( $Data[ 1 ] ),
'Version' => $Data[ 2 ]
);
}
$Data = Explode( "\xA7", $Data );
return Array(
'HostName' => SubStr( $Data[ 0 ], 0, -1 ),
'Players' => isset( $Data[ 1 ] ) ? IntVal( $Data[ 1 ] ) : 0,
'MaxPlayers' => isset( $Data[ 2 ] ) ? IntVal( $Data[ 2 ] ) : 0,
'Protocol' => 0,
'Version' => '1.3'
);
}
$test = queryserver('SERVERADDRESSHERE'); // (i tried multiple, which are all working @wamp)
$echo = $test['HostName'] . "<<< <br />";
echo $echo;