分类 工作心德 下的文章

mysql 数据库关联多张表

表一:

CREATE TABLE `log_zz` (
  `dt` datetime NOT NULL,
  `info` varchar(100) NOT NULL,
  KEY `dt` (`dt`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

表二:

CREATE TABLE `log_xx` (
  `dt` datetime NOT NULL,
  `info` varchar(100) NOT NULL,
  KEY `dt` (`dt`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

表三:

CREATE TABLE `log_yy` (
  `dt` datetime NOT NULL,
  `info` varchar(100) NOT NULL,
  KEY `dt` (`dt`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

关联表:

CREATE TABLE `log_merge` (
  `dt` datetime NOT NULL,
  `info` varchar(100) NOT NULL,
  KEY `dt` (`dt`)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 UNION=(`log_zz`,`log_xx`,`log_yy`);

这是三张表的数据:
D5Q7}IL{10TRQGAF@47D~61.png

这是关联表的数据:

关联表数据

执行代码

查询:select * from log_merge;
删除:delete from log_merge where `dt`='2020-08-10 10:48:53';
更新:update table where  `dt`='2020-08-10 10:48:53' set `info` = 'SS';

composer的自动加载机制

composer支持四种模式(psr0,psr4,classmap,files)

composer默认psr4,支持php5.2
PSR-4指定的就当作当前命名空间的目录, 而PSR-0 指定的是当前命名空间的父目录。composer dump-autoload 一下

<?php
//实现自动加载类
spl_autoload_register(function ($class) {
    /* 限定类名路径映射 */
    $class_map = array(
        // 限定类名 => 文件路径
        $class => $class.".php",
    );
    /* 引入相关文件 */
    if (file_exists($file = $class_map[$class])) include $file;
});
//按照顺序加载(按照命名空间寻找)
$aa =new \classes\AA();
$aa->aa();
echo "\n";
$bb = new \classes\BB();
$bb->bb();
echo "\n";
$sasasaasds = new \saadsadsas\sasasaasds();
$sasasaasds->wqwqwq();
echo "\n";
$fwqdqwd = new \wqeqweqw\fwqdqwd();
$fwqdqwd->尼玛();

sql_autoload_register() 函数 跟 __autoload()相比,
1.__autoload($class) 因为是一个函数,所以只能定义一次,使用多个会冲突报错;而 sql_autoload_register('function') 可定义多个,它有效地创建一个队列的自动装载函数并按顺序依次定义

2.SPL函数很丰富,有更多的操作空间:如spl_autoload_unregister()注销已经注册的函数、spl_autoload_functions()返回所有已经注册的函数等

mac搭建自己的微服务

这里使用的是laravel框架,基于laravel的组件larvels(laravel+swoole)

LaravelS 基于 Swoole 加速 Laravel/Lumen,常驻内存,内置 HTTP/WebSocket Server,支持 TCP/UDP Server、自定义进程、异步的事件监听、异步任务队列、毫秒级定时任务、平滑 Reload,与 Nginx 配合搭建高可用分布式服务器群,开箱即用。

1、 安装laravel框架(这步直接省略)
2、 直接安装laravelS

composer require "hhxsv5/laravel-s:~3.5.0" -vvv

3、 注册Service Provider
修改文件 config/app.php

 'providers' => [
        Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class,
    ],

4、 发布配置和二进制文件

php artisan laravels publishconfig\laravels.php就是你配置文件

5、 运行

php bin/laravels start

1F999F85-406B-4AD7-8E72-B95CD21F632E.png
这样就算是初步完成启动了,通过config\laravels.php配置的端口通过http请求完成访问

6.将ip发布到nginx并配置一个域名

gzip on;
gzip_min_length 1024;
gzip_comp_level 2;
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml application/x-httpd-php image/jpeg image/gif image/png font/ttf font/otf image/svg+xml;
gzip_vary on;
gzip_disable "msie6";
#nginx upstream用于负载均衡
upstream swoole {
    # 通过 IP:Port 连接
    #多服务器负载均衡(没有服务器,拿端口来顶替),模拟多个服务器
    server 127.0.0.1:5200 weight=5 max_fails=3 fail_timeout=5s;#可设置参数请求
    server 127.0.0.1:5201 weight=5 max_fails=3 fail_timeout=5s;#可设置参数请求
    # 通过 UnixSocket Stream 连接,小诀窍:将socket文件放在/dev/shm目录下,可获得更好的性能
    #server unix:/yourpath/laravel-s-test/storage/laravels.sock weight=5 max_fails=3 fail_timeout=30s;
    #server 192.168.1.1:5200 weight=3 max_fails=3 fail_timeout=30s;
    #server 192.168.1.2:5200 backup;
    keepalive 16;
}

server {
    listen       80;
    client_max_body_size 512m;
    server_name  aa.com;
    # root  /Users/huchaoran/Desktop/所有项目/muchTemplate/public;
    autoindex off;
    index index.html index.php;

    location / {
        # try_files $uri $uri/ /index.php?$query_string;
        try_files $uri @laravels;
    }
    # location ~ \.php(.*)$ {
    #       fastcgi_pass   127.0.0.1:9000;
    #        fastcgi_index  index.php;
    #        fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
    #        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    #        fastcgi_param  PATH_INFO  $fastcgi_path_info;
    #        fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
    #       include        fastcgi_params;
    # }
    # location ~ /\.ht {
    #     deny all;
    # }
    # if (!-e $request_filename) {
    #     rewrite ^/(.*)$ /index.php/$1;
    # }
    location @laravels {
        # proxy_connect_timeout 60s;
        # proxy_send_timeout 60s;
        # proxy_read_timeout 120s;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Real-PORT $remote_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header Scheme $scheme;
        proxy_set_header Server-Protocol $server_protocol;
        proxy_set_header Server-Name $server_name;
        proxy_set_header Server-Addr $server_addr;
        proxy_set_header Server-Port $server_port;
        access_log  /Users/huchaoran/Desktop/所有项目/muchTemplate/access.log;
        # “swoole”是指上面的upstream定义的swoole
        proxy_pass http://swoole;
    }
}

这里就完成了搭建laravel微服务,后面的我会一步步更新的

PHP设计者模式->建造者模式

  1. 一个主体有多个结构(例如小白(一个人):会说多少种语言、肤色、发色、家境、家里多少口人、性格、有木有配偶等等)
  2. 我们就要针对这个人返回这个人的所有结构
  3. 这个人每个结构处理方式不同
  4. 那么我们就要决定这个人究竟是什么人

这里就以卢本伟为案例

/**具体产品角色  人
 * Class Bird
 */
class Person
{
    public $_language;
    public $_skin;
    public $_hair;
    public $_family;
    public $_population;
    public $_nature;
    public $_marriage;
 
    function show()
    {
        echo "会的语言:{$this->_language}<br/>";
        echo "肤色:{$this->_skin}<br/>";
        echo "发色:{$this->_hair}<br/>";
        echo "家境:{$this->_family}<br/>";
        echo "人口:{$this->_population}<br/>";
        echo "性格:{$this->_nature}<br/>";
        echo "婚姻关系:{$this->_marriage}<br/>";
    }
}
 
/**人的建造者(生成器)
 * Class BirdBuilder
 */
abstract class PersonBuilder
{
    protected $_person;
 
    function __construct()
    {
        $this->_person=new Person();
    }
 
    abstract function BuildLanguage();//语言
    abstract function BuildSkin();//肤色
    abstract function BuildHair();//发色
    abstract function BuildFamily();//家境
    abstract function BuildPopulation();//人口
    abstract function BuildNature();//性格
    abstract function BuildMarriage();//婚姻关系
    abstract function GetPerson();//获取人物所有信息
}
 
/**具体人的建造者(生成器)   卢本伟(55开)
 * Class BlueBird
 */
class LuBenWei extends PersonBuilder
{
    function BuildLanguage()
    {
        $this->_person->_language="会骚话、臭嗨话";
    }
 
    function BuildSkin()
    {
        $this->_person->_skin="卢本伟什么肤色都有";
    }
 
    function BuildHair()
    {
        $this->_person->_hair="卢本伟是个光头";
    }
    
    function BuildFamily()
    {
        $this->_person->_family="卢本伟富得流油";
    }
    
    function BuildPopulation()
    {
        $this->_person->_population="卢本伟是个孤儿";
    }
    
    function BuildNature()
    {
        $this->_person->_nature="卢本伟帅的一批、卢本伟不跟你多BB";
    }
    
    function BuildMarriage()
    {
        $this->_person->_marriage="卢本伟有个白富美老婆";
    }
 
    function GetPerson()
    {
        return $this->_person;
    }
}
 
 
/**指挥者
 * Class Director
 */
class Director
{
    /**
     * @param $_builder      建造者
     * @return mixed         产品类:人
     */
    function Construct($_builder)
    {
        $_builder->BuildLanguage();
        $_builder->BuildSkin();
        $_builder->BuildHair();
        $_builder->BuildFamily();
        $_builder->BuildPopulation();
        $_builder->BuildNature();
        $_builder->BuildMarriage();
        return $_builder->GetPerson();
    }
}


$director=new Director();
echo "卢本伟的人物信息:<hr/>";
$lubenwei=$director->Construct(new LuBenWei());
$lubenwei->show();

//执行的结果
卢本伟的人物信息:
会的语言:会骚话、臭嗨话
肤色:卢本伟什么肤色都有
发色:卢本伟是个光头
家境:卢本伟富得流油
人口:卢本伟是个孤儿
性格:卢本伟帅的一批、卢本伟不跟你多BB
婚姻关系:卢本伟有个白富美老婆

PHP设计模式->观察者模式

  1. 观测者模式属于一对多依赖关系
  2. 当一个对象发生改变时,他所依赖的的对象都得到通知
  3. 可以在独立的对象(主体)中维护一个对主体感兴趣的依赖项(观察器)列表
  4. 所有的依赖项(观察器)各自实现公共的ObjectServer接口,取消主体和依赖对象之间的依赖关系

观察者模式应用的场景

  1. 购买商品送优惠券、送商品、送积分、送称号、日志记录
  2. 购火车票要短信通知、日志记录、优惠券赠送

以下就以购买火车票场景编写业务

<?php
/**
 * 观察者模式应用场景实例
 *
 * 免责声明:本文只是以哈票网举例,示例中并未涉及哈票网任何业务代码,全部原创,如有雷同,纯属巧合。
 *
 * 场景描述:
 * 哈票以购票为核心业务(此模式不限于该业务),但围绕购票会产生不同的其他逻辑,如:
 * 1、购票后记录文本日志
 * 2、购票后记录数据库日志
 * 3、购票后发送短信
 * 4、购票送抵扣卷、兑换卷、积分
 * 5、其他各类活动等
 *
 * 传统解决方案:
 * 在购票逻辑等类内部增加相关代码,完成各种逻辑。
 *
 * 存在问题:
 * 1、一旦某个业务逻辑发生改变,如购票业务中增加其他业务逻辑,需要修改购票核心文件、甚至购票流程。
 * 2、日积月累后,文件冗长,导致后续维护困难。
 *
 * 存在问题原因主要是程序的"紧密耦合",使用观察模式将目前的业务逻辑优化成"松耦合",达到易维护、易修改的目的,
 * 同时也符合面向接口编程的思想。
 *
 * 观察者模式典型实现方式:
 * 1、定义2个接口:观察者(通知)接口、被观察者(主题)接口
 * 2、定义2个类,观察者对象实现观察者接口、主题类实现被观者接口
 * 3、主题类注册自己需要通知的观察者
 * 4、主题类某个业务逻辑发生时通知观察者对象,每个观察者执行自己的业务逻辑。
 *
 * 示例:如以下代码
 *
 */
 date_default_timezone_set('PRC'); //设置中国时区
#===================定义观察者、被观察者接口============
/**
 * 观察者接口(通知接口)
 */
interface ITicketObserver //观察者接口
{
  function onBuyTicketOver($sender, $args); //得到通知后调用的方法
}
/**
 * 主题接口
 */
interface ITicketObservable //被观察对象接口
{
  function addObserver($observer); //提供注册观察者方法
}
/**
 *
 * 主题类(购票)
 *
 */
class HipiaoBuy implements ITicketObservable { //实现主题接口(被观察者)
    private $_observers = array (); //通知数组(观察者)
    public function buyTicket($ticket) //购票核心类,处理购票流程
      {
      // TODO 购票逻辑
      //循环通知,调用其onBuyTicketOver实现不同业务逻辑
        foreach ( $this->_observers as $obs )
            $obs->onBuyTicketOver ( $this, $ticket ); //$this 可用来获取主题类句柄,在通知中使用
    }
    //添加通知
    public function addObserver($observer) //添加N个通知
      {
        $this->_observers [] = $observer;
    }
}
#=========================定义多个通知====================
//短信日志通知
class HipiaoMSM implements ITicketObserver {
    public function onBuyTicketOver($sender, $ticket) {
        echo (date ( 'Y-m-d H:i:s' ) . " 短信日志记录:购票成功:$ticket<br>");
    }
}
//文本日志通知
class HipiaoTxt implements ITicketObserver {
    public function onBuyTicketOver($sender, $ticket) {
        echo (date ( 'Y-m-d H:i:s' ) . " 文本日志记录:购票成功:$ticket<br>");
    }
}
  //抵扣卷赠送通知
class HipiaoDiKou implements ITicketObserver {
    public function onBuyTicketOver($sender, $ticket) {
        echo (date ( 'Y-m-d H:i:s' ) . " 赠送抵扣卷:购票成功:$ticket 赠送10元抵扣卷1张。<br>");
    }
}
#============================用户购票====================
$buy = new HipiaoBuy ();
$buy->addObserver ( new HipiaoMSM () ); //根据不同业务逻辑加入各种通知
$buy->addObserver ( new HipiaoTxt () );
$buy->addObserver ( new HipiaoDiKou () );
//购票
$buy->buyTicket ( "一排一号" );
备案号:粤ICP备18155514号-2