<?php

include 'vendor/autoload.php';

class server
{
private $serv;
private $db; /**
* [__construct description]
* 构造方法中,初始化 $serv 服务
*/
public function __construct()
{
$this->serv = new swoole_server('0.0.0.0', 9501);
//初始化swoole服务
$this->serv->set(array(
'worker_num' => 1,
'daemonize' => false, //是否作为守护进程,此配置一般配合log_file使用
'max_request' => 1000,
'log_file' => './swoole.log',
'task_worker_num' => 2
)); //设置监听
$this->serv->on('Start', array($this, 'onStart'));
$this->serv->on('WorkerStart', array($this, 'onWorkerStart'));
$this->serv->on('Connect', array($this, 'onConnect'));
$this->serv->on("Receive", array($this, 'onReceive'));
$this->serv->on("Close", array($this, 'onClose'));
$this->serv->on("Task", array($this, 'onTask'));
$this->serv->on("Finish", array($this, 'onFinish')); //开启
$this->serv->start();
} /**
* 连接MySQL
*/
public function connect()
{
$this->db = new medoo([
'database_type' => 'mysql',
'database_name' => 'xxxx',
'server' => '127.0.0.1',
'username' => 'root',
'password' => 'xxxxx',
'prefix' => '',
'charset' => 'utf8'
]);
} /**
* 在worker启动的时候,创建MySQL连接池
* @param $ser
* @param $worker_id
*/
public function onWorkerStart($ser, $worker_id)
{
if ($ser->taskworker) {
$this->connect();
echo "taskWorker Starting ." . spl_object_hash($this->db) . ".........\n";
} else {
echo 'wokerStart...db has=>' . PHP_EOL;
}
} public function onStart($serv)
{
echo SWOOLE_VERSION . " onStart\n";
} public function onConnect($serv, $fd)
{
echo $fd . "Client Connect.\n";
} /**
* 这个发生在worker进程中,当接受到来自mater进程中reactor线程转发过来的客户端
* @param $serv
* @param $fd
* @param $from_id
* @param $data
*/
public function onReceive($serv, $fd, $from_id, $data)
{
echo "Get Message From Client {$fd}:{$data}\n";
$param = array(
'fd' => $fd
);
$serv->task(json_encode($param));
echo "Continue Handle Worker\n";
} public function onClose($serv, $fd)
{
echo "Client Close.\n";
} /**
* 异步任务,用来生成csv表格数据导出
* @param $serv
* @param $task_id
* @param $from_id
* @param $data
* @return string
*/
public function onTask($serv, $task_id, $from_id, $data)
{
echo "This Task {$task_id} from Worker {$from_id}\n";
for ($i = 0; $i < 2; $i++) {
$all_pager = $this->db->count('dtb_checking');
echo '总条数:' . $all_pager . PHP_EOL;
// 其实这里需要判断是否是连接超时,等一系列操作,但是这里就是为了测试数据库连接失效情况。
if ($all_pager === false) {
echo '重新连' . PHP_EOL;
$this->connect();
continue;
}
$fp = fopen(__DIR__ . DIRECTORY_SEPARATOR . rand() . '.csv', 'w');
$page_size = 500;
$page = ceil($all_pager / $page_size);
for ($p = 1; $p <= $page; $p++) {
echo '第' . $p . '页' . PHP_EOL;
$start = ($p - 1) * $page_size;
$list = $this->db->select('dtb_checking', ['id', 'real_name', 'account_no'], ['LIMIT' => [$start, 500]]);
foreach ($list as $k => $row) {
$temp = [
iconv('utf-8', 'gbk', $row['id']),
iconv('utf-8', 'gbk', $row['real_name']),
iconv('utf-8', 'gbk', $row['account_no']),
];
fputcsv($fp, $temp);
}
}
break;
}
return "Task {$task_id}'s result";
} public function onFinish($serv, $task_id, $data)
{
echo "Task {$task_id} finish\n";
echo "Result: {$data}\n";
}
} $server = new server();

