2016-03-23 3 views
0

У меня есть скрипт, который работает в фоновом режиме и принимает соединения через Unix-сокеты.PHP: Не удается подключиться к сокету из php-fpm

Итак, я написал еще один скрипт, который соединяется с первым.
Я проверил его с CLI, и все работает отлично.
Но когда я пытаюсь использовать свой второй скрипт из Интернета (php-fpm), я получаю исключение No such file or directory.
Это исключение вызывается при вызове функции socket_connect.
Похоже, нет файла сокетов. Но он существует. И я могу подключиться к этому сокету в этот момент с помощью этого скрипта, но только из CLI.

Любые идеи?

UPDATE:
Вот код:

$filepath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'checkerd.sock'; 

$socket = socket_create(AF_UNIX, SOCK_STREAM, null); 
$result = socket_connect($socket, $filepath, 0); 
if ($result === false) { 
    print_r(socket_strerror(socket_last_error())); 
} 
+0

Просьба указать соответствующий код. – CodeCaster

+0

@CodeCaster, какой конкретный код вы хотите увидеть? – seelts

+0

Код, используемый для создания прослушивающего сокета и кода, который вы используете для подключения к указанному сокету. Кроме того, соответствующие настройки конфигурации. Возможно, пользователь, на котором запущен клиент php-fpm, не имеет прав на подключение к прослушивающему сокету Unix, но это только предположение. – CodeCaster

ответ

1

Итак, я нашел ответ:

systemd имеет функцию "частный TMP". Он монтирует/tmp (и/var/tmp) в качестве частной файловой системы для каждого процесса.

Мой сервер сокетов запускался с консоли (от имени php cli). Вот почему я смог подключиться к нему, когда запускаю свой клиент в качестве консольного скрипта. И вот почему тот же скрипт не видел файл сокета, когда он запускался с php-fpm (другой процесс).

Решение отключить личное TMP для PHP-FPM:
Я создал /etc/systemd/system/php-fpm.service.d/private-tmp.conf с содержанием:

[Service] 
PrivateTmp=false 

PHP-FPM должен быть перезапущен после этого.

Смежные вопросы