文档章节

php模拟js单线程异步(setTimeout)

dubox
 dubox
发布于 2017/03/30 18:09
字数 171
阅读 19
收藏 0
<?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

 */

 

© 著作权归作者所有

共有 人打赏支持
dubox
粉丝 4
博文 98
码字总数 28307
作品 0
西安
程序员
私信 提问
Javascript是单线程的深入分析

面试的时候发现99%的童鞋不理解为什么JavaScript是单线程的却能让AJAX异步发送和回调请求,还有setTimeout也看起来像是多线程的?还有non-blocking IO, event loop等概念很不清楚。来深入分析...

stone_
2014/04/15
0
0
JavaScript可否多线程? 深入理解JavaScript定时机制

JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( function(){ alert(’你好...

李长春
2012/11/09
0
0
JavaScript可否多线程? 深入理解JavaScript定时机制

JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( function(){ alert(’你好...

李长春
2012/11/09
0
0
JavaScript定时机制setTimeout与setInterval研究

容易欺骗别人感情的JavaScript定时器 本文转自:爱微网 JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都...

西西爱OS
2012/10/25
0
0
一篇文章读懂JavaScript的EventLoop

JavaScript的单线程 众所周知JavaScript程序是单线程的执行,也就是说,同一时刻只能做一件事,这也是由于JavaScript本身就是为了浏览器而生,主要用途是用户交互和操作dom,为什么是单线程?...

阳光的记忆
2018/05/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Oracle学习日志-7(聚合查询)

GROUP BY子句: GROUP BY可以对表进行分割。比如把下面的表按照商品种类进行分割,并列出该商品种类下有多少商品 SQL代码如下 SELECT product_type ,COUNT(*)FROM ProductGROUP BY produc...

白话
29分钟前
1
0
Docker安装mysql8主从结构

准备两台服务器,假设IP地址为 172.31.27.67 主服务器 172.31.27.69 从服务器 因为我用的镜像是docker.io/cytopia/mysql-8.0,所以我们需要先把该镜像给pull下来。 docker pull docker.io/cy...

算法之名
32分钟前
8
0
Springboot集成Ehcache缓存(主要用在登录后做保持会话验证)

EhCache是一个比较成熟的Java缓存框架,最早从hibernate发展而来, 是进程中的缓存系统,它提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案,快速简单。 Springbo...

Nonry
34分钟前
1
0
Ajax

1、创建ajax对象 if(window.navigator.userAgent.indexOf('MSIE') > 0){ var xhr = new ActiveXObject('Microsoft.XMLHTTP');}else{ var xhr = new XMLHttpRequest();} 2、get......

lujc
34分钟前
1
0
Flink的基石 : Chandy Lamport Algorithm

Flink处理“流”,对流消息的处理支持三种级别语义分别是“At Most once、At Least once、Exactly once”。 At Most onces:消息最多被处理一次,sender发出消息之后,receiver无论是否处理成...

tantexian
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部