PHP--SOCKET功能详解 及SOCKET编程

本文介绍了PHP的SOCKET功能,展示了如何使用PHP进行SOCKET编程,包括服务器端和客户端的代码实现。此外,还讨论了PHP的并发IO编程,如多进程/多线程模型和IO复用/事件循环/异步非阻塞技术,强调了IO复用在解决C10K问题中的重要性。最后,简要分析了PHP内部socket函数的源码实现和模拟HTTP POST请求的方法。
摘要由CSDN通过智能技术生成

1. 预备知识

       一直以来很少看到有多少人使用php的socket模块来做一些事情,大概大家都把它定位在脚本语言的范畴内吧,但是其实php的socket模块可以做很多事情,包括做ftplist,http post提交,smtp提交,组包并进行特殊报文的交互(如smpp协议),whois查询。这些都是比较常见的查询。

特别是php的socket扩展库可以做的事情简直不会比c差多少。
php的socket连接函数
1、集成于内核的socket
这个系列的函数仅仅只能做主动连接无法实现端口监听相关的功能。而且在4.3.0之前所有socket连接只能工作在阻塞模式下。
此系列函数包括
fsockopen,pfsockopen
这两个函数的具体信息可以查询php.net的用户手册
他们均会返回一个资源编号对于这个资源可以使用几乎所有对文件操作的函数对其进行操作如fgets(),fwrite(), fclose()等单注意的是所有函数遵循这些函数面对网络信息流时的规律,例如:
fread() 从文件指针 handle 读取最多 length 个字节。 该函数在读取完 length 个字节数,或到达 EOF 的时候,或(对于网络流)当一个包可用时就会停止读取文件,视乎先碰到哪种情况。 
可以看出对于网络流就必须注意取到的是一个完整的包就停止。
2、php扩展模块带有的socket功能。
php4.x 以后有这么一个模块extension=php_sockets.dll,Linux上是一个extension=php_sockets.so。
当打开这个此模块以后就意味着php拥有了强大的socket功能,包括listen端口,阻塞及非阻塞模式的切换,multi-client 交互式处理等
这个系列的函数列表参看http://www.php.net/manual/en/ref.sockets.php
看过这个列表觉得是不是非常丰富呢?不过非常遗憾这个模块还非常年轻还有很多地方不成熟,相关的参考文档也非常少:(
我也正在研究中,因此暂时不具体讨论它,仅给大家一个参考文章

http://www.zend.com/pecl/tutorials/sockets.php

2. 使用PHP socket扩展

服务器端代码:

[php]  view plain   copy
  print ?
  1. <?php  
  2. /** 
  3.  * File name server.php 
  4.  * 服务器端代码 
  5.  *  
  6.  * @author guisu.huang 
  7.  * @since 2012-04-11 
  8.  *  
  9.  */  
  10.   
  11. //确保在连接客户端时不会超时  
  12. set_time_limit(0);  
  13. //设置IP和端口号  
  14. $address = "127.0.0.1";  
  15. $port = 2046; //调试的时候,可以多换端口来测试程序!  
  16. /** 
  17.  * 创建一个SOCKET  
  18.  * AF_INET=是ipv4 如果用ipv6,则参数为 AF_INET6 
  19.  * SOCK_STREAM为socket的tcp类型,如果是UDP则使用SOCK_DGRAM 
  20. */  
  21. $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");  
  22. //阻塞模式  
  23. socket_set_block($sockor die("socket_set_block() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");  
  24. //绑定到socket端口  
  25. $result = socket_bind($sock$address$portor die("socket_bind() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");  
  26. //开始监听  
  27. $result = socket_listen($sock, 4) or die("socket_listen() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");  
  28. echo "OK\nBinding the socket on $address:$port ... ";  
  29. echo "OK\nNow ready to accept connections.\nListening on the socket ... \n";  
  30. do { // never stop the daemon  
  31.     //它接收连接请求并调用一个子连接Socket来处理客户端和服务器间的信息  
  32.     $msgsock = socket_accept($sockor  die("socket_accept() failed: reason: " . socket_strerror(socket_last_error()) . "/n");  
  33.       
  34.     //读取客户端数据  
  35.     echo "Read client data \n";  
  36.     //socket_read函数会一直读取客户端数据,直到遇见\n,\t或者\0字符.PHP脚本把这写字符看做是输入的结束符.  
  37.     $buf = socket_read($msgsock, 8192);  
  38.     ec
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值