【发布时间】:2016-06-20 22:17:37
【问题描述】:
我有以下方法:
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 时,我有办法关闭所有套接字吗?
我注意到只要不在浏览器中加载它,我就可以多次启动和停止该过程。
【问题讨论】: