php: Как сохранить сокет клиента (не закрыт), так что дополнительный скрипт может получить его для отправки ответа?

У меня есть клиент-серверное приложение, в котором сервер может потребовать отправить информацию обратно клиентам.

Поскольку шаблон клиент-сервер не позволяет серверу «запрашивать» клиента, существует 2 решения:

  • Клиент вытаскивает сервер каждые несколько раз (что является плохим решением)
  • Клиент поддерживает открытый сокет с сервером, который позволяет серверу при необходимости отправлять новую информацию.

В настоящее время клиент (веб-приложение с JavaScript и Html / Css) открывает потоковое соединение с сервером (сервер C ++), который может отправлять информацию обратно клиенту.

Я хотел бы реализовать PHP-версию этой функции, чтобы позволить недорогому хостингу работать с моей программой (недорогой хостинг, как правило, не обеспечивает доступ к исполняемым / исполняемым файлам). Идея заключается в том, что клиент делает запрос, который устанавливает потоковый сокет, он сохраняет сокет, а затем другой запрос может извлечь этот сокет и отправить через него новую информацию.

Итак, мой вопрос: как сохранить HTTP-сокет в PHP, так что еще один запрос может его получить?

  • Как закончить скрипт PHP без закрытия сокета?
  • Как сохранить информацию о сокетах?
  • Как получить сокет из нового потока / запроса?

Я не знаю, даже если это возможно, я читал о pfsockopen, но он немного отличается от того, что мне нужно (возможно, я ошибаюсь).

введите описание изображения здесь

Таким образом, для каждого клиента требуется два соединения, один – для получения данных с сервера, а другой – для отправки данных.

Что-то вроде:

в persist.php:

 $socket = stream_socket_server('unix:///tmp/unique.sock', $errno, $errstr); if (!$socket) { echo "$errstr ($errno)<br />\n"; } else { while ($conn = stream_socket_accept($socket)) { $buffer = ""; // Read until double CRLF while( !preg_match('/\r?\n\r?\n/', $buffer) ) $buffer .= fread($client, 2046); //Operate with our listener echo $buffer; flush(); // Respond to socket client fwrite($conn, "200 OK HTTP/1.1\r\n\r\n"); fclose($conn); } fclose($socket); } 

в senddata.php:

 $sock = stream_socket_client('unix:///tmp/unique.sock', $errno, $errstr); fwrite($sock, $data); fflush($sock); fclose($sock); 

Один из способов его решения – забыть о sockets .

псевдокод:

 // receive request, set some session_id if not exists // request contains last_timestamp, so we know which data client already have // check have we any dataset for this session_id after last_timestamp // return this dataset, or no_new_data signature 

Например, данные могут храниться в базе данных.