php模拟并发

本文探讨了PHP模拟并发的概念,通过对比阻塞和非阻塞模式的处理时间,阐述了非阻塞模式的优势。虽然PHP本身不支持多线程,但可以通过Linux和Apache的多线程能力实现模拟,如使用PHP+Shell或PHP+pcntl扩展(仅限Unix-like OS的CLI模式)。
摘要由CSDN通过智能技术生成

并发请求理论描述:假设有一个client,程序逻辑是要请求三个不同的server,处理各自的响应。传统模型当然是顺序执行,先发送第一个请求,等待收到响应数据后再发送第二个请求,以此类推。就像是单核CPU,一次只能处理一件事,其他事情被暂时阻塞。而并发模式可以让三个server同时处理各自请求,这就可以使大量时间复用。

画个图更好说明问题:

前者为阻塞模式,忽略请求响应等时间,总耗时为700ms;而后者非阻塞模式,由于三个请求可以同时得到处理,总耗时只有300ms。所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回。所谓非阻塞方式non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高。

php本身是不支持多线程的,但是它可以利用linux和apache的多线程能力。php模拟的多线程其实只是多进程,并不是真正的多线程。以下是几种php模拟多线程的方法:
1.php+shell (利用linux os)

php代码(test.php):

<?php
for($i = 0; $i < 10; $i++)
{
    echo $i;
    sleep(5); //这里为了方便看效果sleep一下让脚本执行时间更长
}
?>
shell代码(test.sh):

#!/bin/bash
for i in 1 2 3 4 5
do
    /usr/bin/php -r -q test.php &
done
注意:
在请求php代码的那行末尾有一个&符号,这个是关键,不加的话是不能进行多线程的,&表示将服务推送到后台执行,因此在shell的每次的循环中不必等php的代码全部执行完在请求下一个文件,而是同时进行的,这样就实现了多线程,下面运行下shell看下效果,这里你将看到5个test.php进程,再利用linux的定时器,定时请求这个shell,在处理一些需要多线程的任务,例如,批量下载时,非常好用!
参考:http://blog.csdn.net/tianmohust/article/details/8208627

2.php+pcntl(利用linux os)
只能用在Unix Like OS,Windows不可用。且推荐仅仅在CLI模式运行,不要在WEB服务器环境运行。

<?php
declare(ticks=1);
//是否等待进程结束
$bWaitFlag = FALSE;
//进程总数
$intNum = 10;
//进程PID数组
$pids = array();
echo ("Start\n");
for($i = 0; $i < $intNum; $i++)
{
    //产生子进程,而且从当前行之下开试运行代码,而且不继承父进程的数据信息
    $pids[$i] = pcntl_fork();
    if( ! $pids[$i])
    {
        //子进程进程代码段_Start
        $str = "";
        sleep(5+$i);
        for ($j = 0; $j < $i; $j++)
        {
            $str .= "*";
        }
        echo "$i -> " . time() . " $str \n";
        exit();
        //子进程进程代码段_End
    }
}

if ($bWaitFlag)
{
    for($i = 0; $i < $intNum; $i++)
    {
        pcntl_waitpid($pids[$i], $status, WUNTRACED);
        echo "wait $i -> " . time() . "\n";
    }
}
echo ("End\n");
?>
运行结果如下:

[qiao@oicq qiao]$ php test.php        
Start
End
[qiao@oicq qiao]$ ps -aux | grep "php"
qiao      32275   0.0   0.5 49668 6148 pts/1     S     14:03    0:00 /usr/local/php4/b
qiao      32276   0.0   0.5 49668 6152 pts/1     S     14:03    0:00 /usr/local/php4/b
qiao      32277   0.0   0.5 49668 6152 pts/1     S     14:03    0:00 /usr/local/php4/b
qiao      32278   0.0   0.5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值