сокеты — вызов метода экземпляра PHP с другим файлом PHP в системной памяти

У меня есть скрипт сервера сокета PHP с именем server.php это привязка к определенному порту и продолжать работать в течение длительного времени. (фактически он запускается в режиме cli (терминал) и не остановится, пока не будет нажата команда ctrl + c.)
Также есть PHP-файл Soap-сервера с именем service.php которые управляют запросами чата. (например, открыть новую комнату, принять или пнуть клиентов и т. д.)
Оба сценария имеют доступ к общей базе данных, поэтому они могут делиться информацией.

Но иногда необходимо, чтобы SoapServer вызывал некоторые методы SocketServer (которые выполняются в системной памяти) асинхронно и получал связанные данные.

Я ищу простой и определенный способ справиться с этим. Спасибо за любые советы.

0

Решение

Основываясь на небольшой информации, я думаю, что вам лучше всего убедиться, что 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. Но если это должен быть веб-сокет, приведенный выше пример может помочь.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]