1
아래 코드로 PHP cli 소켓 서버를 가지고 있습니다. 클라이언트가 연결 요청PHP CLI 소켓 서버에 연결된 클라이언트의 원격 IP 주소 지정
을 보내<?php
// PHP SOCKET SERVER
error_reporting(E_ERROR);
// Configuration variables
$host = "127.0.0.1";
$port = 5600;
$max = 500;
$client = array();
// No timeouts, flush content immediatly
set_time_limit(0);
ob_implicit_flush();
// Server functions
function rLog($msg){
$msg = "[".date('Y-m-d H:i:s')."] ".$msg;
echo($msg."\n");
}
// Create socket
$sock = socket_create(AF_INET,SOCK_STREAM,0) or die("[".date('Y-m-d H:i:s')."] Could not create socket\n");
// Bind to socket
socket_bind($sock,$host,$port) or die("[".date('Y-m-d H:i:s')."] Could not bind to socket\n");
// Start listening
socket_listen($sock) or die("[".date('Y-m-d H:i:s')."] Could not set up socket listener\n");
rLog("Server started at ".$host.":".$port);
// Server loop
while(true){
socket_set_block($sock);
// Setup clients listen socket for reading
$read[0] = $sock;
for($i = 0;$i<$max;$i++){
if($client[$i]['sock'] != null)
$read[$i+1] = $client[$i]['sock'];
}
// Set up a blocking call to socket_select()
$ready = socket_select($read,$write = NULL, $except = NULL, $tv_sec = NULL);
// If a new connection is being made add it to the clients array
if(in_array($sock,$read)){
for($i = 0;$i<$max;$i++){
if($client[$i]['sock']==null){
if(($client[$i]['sock'] = socket_accept($sock))<0){
rLog("socket_accept() failed: ".socket_strerror($client[$i]['sock']));
}else{
rLog("Client #".$i." connected");
}
break;
}elseif($i == $max - 1){
rLog("Too many clients");
}
}
if(--$ready <= 0)
continue;
}
for($i=0;$i<$max;$i++){
if(in_array($client[$i]['sock'],$read)){
$input = socket_read($client[$i]['sock'],1024);
if($input){
rLog("Client ".$i." Call:".$input.")");
## <<<<<<<<<<< Clients Request Show Here >>>>>>>>>>>> ##
## <<<<<<<<<<< Clients Request Show Here >>>>>>>>>>>> ##
## <<<<<<<<<<< Clients Request Show Here >>>>>>>>>>>> ##
## <<<<<<<<<<< Clients Request Show Here >>>>>>>>>>>> ##
## <<<<<<<<<<< Clients Request Show Here >>>>>>>>>>>> ##
}
}
}
}
// Close the master sockets
socket_close($sock);
?>
질문 :
- 가 어떻게 내 PHP CLI 소켓 서버에 연결된 클라이언트의 IP 주소를 검색 할 수 있습니다?
코드는 동시 연결을 처리 할 수 없습니다. 원하는 경우 스레딩을 지원하는 무언가를 사용해야합니다. 나는. node.js 등 – Ron
@Ron It *은 PHP로 처리 될 수 있지만 완전한 PITA이고 단일 프로세스, 단일 스레드 환경에서 잘 작동하지 않기 때문에 사용자가해서는 안되는 점에 있습니다. . 그러나 Node.js가 실제로 스레딩을 지원하지 않는다는 점도 중요합니다. Javascript 기반이기 때문에 모든 것이 단일 스레드로 단일 프로세스에서 실행됩니다. (안녕하세요, PHP라고하지 않습니까? 기다리십시오 ...), 간단히 * 때문에 스레드로 표시됩니다. Javascript 스케줄러가 작동하는 방식. 그러나 WebWorkers를 작성하여 새로운 프로세스를 생성 할 수는 있지만 여전히 단일 스레드입니다. – DaveRandom
@Ron 가치가있는 [여기] (http://ejohn.org/blog/how-javascript-timers-work/). 이 도표는 그것을 아주 잘 요약 한 것 같습니다. 하지만 그때 나는 [존 Resig] (http://stackoverflow.com/users/6524/john-resig)에서 다른 것을 기대하지 않을 것이다. – DaveRandom