이미 있기 때문에 해결하기 위해 결합 할 수 없습니다 나는 다음과 같은 방법이 있습니다 내가 명령 줄을 통해 그것을 실행하면는 사용
public static function listen(int $port, callable $callback) {
ob_implicit_flush();
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
println("socket_create() failed: reason: " . socket_strerror(socket_last_error()));
}
if (socket_bind($sock, '127.0.0.1', $port) === false) {
println("socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)));
}
if (socket_listen($sock, 5) === false) {
println("socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)));
}
if ($callback !== null && is_callable($callback)) {
call_user_func($callback);
}
do {
if (($msgsock = socket_accept($sock)) === false) {
println("socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)));
continue;
}
if (false === ($buf = socket_read($msgsock, 2048, PHP_BINARY_READ))) {
println("socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)));
continue;
}
$eventName = trim(explode(' ', $buf)[1], '/');
$msg = '';
foreach (self::$events as $event) {
if ($event->name() == $eventName) {
$msg = $event->headers();
$msg .= $event->run();
break;
}
}
socket_write($msgsock, $msg, strlen($msg));
socket_close($msgsock);
println("socket closed");
} while (true);
socket_close($sock);
}
, 그것은 잘 작동합니다. 브라우저에서 페이지를 열고 소켓에서 컨텐츠를 요청하면 올바른 헤더가 출력되고 페이지에 올바른 컨텐츠가 표시됩니다. 내가 코드를 편집하고 Ctrl + C를 눌러 코드를 다시 실행
, 나는 다음과 같은 오류 얻을 : 나는 기다릴 필요로PHP Warning: socket_bind(): unable to bind address [98]: Address already in use in /path/to/file.php on line 20
socket_bind() failed: reason: Address already in use
이, 그것은 하드 코드를 업데이트 할 수 있습니다를 내가 코드를 다시 실행할 수있을 때까지 잠시. Ctrl + C을 누르면 모든 소켓을 닫을 수 있습니까?
브라우저에서로드하지 않는 한 프로세스를 여러 번 시작하고 중지 할 수있는 것으로 나타났습니다.
나는 그것을 할 필요가 있다고 생각했기 때문에 그것을 추가하려고 시도했지만 콜백을 실행하지 않는다. 그것은 키보드 입력의 취소를 비록 멈춘다. 나는 do 앞에 오기 전에 그것을 넣었다. –
게재 위치에 대한 작업 예제 – drRobertz
으로 업데이트 된 답변을 얻으려면 가능한 한 일찍 신호 처리기를 설치하는 것이 좋습니다. – drRobertz