php 直播功能如何实现_PHP常驻内存,如何实现简单统计计数功能?

本文介绍了如何利用Swoole扩展使PHP常驻内存,从而实现HTTP请求的访问计数。通过示例代码展示了在Swoole的进程模型下,如何正确地进行计数,解释了计数未正常增加的原因,并提出了单进程内计数的解决方案。对于多进程和集群环境,文章提示可能需要回归传统方法,如使用DB或Redis等组件进行计数。
摘要由CSDN通过智能技术生成

对于http请求,我们通常是如何实现访问计数呢?

因为用户的每次请求都是独立的,所以server端计数一般通过session或第三方组件实现,如db或redis之类的!

php常驻内存后,计数功能是不是可以直接内存计数呢?

php常驻内存我们,是通过扩展swoole来实现,下面是一个简单的http服务

http server

$i=0;    $http = new SwooleHttpServer("127.0.0.1", 9501);    $http->on("start", function ($server) {        echo "Swoole http server is started at http://127.0.0.1:9501";    });    $http->on("request", function ($request, $response) use ($i) {   $i++;        echo "访问次数:$i";              $response->header("Content-Type", "text/plain");        $response->end("Hello World");    });    $http->start();

使用 curl localhost:9501 来访问测试

结果

访问次数:1访问次数:1访问次数:1

次数并没有增加?

改为静态变量 ,static $i = 0;

结果依旧

访问次数:1访问次数:1访问次数:1

仍然不能实现我们要的目的

这是为什么呢,想知道原因,我们先了解一下swoole的工作机制,如图:

d887a6c0ea4c649a045bcbfa2eb028a9.png

swoole进程模型

然后把进程ID打印出来

<?phpecho "main pid is ". getmypid(). "";    //高性能HTTP服务器    $http = new SwooleHttpServer("127.0.0.1", 9501);    $http->on("start", function ($server) {        echo "Swoole http server is started at http://127.0.0.1:9501";    });    $http->on("request", function ($request, $response) {        echo "worker pid is ". getmypid(). "";    $i++;    echo "访问次数:$i";        $response->header("Content-Type", "text/plain");        $response->end("Hello World");    });    $http->start();?>

运行结果

main pid is 122278Swoole http server is started at http://127.0.0.1:9501worker pid is 122281访问次数:1

查看一下系统进程

6f683680d022c0c81d4fd09b122c0ba1.png

进程

可以看到,我们定义的$i是在master进程,而$i++是在worker进程,所以每次回调request的$i总是0.

明白了swoole运行机制,我们把代码这样修改

$http->on("request", function ($request, $response) {    static  $i;    echo "worker pid is ". getmypid(). "";    $i++;    echo "访问次数:$i";        $response->header("Content-Type", "text/plain");        $response->end("Hello World");    });

这次的运行结果:

worker pid is 122593访问次数:1worker pid is 122593访问次数:2worker pid is 122593访问次数:3worker pid is 122593访问次数:4

可以正常计数了。

这是单进程内的计数,那么 多进程内 、集群又该怎么办呢,可能又要回到传统的方法了!

欢迎同行拍砖交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值