簡體   English   中英

Php套接字,Apache和CentOS 6.3給出了權限被拒絕

[英]Php sockets, Apache and CentOS 6.3 gives Permission denied

我想要做的是運行一個簡單的PHP腳本,檢查游戲服務器是否在線並從中獲取一些信息。 我在WAMP服務器的本地機器上運行完全相同的腳本,我只是取消注釋php_openssl.dll和php_sockets.dll,並且 - 瞧 - 它按預期工作。

但后來我們的生產環境! 我通常和Debian一起工​​作,但是我們的主機決定在我們的專用服務器上安裝CentOS,因為NIC在Debian中失敗了,而且這只是麻煩了。

我克服了一些問題,並留下了這個問題:如何修復PHP套接字? 我讀到我需要php-common,所以我安裝了這個:

# yum install php-common

然后我檢查了phpinfo() ,我得到了這個

'./configure'  '--with-openssl' '--enable-sockets' ...

所以如果你問我這個看起來很好,openssl和socket都已安裝並且應該正常工作,但事實並非如此。 我在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;

在linuxbox中嘗試此命令(以root身份)。

setsebool -P httpd_can_network_connect 1

我有類似的問題,所以我想我也會在這里找到答案的下一個人。 在不禁用/限制SELinux的情況下實現它的方法是更改​​httpd周圍的策略。

希望這為下一個閱讀此內容的人節省2天。 大聲笑

chcon -R -t httpd_sys_content_t /var/www
chcon -R -t httpd_sys_content_rw_t /var/www/html

(代表OP發布)。

我找到了答案。 似乎SELinux正在阻止套接字連接。 使用'#setenforce Permissive'禁用SE Linux,現在可以使用了。 以防任何人遇到同樣的陌生感。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM