作为一名非底层程序员,要想深入了解socket的内部实现机制是很困难的,我们只需明白socket是一套操作系统封装好的实现进程通信的函数,会创建和调用就够了。
php的语言特性和自身定位决定了它只适合做socket客户端,而不适合做socket服务器端。
因为socket主要面向底层和网络服务开发,一般服务器端都是用 c 或 java 等语言实现,这样能更好地操作底层,对网络服务开发中遇到的问题(如并发、阻塞等)也有成熟完善的解决方案,而php显然不适合这种应用场景。 (推荐学习:php视频教程)
实际上,php操作mysql数据库也是通过socket进行的,这正是由于socket屏蔽了底层的协议,使得网络服务之间的互联互通变得简单。
除了传统的服务器端语言实现的socket外,随着html5的流行,浏览器客户端实现的websocket也逐渐兴起,对于这一点值得关注,flashsocket也是一个不错的解决方案。
要在客户端操作socket,可使用fsockopen、socket_create 或 stream_socket_client 等函数实现,如果是php5,推荐使用stream_socket_client。
socket交互应用实例:使用socket提交表单
新建一个 test.php 文件,向 http://demo.com/index.php?id=1 提交表单数据,代码如下:
<?php$data = array('comment'=>'this is a robot comment');$data = http_build_query($data); $out = "post http://demo.com/index.php?id=1 http/1.1\r\n"; // 通过post方式发送数据$out .= "host: demo.com\r\n";$out .= "content-type: application/x-www-form-urlencoded; charset=utf-8\r\n";$out .= "content-length: ".strlen($data)."\r\n";$out .= "user-agent: mozilla/5.0 (windows nt 6.1; rv:48.0) gecko/20100101 firefox/48.0"."\r\n";$out .= "connection: close"."\r\n"."\r\n"; // 注意:此处有两个 \r\n $out .= $data."\r\n"; // 正文数据 $fp = fsockopen("demo.com", 80, $errno, $errstr, 30); // 创建socket客户端连接 // $fp = stream_socket_client("tcp://demo.com:80", $errno, $errstr, 30); 推荐这种写法 fwrite($fp, $out); // 向服务器发送数据 while (!feof($fp)) { echo fgets($fp, 1280); // 读取服务器响应的数据}fclose($fp); // 关闭socket连接?>
需要注意以下几点:
fsockopen的第一个参数,也可以使用ip地址,不要带 http:// 字符串,除非使用ssl等
请求头(headers)不一定要带上所有的头域,一般只需带上几个核心的header即可
在最后一个header处,即 connection 后有两个换行
注意编码问题
以上就是php为什么不适合socket的详细内容。