php模拟js单线程异步(setTimeout)
博客专区 > dubox 的博客 > 博客详情
php模拟js单线程异步(setTimeout)
dubox 发表于1年前
php模拟js单线程异步(setTimeout)
  • 发表于 1年前
  • 阅读 15
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

<?php


$GLOBALS['setTimeoutFn'] = [];

function msectime()
{
    list($msec, $sec) = explode(' ', microtime());
    return (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
}

function setTimeout($fn , $time_out = 0){

    $exe_time = msectime() + $time_out; //这里记录将要执行的时间点 而不是等待时间
    $GLOBALS['setTimeoutFn'][$exe_time.substr(md5(microtime()) ,1,5)] = [
        'fn' => $fn,
        'exe_time' => $exe_time,
    ];
}

function onEnd(){
    $setTimeoutFn = $GLOBALS['setTimeoutFn'];
    ksort($setTimeoutFn);   //排序 

    while(count($setTimeoutFn)){

        $now = array_shift($setTimeoutFn);

        if($now['exe_time'] <= msectime()){
            $now['fn']();
        }else{
            usleep( ($now['exe_time'] - msectime()) * 1000 );
            $now['fn']();
        }

    }

}


setTimeout(function(){
    echo 'sto1:'.msectime().'<br>';
} , 3000);

//do something
for($i=0;$i<10000;$i++){
    $t = msectime();
}
echo '$t:'.$t.'<br>';

setTimeout(function()use($t){
    echo 'sto2:'.msectime().'<br>';
} , 10);

echo '--------------------------------<br>';


/**
 * 所有代码执行完毕 再执行异步函数
 * js中一样要等到主线程空闲才会执行异步函数
 **/
onEnd();

/**
输出:
$t:1490867753698
--------------------------------
sto2:1490867753710
sto1:1490867756652

 */

 

标签: PHP Javassist
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 1
博文 64
码字总数 18711
×
dubox
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: