php socket多线程服务器的实例分享

发布时间:2020-12-26编辑:脚本学堂
本文介绍下,用php实现socket多线程服务器的一个例子,有需要的朋友参考下。

php支持socket,提供了socket的所有接口,可以实现一对一的通信。
php语言不支持线程,这里模拟了一个多线程代码(基于web服务器支持多线程)。

例子:

<?php
/**
* socket 多线程
* edit by www.jb200.com
*/
    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,资源指针是不能实现网页之间互传的。