≮六づ道≯的Blog

天行键,君子以自强不息! & 路漫漫其修远兮,吾将上下而求索!

黄殿瑶ID:feel8
186888次访问,排名348好友0人,关注者1
feel8的文章
原创 195 篇
翻译 0 篇
转载 1 篇
评论 100 篇
六道的公告
远离3721,还我一片静土!
 ╲█◤
◢██◣
   ◤◥
临渊羡鱼不如退而结网苦练内功ING -_-!!

昵称:≮六づ道≯
Mail:PHP5@QQ.COM
留言:点击留言




今日天气

最近评论
psnccs:WoW Gold
psnccs:WoW Gold
Eeeethan:不好意思,我想請教一個關於編譯Apache過濾器範例的問題,可能很初級,不過我確實找不到解答。我的問題是:
想請問怎麼要在Linux下用Gcc編譯:
httpd-2.2.4\modules\experimental\
裡的mod_case_filter.c
我下了
gcc -fPIC -I$../../include -c mod_case_……
风云★小子:一名刚学生!
你的时钟代码是什么啊?
南京甜蜜爱成人用品商城:<b>南京最大的零售、批发、加盟成人用品、性用品的网站[www.honey025.com],2000多种产品任您选购,1766个县市货到付款、3重

包装保密邮寄,主营:成人用品、性用品、性保健品、避孕用品、情趣内衣、壮阳药、阴茎增大丸、SM用品、安全套、男女自慰性器

具等</b><p>
[url=http://w……
文章分类
收藏
    相册
    我的相册
    My Links
    ChinaUNIX
    CSDN论坛
    Fedora官方网站
    LinuxEden
    LinuxSir
    mySQL官方网站
    PHP官方网站
    SmartTemplate
    中国赢网
    落伍者论坛
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 浅析php中实现多线程~ 收藏

    新一篇: 程序员的“素质”是什么?  | 旧一篇: 关于PHP--session的问题集锦解决方案

    PHP中实现多线程? 看到这个标题, 你一定以为我疯了..但是事实上我真的这么做了.

    下面是我的一些做法, 已经实验过. 确实可以的.

    我们知道PHP本身是不支持多线程的, 但是我们的WEB服务器是支持多线程的.

    也就是说可以同时让多人一起访问. 这也是我在PHP中实现多线程的基础.

    假设我们现在运行的是a.php这个文件. 但是我在程序中又请求WEB服务器运行另一个b.php

    那么这两个文件将是同时执行的.

    (PS: 一个链接请求发送之后, WEB服务器就会执行它, 而不管客户端是否已经退出)

    有些时候, 我们想运行的不是另一个文件, 而是本文件中的一部分代码.该怎么办呢?

    其实可是通过参数来控制a.php来运行哪一段程序.

    下面看一个例子:

    //a.php


    PHP代码:--------------------------------------------------------------------------------

    <?php
        
    function runThread()
        {
            
    $fp = fsockopen('localhost', 80, $errno, $errmsg);
            
    fputs($fp, "GET /a.php?act=b\r\n\r\n");        //这里的第二个参数是HTTP协议中规定的请求头
                                    //不明白的请看RFC中的定义
            
    fclose($fp);
        }

        function a()
        {
            
    $fp = fopen('result_a.log', 'w');
            
    fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "\r\n");
            
    fclose($fp);        
        }

        function
    b()
        {
            
    $fp = fopen('result_b.log', 'w');
            
    fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "\r\n");
            
    fclose($fp);        
        }
        if(!isset(
    $_GET['act'])) $_GET['act'] = 'a';
        if(
    $_GET['act'] == 'a')
        {
            
    runThread();
            
    a();
        }
        else if(
    $_GET['act'] == 'b') b();
    ?>
    --------------------------------------------------------------------------------


    打开result_a.log 和 result_b.log 比较一下两个文件的中访问的时间. 大家会发现, 这两个的确是在不同线程中运行的.
    有些时间完全一样.

    上面只是一个简单的例子, 大家可以改进成其它形式.


    既然PHP中也能多线程了, 那么问题也来了, 那就是同步的问题. 我们知道 PHP本身是不支持多线程的. 所以更不会有什么像

    Java 中synchronize的方法了. 那我们该如何做呢.

    1. 尽量不访问同一个资源. 以避免冲突. 但是可以同时像数据库操作. 因为数据库是支持并发操作的. 所以在多线程的PHP中

    不要向同一个文件中写入数据. 如果必须要写的话, 用别的方法进行同步.. 如调用 flock对文件进行加锁等. 或建立临时文件

    并在另外的线程中等待这个文件的消失 while(file_exits('xxx')); 这样就等于这个临时文件存在时, 表示其实线程正在操作

    如果没有了这个文件, 说明其它线程已经释放了这个.

    2. 尽量不要从runThread在执行fputs后取这个socket中读取数据. 因为要实现多线程, 需要的用非阻塞模式. 即在像fgets这

    样的函数时立即返回.. 所以读写数据就会出问题. 如果使用阻塞模式的话, 程序就不算是多线程了. 他要等上面的返回才执行

    下面的程序. 所以如果需要交换数据最后利用外面文件或数据中完成. 实在想要的话就用socket_set_nonblock($fp) 来实现.


    说了这么多, 倒底这个有没有实际的意义呢? 在什么时候需要这种用这种方法呢 ?

    答案是肯定的. 大家知道. 在一个不断读取网络资源的应用中, 网络的速度是瓶颈. 如果采多这种形式就可以同时以多个线程对

    不同的页面进行读取.

    本人做的一个能从8848、soaso这些商城网站搜索信息的程序。还有一个从阿里巴巴网站上读取商业信息和公司目录的程序也用到

    了此技术。 因为这两个程序都是要不断的链接它们的服务器读取信息并保存到数据库。 利用此技术正好消除了在等待响应时的瓶

    颈。


    仅以此抛砖引玉, 希望大家多来讨论~~~~~~~

    发表于 @ 2004年10月29日 20:01:00|评论(loading...)|编辑

    新一篇: 程序员的“素质”是什么?  | 旧一篇: 关于PHP--session的问题集锦解决方案

    评论

    #网络隐士 发表于2004-11-02 17:19:00  IP: 220.248.6.*
    晕,用Python, Perl做比较好啊
    #猪 发表于2005-01-17 23:35:00  IP: 211.139.62.*
    你个猪,你以为你取了日本猪的名字,你就是日本猪了??!!
    #猪 发表于2005-01-17 23:36:00  IP: 211.139.62.*
    你个猪,你以为你取了日本猪的名字,你就是日本猪了??!!
    #请输入尊姓大名 发表于2005-02-04 00:00:00  IP: 218.19.159.*
    唉,你有病
    #网络名词 发表于2005-03-03 14:29:00  IP: 221.201.65.*
    这不是“多线程”,是“多进程”吧。。。
    进程多了,机器会死悄悄的,我做的一个NetSpider就是这样做的,我服务器就越来越慢了,后来我对同时下载数做了限制,才‘好了一点点’.... 我还是用Java Application来做比较好一些。
    #neoedmund 发表于2005-03-25 16:52:00  IP: 61.155.111.*
    !?好像是的哦。
    if($_GET['act'] == 'a')
    {
    runThread();
    a();
    }
    else if($_GET['act'] == 'b') b();
    有点像linux的fork(),我真是佩服你啊。
    不过不知道会不会受timeout的影响?。。。
    #电加热器 发表于2005-06-01 12:48:00  IP: 61.186.252.*
    有点意思!
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 六道