4

好的,所以我运行了一个不错的 php 服务器,它使用我编写的这个小函数打开了一个 AF_UNIX 套接字。像这样被调用

$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_connect() failed, reason: Permission denied” . 也许我缺少一些小疏忽?我假设 Ajax 是通过 httpd (apache) 调用的。我确定这可能是某种类型的文件权限问题,但我无法弄清楚究竟是什么原因造成的。

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

确保在 php.ini 中关闭了 safe_mode,尝试了“setsebool -P httpd_can_network_connect on”来阻止 SElinux,还尝试了“setenforce 0”,这也没有任何区别。我尝试将 /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 是上面的客户端。

4

1 回答 1

0

事实证明,ajax 调用是以 apache 用户身份运行的,并且从我的服务器为套接字创建的文件归 root 所有。我通过将这几行代码添加到我调用 socket_create() 的服务器来解决此问题。

#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);

这对我来说是一个足够好的工作,我想这不是解决这个问题的正确方法。如果有人有更好的建议或更好的做法,你会推荐我想听听。

于 2013-08-06T20:04:02.733 回答