2018-09-29 11:04:56    362    0    0

序言

这里的多库是指数据不同的两个库

并不是数据相同的主从多库

多库的配置非常简单, 只涉及到配置文件和两个类PoolConfig Pool

配置文件

编辑配置文件 config/properties/db.php
新增数据库配置

  1. 'dev' => [
  2. 'master' => [
  3. 'name' => 'master2',
  4. 'uri' => [
  5. '192.168.1.135:3306/test?user=tender&password=123456&charset=utf8',
  6. ],
  7. ],
  8. 'slave' => [
  9. 'name' => 'slave3',
  10. 'uri' => [
  11. '192.168.1.135:3306/test?user=tender&password=123456&charset=utf8',
  12. ],
  13. ],
  14. ],

加完如下
title

默认的masterslave应为default下的配置, 为了兼容历史版本

连接池配置类

新建app/Pool/Config/DevPoolConfig.php

  1. <?php
  2. namespace App\Pool\Config;
  3. use Swoft\Bean\Annotation\Bean;
  4. use Swoft\Bean\Annotation\Value;
  5. use Swoft\Db\Pool\Config\DbPoolProperties;
  6. /**
  7. * DevPoolConfig
  8. * @Bean()
  9. */
  10. class DevPoolConfig extends DbPoolProperties
  11. {
  12. /**
  13. * @Value(name="${config.db.dev.master.name}")
  14. * @var string
  15. */
  16. protected $name = '';
  17. /**
  18. * @Value(name="${c
Swoft    2018-08-09 11:11:32    364    0    0

IDE一定要装注解插件PHP Annotations


RequestResponse里的with...开头的方法会return 一个$this的克隆, 而不是修改本实体, 所以设置Cookie之类的时候要$response = $response->withCookie(...


配置文件等在onWorkerStart之前加载的文件, 重启后才生效


自定义注解时, 方法注解属性注解依赖于类注解。框架主动扫描类注解, 从类注解Wrapper类中获取应该扫描哪些方法注解属性注解


上传文件超大可以修改.envPACKAGE_MAX_LENGTH, 不建议用来处理大文件


生命周期不同于fpm, 注意执行管理全局变量, 防止内存泄漏


控制器属单例,其属性会被所有请求共享,比如一个请求修改,下个请求则会获得修改后的值


@Middleware 注解执行顺序是倒序(已提PR)


Response::withStatus方法取决于你的Response::Attribute['responseAttribute']是否有内容, 有的话强制为200 (开发者认为其他状态码无需返回内容)

Swoft 注解 AOP 手把手教你    2018-07-20 15:17:49    794    0    0

序言

前两篇关于Swoft RPC 的使用教程得到很多小伙伴的支持

并且反映网上很多关于Swoft 的讲解太过于深♂入, 很多小伙伴看不懂

这是很正常的, 因为开发者们对于使用难度的理解跟我们有些偏差

身为开发者自然知道如何使用, 认为不需要讲解 :P

所以很多关于Swoft 的讲解都是底层原理

那在这我就开一个大佬们不屑的新手向讲解教程 ( ̄_  ̄ )

叫做[手把手教你]系列

只要跟着一点点练习, 熟练使用是没问题滴

前置技能

  1. 会使用Swoft 的MVC
  2. 使用了Swoft 的注解
  3. 理解注解只是配置的另一种展现方式
  4. PHPstorm 安装了PHP Annotations 插件

下面就让我们开始吧

注解类

想要定义一个注解是非常简单的

新建注解类app\Module\Test\Annotations\Test.php

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: zcm
  5. * Date: 2018/7/21
  6. * Time: 12:47
  7. */
  8. namespace App\Module\Test\Annotations;
  9. /**
  10. * 测试注解
  11. * @Annotation
  12. * @Target("ALL")
  13. * @package Module\Test\Annotations
  14. */
  15. class Test
  16. {
  17. /**
  18. * @var string 构造参数
  19. */
  20. private $name = '';
  21. public function __construct(array $values)
  22. {
  23. if (isset($values['name'])) {
  24. $this->name = $values['name'];
  25. }
  26. }
  27. /**
  28. * @return string
  29. */
  30. public function getName(): string
  31. {
  32. return $this->name;
  33. }
  34. /**
  35. * @param stri
Swoft 微服务 RPC 手把手教你    2018-07-20 14:39:33    811    0    0

序言

Swoft Framework
基于 Swoole 原生协程的新时代 PHP 全栈式协程框架

Swoft 是什么?

Swoft 框架是首个基于Swoole 原生协程的新时代 PHP高性能协程全栈框架,内置协程网络服务器及常用的协程客户端,常驻内存,不依赖传统的 PHP-FPM

全异步非阻塞 IO 实现,以类似于同步客户端的写法实现异步客户端的使用,没有复杂的异步回调,没有繁琐的 yield,有类似 Go 语言的协程,灵活的注解

强大的全局依赖注入容器、完善的服务治理、灵活强大的 AOP、标准的 PSR 规范实现等

上面是官网描述, 感觉太官方, 我总结一下:

  • 常驻内存
  • 协程
  • 学习曲线平滑
  • 国内框架
  • 开箱即用的RPC

如何搭建微服务?

首先确保已经可以正确搭建Swoft

不清楚的可以查看Swoft 官方文档

鉴于每个人的开发环境都不同

这里选用官方Docker 作为开发环境

Docker下载地址>>>

拉Docker 镜像

  1. docker pull swoft/swoft

非常的简单
title
这样就是成功了

为了方便理解

我们把swoft 复制两份

命名为swoft-rpcswoft-http

swoft-rpc只开启TCP 服务
swoft-http只开启Http 服务

修改配置文件

把根目录的.env.example复制一份为.env

.env 文件为swoft 配置文件, 最高优先级(覆盖config 下配置)

http 用到的配置

  1. # Server
  2. PFILE=/tmp/swoft.pid
  3. PNAME=php-swoft
  4. TCPABLE=false //是否同时启动TCP 服务器,这里用不到改为false
  5. CRONABLE=false
  6. AUTO_RELOAD=true
  7. AUTO_REGISTER=false
  8. ...
  9. # HTTP
  10. HTTP_HOST=0.0.0.0 //监听的网卡
  11. HTTP_PORT=80 //监听的端口
  12. HTTP_MODE=SWOOLE_PROCESS //不用管
  13. HTTP_TYPE=SWOOL
Swoft 微服务 PRC 手把手教你    2018-07-20 14:39:33    739    0    0

上一篇讲了如何用Swoft 搭建RPC 服务

本篇介绍如何使用微服务

微服务流程

首先讲一下微服务的流程

弄清楚流程, 开发起来就行云流水

这是官方给出的目录结构

  1. app/
  2. - Lib/ // 服务的公共接口定义目录,里面通常只有php接口类
  3. - Pool/ // 服务池配置,里面可以配置不同服务的连接池,参考里面的 UserServicePool
  4. - Services/ // 具体的服务接口实现类,里面的类通常实现了 Lib 中定义的接口

当然在多个服务中使用时, 要将lib库 app/Lib移到一个公共的git仓库里,然后各个服务通过 composer 来获取使用

这里有3个目录

Lib 是接口, 也是客户端和服务端必须的, 用来规定数据结构, 一般由服务端提供

服务端还需要实现Services, 也就是相当于Model

客户端可以通过配置Pool 来调用对应的Services, 如同调用自身的Model 一样方便

整个流程不是很难理解, 但是官方把三个目录放在一起, 并且没有详细说明, 导致很多同学搞不清楚

下面我们来写一个例子试一下吧

定义一个接口

接口定义和普通接口完全一致,唯一不一样的是
- 需要在类注释上定义类似 deferGetUser 方法,对应类里面方法 getUser 且首字母大写。这种 defer* 方法,一般用于业务延迟收包和并发使用。
- 这些方法是不需要实现的,仅用于提供IDE提示。内部调用逻辑由框架帮你完成

app/Lib 新建接口文件MemberInterface

定义一个getMemberByID方法, 并且根据官方提示, 在接口注释里定义一个deferGetMemberByID 方法

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: zcm
  5. * Date: 2018/6/6
  6. * Time: 16:01
  7. */
  8. namespace App\Lib;
  9. use Swoft\Core\ResultInterface;
  10. /**
  11. * Interface MemberInte
Swoft 微服务 RPC    2018-07-20 14:39:33    652    0    0

前两篇教大家如何搭建和使用Swoft RPC 服务, 这里简单说一下如何用其他TCP 客户端如何调用Swoft 的RPC 服务

这里用swoole_client 举个例子

  1. $client = new \swoole_client(SWOOLE_SOCK_TCP);
  2. if (! $client->connect('192.168.1.214', 8099, 0.5))
  3. {
  4. return "connect failed. Error: {$client->errCode}\n";
  5. }
  6. $client->send(json_encode([
  7. "interface" => "App\Lib\MemberInterface",
  8. "version" => "0",
  9. "method" => "getMemberByID",
  10. "params" => [$mid],
  11. ])."\r\n");// 旧版不需要追加\r\n
  12. $result = $client->recv();
  13. $client->close();
  14. return $result;

非常的简单易用, 但是需要注意一点:

interface 参数是服务端带命名空间的类名, 跟客户端没任何关系, 完全取决于服务端把RPC 接口类放在哪儿...

2018-07-02 17:27:19    436    0    0

首先随便注册个账号进入到手记栏目, 也就是文章区

点击右侧的写文章

点击插入图片

关键来了:

title

图片描述这里, 是直接写入img标签的title字段的!

这里我们可以尝试拼接onload来触发js

title

而且最最傻逼的一点, SESSIONID 不是httpOnly

title

随便发布一篇文章, 等待管理员审核

成功拿到管理员账号

title

更为讽刺的是, 该名管理员还在看XSS 安全视频...


2018年7月2日更新
不用尝试了, 已经反馈给官方, 已修复

PHP Composer    2018-06-29 16:02:43    401    0    0
    "repositories": {
        "packagist": {
            "type": "composer",
            "url": "https://packagist.phpcomposer.com"
        },
        "0": {
            "type": "path",
            "url": "../path"
        }
    }


2018-06-01 15:55:04    211    0    0

开新坑啦!

大概流程是

  • 自拍杆绑定到身后上方
  • 手机开启VR 直播模式
  • RTMP 协议推流到局域网服务器
  • VR 眼镜拉RTMP 流数据

待解决的几点

  • 延迟, 据说RTMP 协议延迟很大
  • VR 客户端拉RTMP流
  • 局域网流服务器迁移到手机上, 方便携带出门

最终要达到的效果

真人版吃鸡!

Windows    2018-04-20 15:45:00    180    0    0

Win10 后台运行进程

  1. //Win10 后台运行进程
  2. Start-Process php test.php -WindowStyle Hidden
  3. // 或
  4. start php test.php -WindowStyle Hidden