PHP - как создать сервер сокетов в моем веб-хосте
У меня есть веб-хостинг, и я хочу создать сокет-соединение с моим приложением. У меня есть этот код:
<?php
$host = "127.0.0.1";
$port = 25003;
// don't timeout!
set_time_limit(0);
if (!extension_loaded('sockets')) {
die('The sockets extension is not loaded.');
}
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
// bind socket to port
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
// start listening for connections
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");
// accept incoming connections
// spawn another socket to handle communication
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
// read client input
$input = socket_read($spawn, 1024) or die("Could not read input\n");
// clean up input string
$input = trim($input);
echo "Client Message : " . $input;
// reverse client input and send back
$output = strrev($input) . "\n";
socket_write($spawn, $output, strlen($output)) or die("Could not write output\n");
// close sockets
socket_close($spawn);
socket_close($socket);
?>
когда я запускаю страницу, она возвращает "Не удалось создать сокет"
Я запускаю код на общем веб-сервисе
в чем проблема? Как я могу это исправить?
2 ответа
Я попробовал ваш код на моей машине с установленным XAMPP и работает, он действительно открывает этот порт, я тестировал telnet через putty. Отвечая на ваши вопросы, я думаю, что @Jon Stirling сказал, что ваш хостинг не позволяет вам создавать сокет. Вот почему хостинговые компании продают пакеты веб-хостингов и виртуальные частные серверы, если вы хотите привязать порт, вам нужно искать VPS.
Я уверен, что вы решили эту проблему и переместили работу с тех пор, как опубликовали ее, но как человек, который только что прошел через это, я хотел бы направить всех, кто попадает сюда, на эту страницу:
https://www.php.net/manual/en/function.socket-select.php
Я искал способ иметь сервер сокетов, который не потребляет циклы ЦП и делает что-то только тогда, когда есть что делать. Это решение блокируется, пока оно ожидает соединений, чтобы что-то сделать, а затем обрабатывает их.
Обратите особое внимание на комментарии по поводу установки $tv_sec в null, так как это флаг «Заставить работать», который предотвращает перегрузку процессора.
Это позволяет создать сервер сокетов на PHP, который не загружает процессор, а также обрабатывает несколько соединений.
Единственная недостающая часть головоломки — это отключение клиентов, которые не отключаются сами.
Если нет времени ожидания соединения, которое можно установить, я думаю, что решение состоит в том, чтобы установить для $tv_sec какое-то подходящее значение, например, 2 секунды, а затем отслеживать время, когда соединение было установлено, а затем отключить его, если оно нарушает какое-то время. Недостатком этого является то, что он будет использовать ЦП, но если вы разблокируете каждые 2 секунды, вы можете использовать это для обработки тайм-аутов и т. Д. В противном случае вам придется полагаться на отключение клиентов. Это может не быть проблемой для вас, но в моем конкретном случае это так.