如何让我的server.php不断运行?

时间:2013-03-06 22:15:18

标签: php sockets client

所以我有这个服务器代码,它适用于我的客户端。但它从客户端收到一条消息并发回消息。 这是代码: SERVER.php

<?php 

    $host = "127.0.0.1"; 
    $port = 1234; 

    // don't timeout! 
    set_time_limit(0); 

    // create socket 
    $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n"); 

    // bind socket to port 
    $result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n"); 

    // start listening for connections 
    $result = socket_listen($socket, 3) or die("Could not set up socket listener\n"); 

    // accept incoming connections 
    // spawn another socket to handle communication 
    $spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); 

    // read client input 
    $input = socket_read($spawn, 1024) or die("Could not read input\n"); 

    // clean up input string 
    $input = trim($input); 

    // reverse client input and send back 
    $output = strrev($input) . "\n"; 
    socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n"); 

    // close sockets 
    socket_close($spawn); 
    socket_close($socket); 

?>

如何编辑此代码以便可以连续运行?客户端当然不必熬夜,只需打开一个新的套接字,发送消息,从服务器恢复并关闭套接字。下次我想发送消息时,我会再次执行上一步。

现在,如果我发送消息并从服务器获得响应,它们都会关闭套接字。 请帮我修改服务器端,以便它不会关闭套接字并等待新的连接。

我尝试添加一个while循环,但是一旦客户端关闭,服务器再次关闭,说它无法再从客户端读取。

谢谢

4 个答案:

答案 0 :(得分:4)

我明白了。大多数人都接近解决它,就像我使用while()循环一样。 但是你不能只是将代码置于其中并期望它能够正常工作。正确的做法如下:

<?php 
$host = "127.0.0.1"; 
$port = 1234; 

// don't timeout! 
set_time_limit(0); 

// create socket 
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n"); 

// bind socket to port 
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n"); 
    while(true) {
    // start listening for connections 
    $result = socket_listen($socket, 3) or die("Could not set up socket listener\n"); 

    // accept incoming connections 
    // spawn another socket to handle communication 
    $spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); 

    // read client input 
    $input = socket_read($spawn, 1024) or die("Could not read input\n"); 

    // clean up input string 
    $input = trim($input); 

    // reverse client input and send back 
    $output = strrev($input) . "\n"; 
    socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n"); 
    }
// close sockets 
socket_close($spawn); 
socket_close($socket); 

?>

如果您尝试将其他任何地方放置,则会引入错误。 感谢大家的帮助:D

答案 1 :(得分:0)

接受后你需要分叉 - 见http://php.net/manual/en/function.pcntl-fork.php

接受需要处于循环中。在接受fork一个进程来处理该客户端。

while (TRUE)
{
    $spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); 

    $pid = pcntl_fork();
    if ($pid == -1) {
         die('could not fork');
    } else if ($pid) {
         // we are the parent
         socket_close($spawn);
    } else {
         // we are the child
         // Use $spawn for communication as you see fit
         // exit();
    }    
}

您需要使用signal handler来整理僵尸进程。

答案 2 :(得分:-1)

“粗暴”方式是将代码插入无限循环中。

While(1){
     .
     .
 }

其他方式,在收到您的消息后,您可以小心翼翼地调用您的脚本。

答案 3 :(得分:-1)

  while( TRUE ) {

      // your code


  }