PHP socket_connect () Отказано в доступе

Итак, у меня есть хороший работающий 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 через веб-страницу, клиент возвращает "socket_connect() failed, причина: Отказано в доступе" из инструкции эха в скрипте. Может быть, я упускаю из виду какую-то маленькую оплошность? Я предполагаю, что Ajax вызывается через httpd (apache). Я уверен, что это, вероятно, какой-то тип прав доступа к файлам, но я не могу точно понять, что вызывает это.

Вещи, которые я пробовал до сих пор,

Убедился, что safe_mode отключен в php.ini, попробовал «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 — клиент сверху.


person Drew Mangus    schedule 06.08.2013    source источник
comment
На данный момент не было времени прочитать полный вопрос, но первое, что приходит на ум, это ограничение одного и того же происхождения. (Я удалю это позже, если буду далеко.)   -  person TecBrat    schedule 06.08.2013
comment
@TecBrat - я взглянул на политику того же происхождения, но я не слишком уверен, что она применима здесь, я могу сильно ошибаться, но кажется, что политика предназначена для получения данных из других источников в Интернете. Моя проблема связана с подключением двух php-скриптов, работающих на одном сервере? --Ввод этого привел меня к ответу, поэтому я благодарю вас любезно.   -  person Drew Mangus    schedule 06.08.2013
comment
Как я уже сказал, раньше я торопился и не прочитал весь вопрос, но я рад, что это все равно привело вас к хорошему ответу.   -  person TecBrat    schedule 07.08.2013


Ответы (1)


Как оказалось, вызовы 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);

Это достаточно хорошая работа для меня, я думаю, что это неправильный способ сделать это. Если у кого-то есть лучшее предложение или лучшая практика, которую вы бы порекомендовали, я хотел бы ее услышать.

person Drew Mangus    schedule 06.08.2013
comment
В качестве примечания для других, кто просматривает это, это устранило проблему, пока setenforce 0 был на месте для SELinux, я все еще пытаюсь исправить проблему SELinux, которая отказывает мне в разрешении на это. - person Drew Mangus; 07.08.2013
comment
Что я исправил с помощью wiki.centos.org/HowTos/SELinux, используя номер 7 в их списке. . который использует audit2allow ^_^ - person Drew Mangus; 07.08.2013