swoole异步任务数据报表生成的更多相关文章

  1. ASP模拟POST请求异步提交数据的方法

    这篇文章主要介绍了ASP模拟POST请求异步提交数据的方法,本文使用MSXML2.SERVERXMLHTTP.3.0实现POST请求,需要的朋友可以参考下 有时需要获取远程网站的某些信息,而服务器又限 ...

  2. flask+sqlite3+echarts3+ajax 异步更新数据

    结构: /www | |-- /static |....|-- jquery-3.1.1.js |....|-- echarts.js(echarts3是单文件!!) | |-- /templates ...

  3. 串行通讯之.NET SerialPort异步写数据

    目录 第1章说明    2 1 为什么需要异步写数据?    2 2 异步写数据的代码    2 3 源代码    4 第1章说明 1 为什么需要异步写数据? 如下图所示,以波特率300打开一个串口. ...

  4. 使用load()方法异步请求数据

    使用load()方法通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,它的调用格式为: load(url,[data],[callback]) 参数url为加载服务器地址,可选项d ...

  5. C# 实现的多线程异步Socket数据包接收器框架

    转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...

  6. nettyclient异步获取数据

    源代码见,以下主要是做个重要代码记录 http://download.csdn.net/detail/json20080301/8180351 NETTYclient获取数据採用的方式是异步获取数据, ...

  7. jQuery选取所有复选框被选中的值并用Ajax异步提交数据

    昨天和朋友做一个后台管理系统项目的时候涉及到复选框批量操作,如果用submit表单提交挺方便的,但是要实现用jQuery结合Ajax异步提交数据就有点麻烦了,因为我之前做过的项目中基本上没用Ajax来 ...

  8. echarts异步数据加载(在下拉框选择事件中异步更新数据)

    接触echarts 大半年了,从不会到熟练也做过不少的图表,隔了一段时间没使用这玩意,好多东西真心容易忘了.在接触echarts这期间也没有总结什么东西,今天我就来总结一下如何在echart中异步加载 ...

  9. 从壹开始前后端分离 [ vue + .netcore 补充教程 ] 二九║ Nuxt实战:异步实现数据双端渲染

    回顾 哈喽大家好!又是元气满满的周~~~二哈哈,不知道大家中秋节过的如何,马上又是国庆节了,博主我将通过三天的时间,给大家把项目二的数据添上(这里强调下,填充数据不是最重要的,最重要的是要配合着让大家 ...

随机推荐

  1. Linux性能测试 top命令

    原文地址:http://www.cnblogs.com/txw1958/archive/2012/07/25/linux-top-command.html top命令是Linux下常用的性能分析工具, ...

  2. Ubuntu安装配置Qt 4.86环境

    安装 QT4.8.6库+QT Creator 2.4.1 下载地址公布 QT4.8.6库  http://mirrors.hustunique.com/qt/official_releases/qt/ ...

  3. C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)

    白杨 http://baiy.cn 在我几年前开始写<C++编码规范与指导>一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了.没想到时隔几年以后才有机会把这个尾巴补完 :- ...

  4. dedecms织梦出现“Upload filetype not allow”原因和解决方案

    资源:武汉科技有限公司倍频猫 我最近升级DEDE5.6出现此问题后.和解决的方法. 假设有同学是按某些朋友用删除代码的方法解决这个问题的话,建议你修正此做法,毕竟这是有非常大安全风险的.而DEDE本身 ...

  5. WPF 4 TextBox 笔刷特效

    原文:WPF 4 TextBox 笔刷特效      TextBox 控件是我们开发过程中必不可少的组件,它可以使应用程序方便的与用户进行文字交互.在新WPF 4 中又为TextBox 添加了两种新笔 ...

  6. 读BeautifulSoup官方文档之html树的搜索(2)

    除了find()和find_all(), 这里还提供了许多类似的方法我就细讲了, 参数和用法都差不多, 最后四个是next, previous是以.next/previous_element()来说的 ...

  7. c# 全局钩子实现扫码枪获取信息。

    原文:c# 全局钩子实现扫码枪获取信息. 1.扫描枪获取数据原理基本相当于键盘数据,获取扫描枪扫描出来的数据,一般分为两种实现方式. a)文本框输入获取焦点,扫描后自动显示在文本框内. b)使用键盘钩 ...

  8. 【C#】WindowsAPICodePack-Shell使用教程

    原文:[C#]WindowsAPICodePack-Shell使用教程 1.首先在项目中添加WindowsAPICodePack的Nuget包.   点击安装即可. 2.获取<我的电脑>的 ...

  9. redis zincrby zadd 遇到的问题

    在维护代理池时 报错1: zincrby(REDIS_KEY,proxy,-1)redis.exceptions.ResponseError: value is not a valid float 查 ...

  10. liunx 系统 一键安装

    本文转自:http://hi.baidu.com/iamcyh/item/e777eb81ba90ed5a26ebd9b0 linux VPS环境(MySQL/Apache/PHP/Nginx)一键安 ...