`
xieye
  • 浏览: 834825 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

swoole学习定时器和任务投递

阅读更多
今天学习swoole的定时器。
安装swoole的环境不在本文讨论内容内,建议使用万能的docker。

需求是,用浏览器打开一个页面。

有文本框,如填写一个数字,服务器得到这个数字,加1返回给浏览器。如果是文字,就直接返回文字。

同时,服务器有自己的定时器。
这些代码只为学习,本身逻辑无意义。

任务的学习:每次,服务器接到浏览器的请求,会生成一个任务并自己执行:任务就是显示一个任务id,并没有什么。

服务端共有两个程序:http_server.php和 ws_server.php
其中http_server.php,只为了给浏览器一些js代码,而ws_server是完成上面的需求的。

代码如下:
http_server.php
<?php
$http = new swoole_http_server("0.0.0.0", 8000);

$html=<<<html
<script src='https://cdn.bootcss.com/jquery/3.2.1/jquery.slim.min.js'></script>
<script>
var wsServer = 'ws://192.168.99.100:9501';
var websocket = new WebSocket(wsServer);
websocket.onopen = function (evt) {
    console.log("Connected to WebSocket server.");
};

websocket.onclose = function (evt) {
    console.log("Disconnected");
};

websocket.onmessage = function (evt) {
    console.log('Retrieved data from server: ' + evt.data);
};

websocket.onerror = function (evt, e) {
    console.log('Error occured: ' + evt.data);
};

function aa(){
  websocket.send($('#t1').val() );
}
</script>
<div>
<textarea id='t1'></textarea>
<button onclick="aa()" >button</button>
</div>
<div id='div1'></div>
html;

$http->on('request', function  ($request, $response) use ($html) {
    var_dump($request->get, $request->post);
    $response->header("Content-Type", "text/html; charset=utf-8");
    $response->end("<h1>Hello Swoole </h1>\n".$html);
});
$http->set(['daemonize'=>1]);
$http->start();




ws_server.php
<?php
// 创建websocket服务器对象,监听0.0.0.0:9502端口
$ws = new swoole_websocket_server ( "0.0.0.0", 9501 );
$ws->set ( array (
    'task_worker_num' => 4 
) );

// 监听WebSocket连接打开事件
$ws->on ( 'open', function ($ws, $request) {
    echo  "请求的fd:". $request->fd ."\n" ;
    $ws->push ( $request->fd, "hello, welcome\n" );
} );

// 监听WebSocket消息事件
$ws->on ( 'message', function ($ws, $frame) {
    echo "接收到Message: {$frame->data}\n";
    
    
    if (is_numeric($frame->data )) {
        $v = $frame->data + 1;
    } else {
        $v = $frame->data;
    }
    
    $ws->push ( $frame->fd, "server: {$v}" );
    
    $task_id = $ws->task ( $v );
    echo "Dispath AsyncTask: id=$task_id\n";
} );

// 监听WebSocket连接关闭事件
$ws->on ( 'close', function ($ws, $fd) {
    echo "client-{$fd} is closed\n";
} );

// 处理异步任务
$ws->on ( 'task', function ($serv, $task_id, $from_id, $data) {
    echo "New AsyncTask[id=$task_id]" . PHP_EOL;
    // 返回任务执行的结果
    $serv->finish ( "$data -> OK" );
} );

// 处理异步任务的结果
$ws->on ( 'finish', function ($serv, $task_id, $data) {
    echo "AsyncTask[$task_id] Finish: $data" . PHP_EOL;
} );

// 这是服务器自己的定时器。
$process = new swoole_process ( function () {
    swoole_timer_tick ( 5000, function () {
        echo date ( "H:i:s" ) . "swoole_timer_tick. \n";
    } );
} );
$ws->addProcess ( $process );

$ws->start ();


在服务器shell下。执行
php http_server.php
php ws_server.php

然后,浏览器打开
http://192.168.99.100:8000/

效果:
服务端效果如下:



浏览器效果如下:注意是显示在控制台。








  • 大小: 20.9 KB
  • 大小: 22.4 KB
0
0
分享到:
评论

相关推荐

    php的swoole拓展定时器+websocket客户端demo

    php的swoole拓展定时器+websocket客户端demo

    swoole-crontab-master.基于swoole的定时器程序,支持秒级处理

    在Swoole中,可以通过`Swoole\Timer`类设置定时器,这个类提供了`tick`和`after`两个方法,分别用于创建周期性和单次执行的定时器。`tick`函数会在指定的时间间隔后重复调用回调函数,而`after`函数则只会在指定时间...

    swoole学习文档

    1. 进程(Process)与线程(Thread):Swoole支持多进程和多线程模型,可以创建主进程、工作进程、守护进程等,同时提供线程池来优化CPU密集型任务的处理。 2. 事件驱动(Event-driven):Swoole基于Reactor模式...

    swoole-crontab:基于swoole的定时器程序,支持秒级处理

    基于swoole的定时器程序,支持秒级处理. 异步多进程处理。 完全兼容crontab语法,且支持秒的配置,可使用数组规定好精确操作时间 单中心-多客户端模式,能够横向扩展 web界面管理,增删改查任务,完整的权限控制. 请使用...

    使用swoole 定时器变更超时未支付订单状态的解决方案

    综上所述,本文介绍的使用 swoole 定时器和 Redis 的 zset 来变更超时未支付订单状态的解决方案,在处理大规模订单的场景下是一个内存占用小且效率高的方法。当然,在选择这种方案之前,企业需要根据自身的业务需求...

    PHP框架Swoole定时器Timer特性分析

    Swoole框架中的定时器Timer是一个非常有用的组件,它可以让开发者在不依赖外部定时任务调度工具如cronjob的情况下,在程序内部实现定时任务的调度和执行。以下是关于Swoole Timer特性的详细知识点: 1. **定时器的...

    swoole 异步定时任务器-swoole-timers.zip

    Swoole定时器有两种类型:周期性定时器和一次性定时器。 1. **一次性定时器(One-time Timer)**:设置在特定时间后执行一次的定时器。使用`swoole_timer_after`函数创建,例如: ```php $timer_id = swoole_...

    Swoole实现异步投递task任务案例详解

    本文实例讲述了Swoole实现异步投递task任务案例。分享给大家供大家参考,具体如下: 【使用场景】  Swolle的task模块可以用来做一些异步的慢速任务、耗时场景。如webim中发广播,发送邮件等,把这些任务丢给task...

    基于thinkphp框架的定时器(定时执行任务)

    本篇将详细介绍如何在ThinkPHP中设置和使用定时器来定时执行任务。 一、定时任务的概念与作用 定时任务,也称为Cron Job,在服务器环境中常用于定期执行某些脚本或程序,以实现自动化工作流程。ThinkPHP中的定时...

    Swoole异步并行和协程C扩展 v4.8.13.zip

    "swoole-v4.8.13"可能是Swoole源码的目录,对于学习和理解Swoole的内部工作原理,以及进行二次开发或定制,阅读源码是非常有价值的。 综上所述,Swoole异步并行和协程C扩展是一个强大且功能丰富的工具,适用于需要...

    yii2 console 集成swoole 执行异步任务,例如注册邮件,发送短信

    总之,通过Yii2 Console集成Swoole,我们可以充分利用Swoole的异步能力,将耗时的注册邮件发送和短信通知任务放到后台执行,提升系统的响应速度和用户体验。这个过程涉及到Yii2 Console命令的创建、Swoole服务器的...

    Swoole框架PHP 异步网络通信引擎swoole-v5.1.2.zip

    4. 调度任务:Swoole的定时器功能可以实现定时任务,如定时发送邮件、清理缓存等。 总之,Swoole框架在PHP中扮演着重要的角色,它不仅弥补了PHP在处理异步任务上的不足,还带来了更高的性能和更低的资源消耗。...

    Swoole入门教程及文档

    * Timer定时器:Swoole提供了Timer定时器,允许开发者执行定时任务。 * 心跳检测:Swoole提供了心跳检测机制,用于检测worker进程的存活状态。 三、Swoole多端口监听 * 监听多个端口:Swoole可以监听多个端口,...

    Laravel开发-swoole

    9. **定时任务**: Swoole的定时器功能允许开发者设置周期性任务,无需借助外部工具如Cron Job。 10. **内存管理**: Swoole支持数据持久化到内存,减少了磁盘I/O,提升了数据读写速度。 **文件名解析** "压缩包子...

    php_swoole_loader_php73_nzts_x64.zip

    5. **定时器(Timer)**:Swoole提供定时器功能,可以设置定时任务,达到定时执行某些操作的效果。 6. **内存表(Memory Table)**:Swoole内存表是一种高效的内存数据存储结构,用于在不同工作进程间共享数据。 7...

    cpp-一个swoole的简单实现学习swoole源码的练习之作

    对于初学者来说,分析和学习这个项目将有助于掌握Swoole的核心概念,并为后续的网络编程或高性能服务器开发打下坚实的基础。 总结起来,这个项目旨在通过实践来学习Swoole源码,理解异步网络编程、事件驱动模型、...

    swoole-doc-master.zip

    Swoole-doc-master.zip文件包含了全面的Swoole官方文档,是学习和掌握Swoole的宝贵资源。本文将围绕Swoole的核心概念、功能特性、使用方法以及在实际项目中的应用场景展开详细介绍。 一、Swoole基础 Swoole是一个为...

    php7及以上版本 swoole扩展

    4. **异步任务和定时器**: - **异步任务**:Swoole允许将耗时的任务投递到单独的工作进程或者线程中处理,避免阻塞主线程。 - **定时器**:通过`addTimer`函数设置定时任务,可以在指定间隔后执行回调函数。 5. ...

Global site tag (gtag.js) - Google Analytics