У меня есть клиент-серверное приложение, в котором сервер может потребовать отправить информацию обратно клиентам.
Поскольку шаблон клиент-сервер не позволяет серверу «запрашивать» клиента, существует 2 решения:
В настоящее время клиент (веб-приложение с JavaScript и Html / Css) открывает потоковое соединение с сервером (сервер C ++), который может отправлять информацию обратно клиенту.
Я хотел бы реализовать PHP-версию этой функции, чтобы позволить недорогому хостингу работать с моей программой (недорогой хостинг, как правило, не обеспечивает доступ к исполняемым / исполняемым файлам). Идея заключается в том, что клиент делает запрос, который устанавливает потоковый сокет, он сохраняет сокет, а затем другой запрос может извлечь этот сокет и отправить через него новую информацию.
Итак, мой вопрос: как сохранить HTTP-сокет в 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
Например, данные могут храниться в базе данных.