Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php套接字、Apache和CentOS 6.3拒绝授予权限_Php_Apache_Sockets_Centos_Minecraft - Fatal编程技术网

Php套接字、Apache和CentOS 6.3拒绝授予权限

Php套接字、Apache和CentOS 6.3拒绝授予权限,php,apache,sockets,centos,minecraft,Php,Apache,Sockets,Centos,Minecraft,我试图做的是运行一个简单的PHP脚本,检查游戏服务器是否在线,并从中获取一些信息。我在一个带有WAMP服务器的本地机器上运行了完全相同的脚本,我只是在其中取消了php_openssl.dll和php_sockets.dll的注释,-瞧,它按预期工作 但是接下来是我们的生产环境!我通常和Debian一起工作,但是我们的主机决定在我们的专用服务器上安装CentOS,因为Debian中的NIC出现了故障,从那以后就麻烦不断了 我克服了几个问题,剩下的问题是:如何修复PHP套接字?我读到我需要php c

我试图做的是运行一个简单的PHP脚本,检查游戏服务器是否在线,并从中获取一些信息。我在一个带有WAMP服务器的本地机器上运行了完全相同的脚本,我只是在其中取消了php_openssl.dll和php_sockets.dll的注释,-瞧,它按预期工作

但是接下来是我们的生产环境!我通常和Debian一起工作,但是我们的主机决定在我们的专用服务器上安装CentOS,因为Debian中的NIC出现了故障,从那以后就麻烦不断了

我克服了几个问题,剩下的问题是:如何修复PHP套接字?我读到我需要php common,所以我安装了以下软件:

# yum install php-common
然后我检查了
phpinfo()
,得到了这个

'./configure'  '--with-openssl' '--enable-sockets' ...
因此,如果你问我,这看起来不错,openssl和套接字都已安装,应该可以正常工作,但事实并非如此。我在堆栈溢出上找到此脚本:

<?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);
只是为了确保这不是防火墙问题。当我打开页面而不是游戏服务器名称时,会发生以下情况:


警告:socket_connect():无法连接[13]:第9行的/var/www/test.php中的权限被拒绝请在linuxbox中尝试此命令(以root用户身份)


我也有类似的问题,所以我想我会在这里给下一个遇到这个问题的人一个答案。在不禁用/限制SELinux的情况下,一种方法是更改围绕httpd的策略

希望这能为下一位读者节省2天的时间。哈哈

(代表OP发布)


我找到了答案。似乎SELinux正在阻止套接字连接。使用“#setEnforcePermissive”禁用SE Linux,现在可以正常工作。以防万一有人遇到同样的奇怪情况。

为什么要用插座呢?省省我的时间!哇,你救了我一天
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>
# service iptables stop
<?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;
setsebool -P httpd_can_network_connect 1
chcon -R -t httpd_sys_content_t /var/www
chcon -R -t httpd_sys_content_rw_t /var/www/html