то на чем все : vds ubuntu server 16.04, nginx+php7.0-fpm При вызове функции socket_bind или socket_create_server используя unix-сокеты, постоянно вылетают ошибки(permission denided, already in use, unknown error) Например: Код (Text): FastCGI sent in stderr: "PHP message: PHP Warning: stream_socket_server(): unable to connect to unix:///var/run/php-fpm.sock: (Unknown error) in /usr/share/nginx/html/index.php on line 2" while reading response header from upstream, client: xxx.xx.xxx.xx, server: xx.xx.xx.xx, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm.sock:", host: "xx.xxx.xx.xx" Код (Text): FastCGI sent in stderr: "PHP message: PHP Warning: socket_bind(): unable to bind address [98]: Address already in use Эту ошибку дает вот этот код: Код (Text): server.php <?php error_reporting(E_ALL); $address = '/run/php/php7.0-fpm.sock'; echo "Start"; //unlink($address); $sock = socket_create(AF_UNIX, SOCK_STREAM, 0); if (!is_resource($sock)) { echo 'Не могу создать сокет: '. socket_strerror(socket_last_error()) . PHP_EOL; } if (!socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) { echo 'Unable to set option on socket: '. socket_strerror(socket_last_error()) . PHP_EOL; } if (!socket_bind($sock, $address)) { echo 'Не могу привязать сокет: '. socket_strerror(socket_last_error()) . PHP_EOL; } socket_close($sock); ?> Со следующим кодом ошибка будет 0(unknown error) Код (Text): <?php $address = 'unix:/run/php/php7.0-fpm.sock'; $socket = stream_socket_server($address, $errno, $errstr); if (!$socket) { echo "$errstr ($errno)<br />\n"; } else { while ($conn = stream_socket_accept($socket)) { fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n"); fclose($conn); } fclose($socket); } ?> В строке Код (Text): $address = 'unix:/run/php/php7.0-fpm.sock'; пробовал разные вариации.. unix:///run/php/php7.0-fpm.sock /run/php/php7.0-fpm.sock Сокет по сути уже существует(nginx+php7.0-fpm его создали). Права доступа проверял. Может я его не правильно подключаю? Тупик! В общем нужна помощь!
А что ты пытаешься сделать-то? Создать пхп-сокет-сервер, который будет принимать запросы на том же сокете, что и пхп-машина? Смени адрес сокета тогда на какой-нибудь свой уникальный.
Интересная логика. Пхп-машина запущена, слушает подключения на определенном сокете. Твой скрипт создает свой сокет-сервер и пытается этот же сокет забиндить. Внимание вопрос: как машина должна понять к какому процессу отправить запрос, когда кто-то этот сокет почешет? Сокет это уникальный адрес, связанный с процессом. Создаешь новый процесс - будь добр не нарушать адресное пространство, связанное с другими процессами. Даже браузер с веб-сервером после установки соединения по 80 порту (или 443) создают пару новых сокетов для непосредственного обмена данными чисто чтоб текущий запрос не занимал исходный порт и давал возможность подключиться другим клиентам.
Не пинайте сильно.. Пытаюсь разобраться в сокетах. А смысл тогда в сокете nginx+php-fpm? Увеличение скорости и количества подключений и куча проблем с безопасностью(я про использование на VPS/VDS)? Как я могу использовать сокет который создали nginx+php-fpm в php? Скорее, я с ним ничего делать не могу. Если я правильно понял.. то на линуксе somaxconn=128(по умолчанию) для TCP. А связка nginx+php-fpm позволяет значительно больше соединений обрабатывать. Правильно ? Ладно создал я свой unix domain socket(AF_Unix, не AF_INET- это всего 128 соединений по умолчанию?) на php, как его привязать/направить к ip:порту? Сразу говорю разницу между сетевой и локальный понимаю. Но у nginx+php-fpm получается)))
@Romio фпм использует сокет, чтоб вебсервер мог адресовать к пхп-машине запорсы. Это может быть айпи-сокет или юниксовый. И всё. Ты пытаешься создать сокет-сервер. Его запуском у тебя почему-то занимается фпм, судя по коду. Но не важно кто его будет запускать. Важно что для обработки запросов он обязан использовать свой собственный сокет. Либо же тебе достаточно переписать свою программу так, чтоб это был простой сценарий, который пхп-машина выполнит, получив сигнал от веб-сервера.
Вариант сценария для пхп машины мне не подходит. На сервере будет обработка БД(по времени), а так же сервер будет проверять/отвечать на запросы. Клиент отдельно. По этому вариант с сокетами кажется наиболее приемлемым. Но терь смущает малое количество соединений TCP.
Ну если это локальный демон, то в чем проблема указать ему какой-то свой юниксовый сокет? Да и ядро можно подкрутить до нужных значений, если руки прямые и есть уверенность в необходимости таких действий.
Угу, не удобнее ниразу. Непривычно. Ставишь когда на девелоперскую машину с убунтой: только с apt-cache search и подбирать как там их назвали...
@Zuldek вопрос привычки, наверное. Я за много лет сидения на убунте относительно привык к тому, как пакеты называются. Да, криво, но скорее в примере с 5.5 и 5.6 - при префиксе в php5-* на систему можно только что-то одно поставить. Репозиторий Сури проблему решает. Когда-нибудь может и дебиан/убунту в своих репах наведут порядок.