PHP socket_connect() Разрешение отклонено

80
7

Хорошо, так что у меня есть хороший php-сервер, который открыл AFET-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()", причина: Permission denied " из выражения echo в script. Может быть, есть некоторый небольшой надзор, который я пропускаю? Я предполагаю, что 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 является клиентом сверху.

спросил(а) 2013-08-06T22:06:00+04:00 7 лет, 1 месяц назад
1
Решение
81

Как оказалось, вызовы 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-06T23:04:00+04:00 7 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема