Ответы, которые я нашел на этот вопрос (например, здесь , здесь и здесь ), связаны с pfsockopen (), которые, похоже, ориентированы на нелокальные соединения сокетов. Однако код, который я написал до сих пор, использует php для доступа к серверу C ++ через локальное соединение. Я хочу, чтобы эта связь была постоянной (так что я могу использовать ее для кометы, кстати). Вот моя непостоянная версия:
<?php session_start(); ... if (($sock = socket_create(AF_UNIX, SOCK_STREAM,0)) === false) { echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; exit(); } $sess_id = $_SESSION['sess_id']; $sock_str = '/tmp/sockdir/' . $sess_id; //The socket is named after the php session, not important if (socket_connect($sock, $sock_str) === false) { echo "socket_connect() to " . $sock_str . " failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; socket_close($sock); exit(); } $msg = $_GET['message']; // ... do things with $msg socket_close($sock); ?>
Теперь я не могу просто сохранить '$ sock' как переменную $ _SESSION и просто обращаться к ней каждый раз, когда этот скрипт вызывается, я нашел. Любые советы о том, что я могу сделать, чтобы превратить это в постоянное соединение?
Поскольку ссылки, которые вы указали, указывают, что php не является постоянным языком, и нет возможности иметь постоянство во всех сеансах (т.е. загрузка страниц). Вы можете создать среднюю площадку, запустив второй php-скрипт в качестве демона, и ваш основной скрипт (то есть тот, который попадает пользователь) подключится к этому (да – через сокет …) и получит данные от него.
Если вы должны это сделать и хотите избежать hassel of Web Sockets, попробуйте новый API-интерфейс HTML5 EventStream , поскольку он дает вам лучшее из обоих миров: кометная инфраструктура без халатности долгого опроса или необходимость выделенный сервер веб-сокетов.
Если вам нужно открыть соединение открытым, вам нужно оставить PHP-скрипт открытым. Обычно PHP вызывается, а затем закрывается после запуска скрипта (CGI, CLI) или представляет собой смесь (mod_php в apache, FCGI), в которой иногда интерпретатор PHP остается в памяти после завершения вашего скрипта (так что все, что связано с OS к этому процессу все равно останется как дескриптор сокета).
Однако это никогда не спасает. Вместо этого вам нужно сделать PHP-демоном, который может хранить ваши PHP-скрипты в памяти. Существующее решение для этого – Appserver-In-PHP . Он сохранит ваш код в памяти, пока вы не перезапустите сервер. Как и код, вы также можете сохранять переменные между запросами, например, дескриптор соединения.