Здравствуйте! В общем есть демон, который запускает уже демона на php при подключении пользователя и создаёт процесс через pcntl_fork.
Если открыть несколько вкладок будет создано несколько дочерних процессов. Есть ли какое-то решение не плодить эти процессы, а при условии, что процесс создан подключить к нему же?
С pid процесса внутри, и проверять не только наличие файла, но и наличие процесса с таким pid, а если процесса нет, удалять файл и запускать инстанс процесса.
Процессы, бывает, падают, и если просто файл как блокировка будет использоваться, всё встанет.
Борис Сёмов, а если процесс уже существует, как к нему подключиться? вопрос в этом.
Это веб сокеты. Есть библиотека при подключении пользователя к вебсокету создает процесс. Так сказать запускает копию процесса при каждой открытой в кладке.
sa1ch, ну это же демон. Он сидит и слушает порт. Пусть все клиенты обращаются к этому порту и всё.
Тут гораздо интереснее как вы сделали так, что при при открытии вкладок каждая работала со своим демоном. Они ведь так работали?
Василий, ну в Nginx не на каждый запрос свой процесс. В этот как раз и серьёзное отличие Nginx от Apache.
И внутри у них написан какой-то код, который делает так, что соединение обрабатывается тем или иным воркером. У автора, очевидно тоже есть какой-то код, который этим рулит.
sa1ch, тут интересно что вы имеете в виду говоря "подключиться к процессу". вы хотите чтобы этот процесс в вебсокет писал? Или вы хотите посмотреть что этот процесс stdout пишет? Или просто хотите послать ему сигнал завершения?
А зачем вам на каждое новое соединение создавать новый процесс. Процесс создаётся один раз, затем, когда приходит запрос от клиента, ему передаются данные, и он возвращает ответ. Если запросов много, и один экземпляр демона становится узким местом, создаются несколько экземпляров, и возможно, используется балансировщик перед ними.
Подключиться можно хоть через сокет, хоть через очередь сообщений, хоть через свой велосипед в базе или key-value. Как напишите, так и будет.
Борис Сёмов, Иван Корюков,
В общем смотрите запускаю в консоли ws сервер и открываю две вкладки, где есть обращение к этому серверу.
Следовательно запущены две копии скрипта, и каждый скрипт вызывает pcntl_fork()
Вот мне нужно хоты бы, что fork не плодил процессы, а принимал pid уже существующего. Ещё мне кажется, что я чего то не понимаю)))
sa1ch, pcntl_fork возвращает PID. Как уже написал Борис Сёмов - форкнутый демон может писать в файл свой PID. А вы, перед тем как делать форк должны посмотреть на этот файл - если он существует, и PID в нём это работающий процесс - то ок, используёте этот PID точно так же как если бы вы получили его от форка. Иначе таки форкаете своего демона.