Постоянный сокет локального домена в php - PullRequest
4 голосов
/ 22 декабря 2011

Ответы, которые я нашел на этот вопрос (например, здесь , здесь и здесь ), включают pfsockopen (), который, кажется, предназначен длянелокальные сокетные соединения.Однако код, который я написал до сих пор, использует php для доступа к серверу C ++ через локальное соединение.Я хочу, чтобы это соединение было постоянным (чтобы я мог использовать его для Comet, между прочим).Вот моя непостоянная версия:

<?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 и просто обращаться к ней каждый раз, когда вызывается этот скрипт, я обнаружил.Любые советы о том, что я могу сделать, чтобы превратить это в постоянное соединение?

Ответы [ 2 ]

4 голосов
/ 27 декабря 2011

Как указывают ссылки, которые вы указали, php не является постоянным языком, и нет никакой возможности сохранять постоянство между сеансами (т. Е. Загрузки страниц).Вы можете создать золотую середину, запустив второй php-скрипт в качестве демона, и ваш основной скрипт (то есть тот, который пользователь нажимает) подключается к нему (да - через сокет ...) и получает данные из него.

Если вы хотите сделать это и хотите избежать ненужных веб-сокетов, попробуйте новый HTML5 EventStream API , поскольку он предоставляет вам лучшее из обоих миров: инфраструктура, подобная commet.без взлома длинных опросов или необходимости выделенного сервера веб-сокетов.

2 голосов
/ 27 декабря 2011

Если вам нужно держать соединение открытым, вам нужно держать скрипт PHP открытым.Обычно PHP просто вызывается, а затем закрывается после запуска сценария (CGI, CLI) или представляет собой смесь (mod_php в apache, FCGI), в которой иногда интерпретатор PHP остается в памяти после завершения сценария (поэтому все, что связано сОС для этого процесса все равно останется дескриптором сокета).

Однако это никогда не сохраняется.Вместо этого вам нужно сделать PHP демоном, который может хранить ваши PHP-скрипты в памяти.Существующее решение для этого - Appserver-In-PHP .Он будет хранить ваш код в памяти, пока вы не перезагрузите сервер.Как и код, вы также можете сохранять переменные между запросами, например, дескриптор соединения.

...