Подождите, пока socket_write завершится, прежде чем писать снова.

Мне нужно отправить некоторые данные с сервера PHP на сервер узла.

Вот упрощенная версия того, что у меня есть на стороне PHP:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); $result = socket_connect($socket, '127.0.0.1', '3000'); socket_write($socket, "Hello World", 11); socket_close($socket); 

Выполнение этого кода успешно отправляет сообщение на мой сервер Node и выводит его.

Однако мне нужно отправить несколько сообщений обратно в сокет. Мне действительно нужно отправить несколько тысяч ответов. Но если бы я должен был вызвать socket_write() в цикле следующим образом:

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); $result = socket_connect($socket, '127.0.0.1', '3000'); for($i=0;$i<1000;$i++){ socket_write($socket, "Hello World", 11); } socket_close($socket); 

он, кажется, присоединяет все данные вместе и отправляет их в один конец в конце скрипта. Мне нужно отправить данные обратно в режиме реального времени. Есть ли способ сделать это на PHP?

Просмотрев многие библиотеки сокетов PHP, я заметил, что почти все они просто реализуют usleep(1000000) после отправки сокета. Я не уверен, что это лучший метод, но, возможно, это единственный способ из-за ограничений PHP.

В конце концов, я решил сохранить время, когда данные были в последний раз записаны в сокет. Затем вычислите время, прошедшее с тех пор, и вычтите из 1000000 микросекунд. Таким образом, сценарий не будет ждать дольше, чем необходимо.

 public function send(array $payload){ $json = json_encode($payload); $write = socket_write($this->socket, $json, strlen($json); $sleep_time = 1000000 - (microtime(true) - $this->last_sent); if($sleep_time > 0) usleep($sleep_time); $this->last_sent = microtime(true); return $write !== false ? true : false; }