介绍swoft中
1、mysql、
2、Redis
一、mysql使用:
1、配置,在 app\bean.php
文件中
'db' => [ 'class' => Database::class, 'dsn' => 'mysql:dbname=webdemo;host=localhost', 'username' => 'root', 'password' => 'foto_cj1', ],
//链接池配置 'db2.pool' => [ 'class' => Pool::class, 'database' => bean('db'), 'minActive' => 10, 'maxActive' => 20, 'maxWait' => 0, 'maxWaitTime' => 0, 'maxIdleTime' => 60, ],
2、生成Model,一个Model对应一张表。在 /App/Model/Entity/ 文件夹下新建文件
<?php declare(strict_types=1); namespace App\Model\Entity; use Swoft\Db\Annotation\Mapping\Column; use Swoft\Db\Annotation\Mapping\Entity; use Swoft\Db\Annotation\Mapping\Id; use Swoft\Db\Eloquent\Model; /** * * Class Demo * * @since 2.0 * * @Entity(table="demo",pool="db2.pool") //定义Model,参数是对应的表和连接池(选填) */ class Demo extends Model { /** *默认自动添加 created_at 和 updated_at,不需要时设置为false * @var bool */ public $modelTimestamps = false; /** * * @Id(incrementing=false) * @Column(name="id") //定义列 * * @var int */ private $id; /** * @Column(name="name") * * @var string|null */ private $name; /** * @param int $id * * @return void */ public function setId(int $id): void { $this->id = $id; } /** * @param string|null $name * * @return void */ public function setName(?string $name): void { $this->name = $name; } /** * @return int */ public function getId(): ?int { return $this->id; } /** * @return string|null */ public function getName(): ?string { return $this->name; } }
3、使用(Model)
//查询 $user = Demo::find($)->toArray(); //修改 $sdbuser = Demo::find($id); $sdbuser->setName("cjcjcjccj"); //或者 $sdbuser->update(['name' => "dddddd"]); //删除 $result = Demo::where('id', 1)->delete(); $user = Demo::find($data["uid"]); $result = $user->delete(); //插入 $count = new Demo(); $count->setId(mt_rand(1, 100)); $count->setName('attr'); $result = $count->save(); $nId = $count->getId(); //批量插入 $insArr = [ [ 'id' => random_int(1, 100), 'name' => md5(uniqid()) ], [ 'id' => random_int(1, 100), 'name' => md5(uniqid()) ] ]; $result = Demo::insert($insArr);
4、DB原生使用:https://www.swoft.org/docs/2.x/zh-CN/db/builder.html
二:Redis简单使用:
1、配置:在 app\bean.php
文件中
'redis' => [ 'class' => RedisDb::class, 'host' => '127.0.0.1', 'port' => 6379, 'database' => 0, 'option' => [ 'prefix' => 'swoft:' ] ], 'redis.pool' => [ 'class' => \Swoft\Redis\Pool::class, 'redisDb' => \bean('redis'), 'minActive' => 10, 'maxActive' => 20, 'maxWait' => 0, 'maxWaitTime' => 0, 'maxIdleTime' => 40, ]
2、使用
(1)、直接使用
Redis::set($key, $setData,$time);
Redis::get($key);
(2)、通过 @Inject注入连接池方式使用
在/App/Http/Controller/中新建文件
/** * Class RedisController * * @since 2.0 * @Controller("redis") */ class RedisController { /** * @Inject("redis.pool") * * @var Pool */ private $redis; /** * @return array * @RequestMapping("find") //访问路由: /redis/find * @throws \Throwable */ public function find() { $us = $this->redis->get('user'); if($us) $this->redis->set('user', ["name" => "gimi", "age" => "18"],120); return $us; } }
三:Task任务:
1、配置,在 app/bean.php文件中加入
'httpServer' => [ // ... 'on' => [ SwooleEvent::TASK => \bean(TaskListener::class), // Enable task must task and finish event SwooleEvent::FINISH => \bean(FinishListener::class) ], /* @see HttpServer::$setting */ 'setting' => [ 'task_worker_num' => 12, 'task_enable_coroutine' => true, 'worker_num' => 2 ] ],
2、定时任务
1、安装 composer require swoft/crontab 2、配置 'httpServer' => [ // ... 'process' => [ 'crontab' => bean(Swoft\Crontab\Process\CrontabProcess::class) ], // ... ], 3、定义,在/app/Task/Crontab/ 文件夹中新建文件 <?php namespace App\Task\Crontab; use Swoft\Crontab\Annotaion\Mapping\Cron; use Swoft\Crontab\Annotaion\Mapping\Scheduled; /** * Class DemoCronTask * @package App\Task\Crontab * * @Scheduled(name="demoCronTask") //声明定时任务 */ class DemoCronTask{ /** * @Cron("*") //每秒执行 */ public function secondTask(){ var_dump("--111----",date('Y-m-d H:i:s', time())); } /** * @Cron("0 * * * * *") //每分钟执行 */ public function miunteTask(){ var_dump("222------",date('Y-m-d H:i:s', time())); } }
3、协程、异步任务
(1)、声明一个任务,在 /app/Task/Task/ 文件夹新建文件
<?php declare(strict_types=1); namespace App\Task\Task; use Swoft\Task\Annotation\Mapping\Task; use Swoft\Task\Annotation\Mapping\TaskMapping; /** * Class DemoTask * * @since 2.0 * @Task(name="demoV2Task") //标记类是一个任务 */ class DemoTask { /** * @TaskMapping(name="list") //映射名称 * * @param int $id * @param string $default * * @return array */ public function getList(int $id): array { var_dump("------------"); sleep(5); return [ 'list' => [1, 3, 3], 'id' => $id ]; } /** * @param int $id * @return bool * * @TaskMapping(name="putLists") */ public function putList(int $id) : bool { if($id > 5) return true; return false; } }
(2)、任务投递
// 协程投递 $data = Task::co('demoV2Task', 'list', [12]); //异步投递 $data = Task::async('demoV2Task', 'list', [12]);
(3)、异步投递如果需要关注异步任务处理结果,可以添加监听器,在文件夹 /app/Task/Listener/ 下新建文件
<?php namespace App\Task\Listener; use Swoft\Log\Helper\CLog; use function context; use Swoft\Event\Annotation\Mapping\Listener; use Swoft\Event\EventHandlerInterface; use Swoft\Event\EventInterface; use Swoft\Task\TaskEvent; /** * Class DemoListener * @package App\Task\Listener * @Listener(event=TaskEvent::FINISH) //参数必须带Finsh */ class DemoListener implements EventHandlerInterface{ /** * @param EventInterface $event * * @throws \Swoft\Exception\SwoftException */ public function handle(EventInterface $event): void { // TODO: Implement handle() method. $fId = context()->getTaskUniqid(); // var_dump($fId); CLog::info(\context()->getTaskUniqid()); $taskData = context()->getTaskData(); // var_dump($taskData); CLog::info(\context()->getTaskData()); } }
注意:Task中有两个地方还未清楚
1、协程投递时是阻塞。
2、异步监听的地方,所有监听器只有带了参数 @Listener(event=TaskEvent::FINISH) 都会执行一遍。
查看文档:
https://www.swoft.org/docs/2.x/zh-CN/db/index.html
https://www.swoft.org/docs/2.x/zh-CN/redis/index.html
https://www.swoft.org/docs/2.x/zh-CN/task/index.html