【发布时间】:2012-07-18 21:47:10
【问题描述】:
我有 php cli socket 服务器,代码如下;客户端连接并发送请求
<?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 socket 服务器的客户端的 IP 地址?
【问题讨论】:
-
请注意,您的代码无法处理并发连接。如果你想要这样,你必须使用支持线程的东西。 IE。 node.js 等
-
@Ron 它可以在 PHP 中完成,但你是对的,你不应该这样做,因为它是一个完整的 PITA,在 uni 中不能很好地工作-进程,单线程环境。然而,同样重要的是要注意 Node.js 实际上不支持线程。因为它是基于 Javascript 的,所以一切都在一个进程中用一个线程执行(嘿,我听到你说,PHP 不是那样的吗?等等……),它只是 出现由于 Javascript 调度程序的工作方式而被线程化。但是,您可以通过创建 WebWorkers 来生成新进程 - 但这些仍然是单线程的。
-
@Ron 值得进一步阅读here。这张图总结的很好,我觉得。但是我不希望John Resig 有其他任何东西。
-
是和不是。是的,node.js 使用 Javascript。不,node.js 无法与浏览器中的 javascript 相提并论。 Node.js 使用有趣的回调模型,使您的程序的方面事件驱动。使用该模型,您可以做一些使用 php 的命令式编程模型做不到的事情...
-
@Ron
you can do things you cant with php's imperative programming model- 绝对正确,但由于 Node 基于 V8 引擎,它可以与浏览器中的 Javascript 进行比较 - 特别是 Chrome 中的 Javascript。并且与上述浏览器相同的原理仍然适用 - 如果您编写一个需要 10 分钟才能执行并在 Node 中运行的 CPU 密集型 JS 函数,那么该 Node 实例在执行时将无法执行任何其他操作。因为大多数套接字操作需要不到 1 毫秒,并且很多像这样的 I/O 操作被替换为工作线程,所以它从来没有真正成为问题。