由于php可以在不同的操作系统中分别以模块方式和cgi方式工作,而cgi方式只有进程。
所以php不能提供统一的多线程功能
只有在linux下以模块方式工作的php可以通过扩展库部分的实现“线程”
所以在此模拟一个多线程程序:大家一起探讨:
<?php
error_reporting(E_ALL);
set_time_limit(0);
printf( "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<br />");
/**
 * php多任务程序的实现
 * 借助proc_open
 * 其实该叫进程(process)
 * 能启动多进程,你可以使用你的想象力做你想做的了,以后再写个能用的
 * 如果你是在linux上跑php,并且启用pcntl模块后,使用pcntl函数该更好
 *
 * 在网上搜索很多关于php多任务的,中文的很难找到一个,找到的也多是瞎扯蛋
 */
class Thread {
    protected $_pref; // process reference    protected static $_instance = null;
    protected $_pipes;
    
    private function __construct() {
        $this->_pref = 0;
    }
    
    public static function getInstance($file) {
        if (null == self::$_instance) {
            self::$_instance = new self;
        }
        
        $descriptor = array(
        0 => array("pipe", "r"),
        1 => array("pipe", "w"),
        2 => array("file", "./error-output.txt", "a"),
        );
        self::$_instance->_pref = proc_open("php -q $file", $descriptor, self::$_instance->_pipes);
        return true;
    }
    
    public function __destruct() {
        proc_close($this->_pref);
        $this->_pref = null;
    }
}// 测试代码$file = __FILE__;if(empty($argv[1])) {
    $t2 = Thread::getInstance("$file 1");
    $t3 = Thread::getInstance("$file 2");
    $t4 = Thread::getInstance("$file 3");
    $t5 = Thread::getInstance("$file 4");
    $t5 = Thread::getInstance("$file 5");
    $t5 = Thread::getInstance("$file 6");
    $t2 = Thread::getInstance("$file 7");
    $t3 = Thread::getInstance("$file 8");
    $t4 = Thread::getInstance("$file 9");
    $t5 = Thread::getInstance("$file 10");
    $t5 = Thread::getInstance("$file 11");
    $t5 = Thread::getInstance("$file 12");
    echo "Main thread done\n";
} else {
    $somecontent = "\r\n//~~~~~~~~~~~~-这次请求序号是:" . $argv[1];
    sleep(mt_rand(0, 3));
    $handle = fopen($file, 'a+');
    fwrite($handle, $somecontent);
}
?>  

解决方案 »

  1.   

    现在php用的最多的地方,就是php的强项..
    用正确的语言做正确的事情.
    希望下个版本有多线程的功能...
      

  2.   

    几个脚本语言的多线程都不怎么样,jsp可能会好一些
      

  3.   

    理论上程序自身能保存当前执行环境的上下文就能模拟线程切换,不过这样有必要吗?
    还不如用python
      

  4.   

    python的线程其实不太好,GIL导致的问题很严重
      

  5.   

    php本来就有多线程,只不过只能用于linux下而已。这种功能本来就是平台相关的。php做为一个跨平台的语言不可能花大力气去发展这个。想要window下的多线程,等啥时有window爱好者去写扩展吧。
      

  6.   

    16楼的我想问一下在linux下怎么实现PHP的多线程阿???
      

  7.   

    我了个去,,fcntl_fork是创建子进程。。也是进程
    进程跟线程都没搞懂。