当前位置: 首页 > Linux

PHPSocket编程多进程echoserver

时间:2023-04-06 19:04:23 Linux

最后一个echoserver程序有一个很大的缺点,就是同一时间只能连接一个client,这显然是不合理的。所以这次采用了多进程的方式,同时为多个客户端提供服务。下面是最终效果:(我们创建的工作进程可以通过ps命令查看)(通过xshell打开多个终端,将多个客户端连接到服务程序)在开始写代码之前,先介绍一下什么是进程。进程,即占用内存的运行程序,是一块独立的内存空间。比如我们在Windows上打开记事本软件,这个操作就相当于打开了一个进程。多处理就是创建多个进程共同完成一件事情。这次我们只需要实现服务端程序即可,客户端还是使用之前的那个。没有看过往期文章的可以查看历史文章。在PHP中,我们可以使用pcntl_fork函数来创建一个进程。下面是函数原型:intpcntl_fork(void)官方解释:成功时,在父进程的执行线程中返回生成的子进程的PID,在子进程的执行线程中返回0。失败时,在父进程上下文中返回-1,不创建子进程,并引发PHP错误。为什么是父进程执行的线程,因为一个进程至少包含一个线程,而这个线程就是进程的主线程。当父进程调用pcntl_fork时,同时复制了一个独立的子进程,这个子进程与父进程具有相同的上下文。也就是说,两个进程共享一个代码。现在进入编码阶段:通过执行pcntl_fork函数,同时复制一个子进程。此时如果上下文为父进程的执行环境,则返回值为子进程的进程号。如果是子进程的执行环境则返回0。所以在下面的if程序结构中,两个分支都被执行了。子进程也是之前的逻辑,用来接收客户端的消息,同时发送给客户端。倒数第二行调用pcntl_waitpid函数。在解释这个函数之前,我们先了解一下什么是僵尸进程。通常,子进程由父进程创建。由于进程是独立的内存结构,父进程不会知道子进程的运行状态。子进程完成任务后,不能自行退出。这时候父进程就需要通过操作系统获取子进程的状态,从而回收子进程。否则,我们的子进程就会成为垃圾资源,即僵尸进程。下面是这个函数的函数原型:intpcntl_waitpid(int$pid,int&$status[,int$options=0])官方解释:等待或者返回fork子进程的状态。其实上面的代码是有问题的。在foreach中第一次调用pcntl_waitpid后,此时主进程实际上处于阻塞状态,一直在等待第一个子进程退出。如果此时其他子进程异常退出,如果没有被主进程回收,就会产生僵尸进程。在实际开发中,主进程还要做其他事情。所以这里推荐使用非阻塞的方式,很简单,只需要加上第三个参数:WNOHANG。即:pcntl_waitpid($pid,$status,WNOHANG)可以在子进程不退出的情况下立即返回,以便继续执行后续代码。以上就是我们的多进程echo服务程序。如果觉得文章还不错,请多多关注解锁哦~