一个星期,事情终于告一段落,php是支持socket的,提供了socket的所有接口,可以实现一对一的通信,完成了。但是问题出现php语言不支持线程,怎么办?不过百度一下,还是有很多人想办法,模拟了一个多线程代码(基于web服务器支持多线程):
<?php
function runThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn"); //这里的第二个参数是HTTP协议中规定的请求头
//不明白的请看RFC中的定义
fclose($fp);
}
function a()
{
$fp = fopen('result_a.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
function b()
{
$fp = fopen('result_b.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
if(!isset($_GET['act'])) $_GET['act'] = 'a';
if($_GET['act'] == 'a')
{
runThread();
a();
}
else if($_GET['act'] == 'b') b();
?>
确实实现了多线程,但是问题又来了,这些线程的通信是网页之间的通信,不过也不怕,有session机制,http是无状态的协议,不保存用户信息,可以用session进行变量传递,而且,还有序列号,让变量序列号存在某个文件里面或者数据库里面,都是可以实现的。我满怀信心的写着,眼看就要成功了,发现了一个写这编文章的原因:
socket_create/socket_accpet返回值都是一个resource指针。讲解序列号之前都会说一句话:
serialize() 可处理除了 resource 之外的任何类型。(!偶的妈呀!)
对于session传递,压根就不行,传害死我,一直,一直传,就是传不出去。传递过去之后引用计数就随着之前的页面资源的卸载而销毁了。页面传递是根本不可能传递资源类型的。
总之:
1,php要实现多线程,就得靠web服务器,本身没有,但是这样就必须要实现资源指针在网页之间互传。
2,资源指针是不能实现网页之间互传的。
结论:php不能实现socket多线程。
不过我还是想实现socket多人通信,办法还是有的,最近又发现了php是支持进程的。!!不过进程通信也有点麻烦,但是肯定是在同一个网页文件里面的。再接再厉!!