PHP套接字连接()权限被拒绝

PHP套接字连接()权限被拒绝,php,ajax,sockets,ipc,selinux,Php,Ajax,Sockets,Ipc,Selinux,好的,我已经运行了一个很好的php服务器,它使用我编写的这个小函数打开了一个AF_UNIX socet。被这样称呼 $IPC_connector = socket_create_IPC('/tmp/connection'); function socket_create_IPC($FILE) { #Create a AF_UNIX socket if(!($socket = socket_create(AF_UNIX, SOCK_STREAM, 0))) {

好的,我已经运行了一个很好的php服务器,它使用我编写的这个小函数打开了一个AF_UNIX socet。被这样称呼

$IPC_connector = socket_create_IPC('/tmp/connection');


function socket_create_IPC($FILE)
{
    #Create a AF_UNIX socket
    if(!($socket = socket_create(AF_UNIX, SOCK_STREAM, 0)))
    {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);

        die("Couldn't create socket: [$errorcode] $errormsg \n");
    }

    #Bind
    if( !socket_bind($socket, $FILE) )
    {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);

        die("Could not bind socket : [$errorcode] $errormsg \n");
    }

    if(socket_listen($socket) === false) 
    {
        die("socket_listen() failed: reason: " . socket_strerror(socket_last_error($socket)) . "\n");
    }

    socket_set_nonblock($socket);

    return $socket;
}
然后我编写了一个客户端,它像这样连接到这个服务器

if(!($IPC = socket_create(AF_UNIX, SOCK_STREAM, 0)))
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Error:Couldn't create socket - [$errorcode] $errormsg \n");
}
echo "socket_create(): ".socket_strerror(socket_last_error($IPC))."\n";

if(!(socket_connect($IPC, '/tmp/connection')))
    echo "socket_connect() failed, reason: ".socket_strerror(socket_last_error($IPC))."\n";
客户机实际上从一个网页的AJAX请求中得到调用,它应该在该网页中连接到服务器,获取一些数据,然后将这些数据返回到该网页。ajax请求是用javascript发出的我已经在没有AJAX请求的情况下测试了客户机/服务器连接,它可以正常工作,但是当我通过网页尝试使用AJAX时,客户机会从脚本中的echo语句返回“socket\u connect()失败,原因:权限被拒绝”。也许我遗漏了一些小疏忽?我假设Ajax是通过httpd(apache)调用的。我肯定这可能是某种类型的文件权限问题,但我不知道到底是什么原因造成的

到目前为止我尝试过的事情

确保php.ini中的安全模式已关闭, 尝试“setsebool-P httpd_can_network_connect on”来阻止SElinux, 还尝试了“setEnforce0”,这也没有什么区别。 我尝试将/tmp和所有子目录的文件权限更改为777,但没有成功。 我已经没有主意了,我想也许有人以前见过这个问题, 我还查看了这个,这是我的服务器正在创建的文件->

[root@ip-000-000-000-000 tmp]# ls -lZa connection
srwxr-xr-x. root root unconfined_u:object_r:user_tmp_t:s0 connection
如果有人对AJAX调用感兴趣,我会使用这个

function communication (IP, MechanismID, CommandName) {
    $.post('php/connectDisconnect.php', {
        IP : IP,
        MechanismID : MechanismID,
        CommandName : CommandName
        }, 
        function(data) {
            if(data.search("Error") != -1)
                alert(data);
    });
}

其中connectDisconnect.php是上面的客户机。

事实证明,ajax调用是以apache用户的身份运行的,从我的服务器为套接字创建的文件是由root所有的。我将这两行代码添加到我的服务器中,在那里我调用了socket_create()


这对我来说已经足够好了,我想这不是正确的方法。如果有人有更好的建议或更好的做法,你会推荐我想听

当时没有时间阅读完整的Q,但首先想到的是同源限制。(如果我离开的话,我稍后会删除它。)@TecBrat——我看了一下“同源策略”,但我不太确定它是否适用于这里,我可能会大错特错,但似乎该策略是用于从web上的其他地方获取数据的。我的问题是连接在同一台服务器上运行的两个php脚本--尽管如此,我还是很感谢你。正如我所说,我之前很匆忙,没有阅读整个问题,但我很高兴这让你得到了一个好的答案。作为对其他人的提醒,这解决了这个问题,只要SELinux设置了set0,我仍在试图修复SELinux问题,该问题拒绝了我对此的许可。我通过使用他们列表中的数字7修复了该问题。哪个使用audit2allow^_^
#Deletes the old pipe in case the server crashed last time it closed and didn't use socket_close()
$command = "rm -f /tmp/connection";
exec($command);

#Creates the data pipe for the webpage to connect to
$IPC_connector = socket_create_IPC('/tmp/connection');

#Makes it to where the webpage can actually talk to the server
$command = "chown apache:apache /tmp/connection";
exec($command);