飞嗨,欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。(本博已于2015.12.6升级到php7,运行环境php7 php-fpm + nginx1.8.0)

PHP socket编程

PHP lf 3974℃ 0评论

无奈,我一直把php定位在一个服务器端的脚本语言,以为他不能打开一个端口来监听,有一次,去一个做游戏的公司面试,面试官问我会不会socket编程,他说curl在请求游戏数据的时候不安全,他们准备用socket来实现…最近,在学学c语言,感受到了c socket的强大,想想php的底层都是c写的,php扩展目录ext下是不是有一个socket.dll/socket.so呢…果然…

1、集成于内核的socket
这个系列的函数仅仅只能做主动连接无法实现端口监听相关的功能。而且在4.3.0之前所有socket连接只能工作在阻塞模式下。
此系列函数包括
fsockopen,pfsockopen
这两个函数的具体信息可以查询php.net的用户手册
他们均会返回一个资源编号对于这个资源可以使用几乎所有对文件操作的函数对其进行操作如fgets(),fwrite(), fclose()等单注意的是所有函数遵循这些函数面对网络信息流时的规律,例如:
fread() 从文件指针 handle 读取最多 length 个字节。 该函数在读取完 length 个字节数,或到达 EOF 的时候,或(对于网络流)当一个包可用时就会停止读取文件,视乎先碰到哪种情况。
可以看出对于网络流就必须注意取到的是一个完整的包就停止。

2、就是偶看到的socket.so/socket.dll了
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

server_socket

server_socket

set_time_limit(0);
$address = ‘127.0.0.1’;
$port = ‘2046’;
$sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or die(“socket_create()失败的原因是”.socket_strerror(socket_last_error()).”\n”);
socket_set_block($sock) or die(“socket_set_block()失败的原因”.socket_strerror(socket_last_error()).”\n”);
$result = socket_bind($sock,$address,$port) or die(“sock_bind()失败的原因是:”.socket_strerror(socket_last_error()).”\n”);
$result = socket_listen($sock,4) or die(“socket_listen失败的原因是:”.socket_strerror(socket_last_error()).”\n”);
echo “ok\nBind the socket on $address:$port……”;
echo “ok\nNow ready to accept connections.\nListening on the socket……”;
do{
$msgsock = socket_accept($sock) or die(“socket_accept()失败的原因是:”.socket_strerror(socket_last_error()).”\n”);
$buf = socket_read($msgsock,8192);
echo “Recieved msg:$buf \n”;
$msg = “welcome \n”;
socket_write($msgsock,$msg,strlen($msg)) or die(“socket_write()失败的原因是”.socket_strerror(socket_last_error()).”\n”);
socket_close($msgsock);
}while(true);
socket_close($sock);
client_socket

client_socket

<?php
set_time_limit(0);
$host = “127.0.0.1”;
$port = ‘2046’;
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or die(“socket_create()失败的原因:”.socket_strerror(socket_last_error()).”\n”);
$connetcion = socket_connect($socket,$host,$port) or die(“socket_connect()失败的原因:”.socket_strerror(socket_last_error()).”\n”);
socket_write($socket,”hello i am the client”) or die(“socket_write()失败的原因:”.socket_strerror(socket_last_error()).”\n”);
while($buff = socket_read($socket,1024,PHP_NORMAL_READ)){
echo “server response was:$buff \n”;
}
socket_close($socket);
?>server_socket.php是服务器端,创建一个socket连接,并绑定在2046端口监听
server_socket_listening

server_socket_listening


运行后,可以看到2046端口正在监听了
listening

listening


client_socket.php是客户端,连接服务器端,并像服务器端发送一句i am the client等待服务器端响应返回数据
client

client


再来看看服务器在接收到client端后
server

server


socket还能模拟post get等请求,smtp等等,要熟悉这些协议,就可以做很多很多事了。不过,貌似看到一句话,php虽然有socket功能,但是据说是,不稳定,最好还是用c java这样的来写socket编程,实际工作中也木有用过,也不造这个是不是真的,不过php一个脚本语言,十有八九可能真是这样的吧。希望以后有机会,可以得出我自己的亲身体验。
 

转载请注明:飞嗨 » PHP socket编程

喜欢 (0)or分享 (0)

Warning: Use of undefined constant PRC - assumed 'PRC' (this will throw an Error in a future version of PHP) in /work/php/blog/wp-content/themes/yusi1.0/comments.php on line 17
发表我的评论
取消评论

表情
粤ICP备15018643号-1