PHP实现简单的socket通信
2013-07-03 17:00
281 查看
前言
昨晚复习了一下用c如何实现客户端和服务器端的socket通信,参考链接:http://blog.csdn.net/zinss26914/article/details/9226413, 因为我主要开发语言是php,所以今天用php模拟实现了一个服务器端的socket守护进程,参考的是一淘工程师张洋的bolg:http://blog.codinglabs.org/articles/write-daemon-with-php.html概述
php5.3自带了socket模块,使得php具有socket通信能力,具体api可以参考官方手册:http://php.net/manual/zh/function.socket-create.php, 具体实现跟c非常类似,只是少了内存分配和网络字节序转换这种底层操作同时,php的pcntl模块和posix模块配合可以实现基本的进程管理、信号处理等操作系统级别的功能。这里有两个非常关键的函数,pcntl_fork()和posix_setsid()。fork()一个进程,则表示创建了一个运行进程的副本,副本被认为是子进程,而原始进程被认为是父进程。当fork()运行之后,则可以脱离启动它的进程和终端控制等,也意味着父进程可以自由退出。pcntl_fork()返回值,-1表示执行失败,0表示在子进程中,大于0表示在父进程中。setsit(),它首先使新进程成为一个新会话的“领导者”,最后使进程不再控制终端。这也是成为守护进程最关键一步,这意味着,不会随着终端关闭而强制退出进程。对于一个不会被中断的常驻进程来说,这是很关键的一步。进行最后一次fork(),这一步不是必须的,但通常都这么做,它最大的意义是防止获得控制终端
什么是守护进程?一个守护进程通常被认为是一个不对终端进行控制的后台任务。它有三个很明显的特征:
在后台运行
与启动他的进程脱离
无须终端控制
最常见的实现方法:fork() -> setsid() -> fork(), 代码里run_server()方法实现了守护进程
server端socket监听代码
<?php // 接受客户端请求,回复固定的响应内容 function server_listen_socket ($address, $port) { $buffer = "Msg from wangzhengyi server, so kubi..."; $len = strlen($buffer); // create, bind and listen to socket $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if (! $socket) { echo "failed to create socket:" . socket_strerror($socket) . "\n"; exit(); } $bind_flag = socket_bind($socket, $address, $port); if (! $bind_flag) { echo "failed to bind socket:" . socket_strerror($bind_flag) . "\n"; exit(); } $backlog = 20; $listen_flag = socket_listen($socket, $backlog); if (! $listen_flag) { echo "failed to listen to socket:" . socket_strerror($listen_flag) . "\n"; exit(); } echo "waiting for clients to connect\n"; while (1) { if (($accept_socket = socket_accept($socket)) == FALSE) { continue; } else { socket_write($accept_socket, $buffer, $len); socket_close($accept_socket); } } } function run_server () { $pid1 = pcntl_fork(); if ($pid1 == 0) { // first child process // 守护进程的一般流程:fork()->setsid()->fork() posix_setsid(); if (($pid2 = pcntl_fork()) == 0) { $address = "192.168.1.71"; $port = "8767"; server_listen_socket($address, $port); } else { // 防止获得控制终端 exit(); } } else { // wait for first child process exit pcntl_wait($status); } } // server守护进程 run_server();
运行效果
启动服务器端socket进程,看是否在后台运行,效果如图:客户端访问,可以通过浏览器或者curl访问,这里直接用curl访问了
相关文章推荐
- php简单实现socket通信
- UEditor编辑器和php简单的实现socket通信
- php简单实现socket通信
- php简单实现socket通信
- PHP实现的简单分页类及用法示例
- 【php】用filter_var实现的简单参数验证
- php实现文件下载简单示例(代码实现文件下载)
- PHP实现简单实用的分页类代码
- PHP之简单实现MVC框架
- PHP+swoole实现简单多人在线聊天群发
- PHP实现数据分页显示的简单实例
- php下实现伪 url 的超简单方法[转]
- PHP实现简单数字分页效果
- php实现的简单检验登陆类
- php实现斐波那契数列的简单写法
- Android+PHP简单实现
- PHP实现的简单日历代码
- PHP实现最简单爬虫原型
- 编写简单php,实现网络收音机web转台功能
- PHP简单实现文本计数器的方法