用php实现socket多线程服务器

一个星期,事情终于告一段落,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是支持进程的。!!不过进程通信也有点麻烦,但是肯定是在同一个网页文件里面的。再接再厉!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值