У меня есть скрипт сервера сокета PHP с именем server.php
это привязка к определенному порту и продолжать работать в течение длительного времени. (фактически он запускается в режиме cli (терминал) и не остановится, пока не будет нажата команда ctrl + c.)
Также есть PHP-файл Soap-сервера с именем service.php
которые управляют запросами чата. (например, открыть новую комнату, принять или пнуть клиентов и т. д.)
Оба сценария имеют доступ к общей базе данных, поэтому они могут делиться информацией.
Но иногда необходимо, чтобы SoapServer вызывал некоторые методы SocketServer (которые выполняются в системной памяти) асинхронно и получал связанные данные.
Я ищу простой и определенный способ справиться с этим. Спасибо за любые советы.
Основываясь на небольшой информации, я думаю, что вам лучше всего убедиться, что server.php выполняет только одну вещь: открывает сокет (например, на порту 8001) и обслуживает. Он не должен содержать никаких методов вообще.
Вы помещаете свои методы в другой скрипт, назовем его handler.php. В server.php вы включаете его: require_once("handler.php");
Ничто не мешает вам открыть другой сокет на другом порту (например, 8002), который не обрабатывает постоянные соединения, а вместо этого отвечает на регулярные веб-запросы. Назовите это server2.php, например. Этот server2.php также содержит: require_once("handler.php");
Затем SoapServer может использовать curl для выполнения асинхронных запросов к порту 8002 и иметь доступ к тем же методам, которые server.php использует для постоянных соединений.
Веб-сокет, который слушает обычные ajax / веб-запросы, может выглядеть примерно так, как показано ниже. В моем случае у handler.php есть метод handle()
это обрабатывает $rawInput
на основе $query
, $query
может быть так же просто, как имя метода, который вы хотите вызвать.
ob_end_clean();
header("Connection: close");
ob_start();
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
set_time_limit(0);
require_once("handler.php");
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($sock, "127.0.0.1" , 8002);
socket_listen($sock, 1024);
while (true) {
$client = socket_accept($sock);
$rawInput = socket_read($client, 204800);
$input = explode("\r\n", $rawInput);
$input = explode(" ", $input[0]);
$query = isset($input[1]) ? $input[1] : '/';
$result = handle($query, $rawInput);
$headers = "HTTP/1.0 200 OK\r\n";
$headers .= "Connection: keep-alive\r\n";
$headers .= "Content-Type: application/json\r\n";
$headers .= "Content-Length: " . sprintf('%u', strlen($result)) . "\r\n";
$headers .= "Keep-Alive: timeout=5, max=100\r\n";
$output = $headers . "\r\n" . $result;
socket_write($client, $output, strlen($output));
socket_shutdown($client, 1);
socket_close($client);
}
socket_shutdown($sock);
socket_close($sock);
Этот пример взят из некоторого кода, который я написал и который я активно использую, удаляя строки кода, характерные для моего приложения. Я надеюсь, что это работает для вас тоже ..
Поскольку предоставленная информация была минимальной — я не знаю, почему вы не можете просто позволить Apache иметь доступ к handler.php. Но если это должен быть веб-сокет, приведенный выше пример может помочь.
Других решений пока нет …