/images/avatar.jpg

构建一个自己的PHP框架(一)—— 你需要准备的

对于大多数PHP程序员来说,可能在公司做项目,大部分还是使用的开源框架,常用的ThinkPHP、去年火起来的Laravel、之前很火的Yii、比较轻量的Codeigniter,强调性能的Yaf等,很多人长期使用一个框架,就会有很多自己的心得,那么何不我们自己来写一个框架呢?

首先,我们要选择一个框架的设计方案,现在主流框架均采用MVC模式

好了,我们来规划下目录

———— Framework
| |———— Storage
| | |———— Database
| | |———— Cache
| |———— Factory
| |———— Inters
| |———— Model
| |———— View
| |———— Controller
| |———— Collection
|—— Logs
|—— config.ini
|—— index.php

下面我来详细介绍这个目录结构

  • Framework 框架的目录,存储框架内所有文件
  • Logs 存储系统的日志
  • config.ini 框架的配置文件
  • index.php 框架的入口文件
  • Storage 存储目录,里面为框架所有存储服务,里面包含Cache存储和Database存储
  • Factory 存储框架内构件各种服务的工厂类
  • Inters 存储框架内所有interface接口定义
  • Model 存储所有的模型
  • View 存储所有的视图
  • Controller 存储所有的控制器
  • Collection 存储所有的集合(此处到说集合的时候会详细说明)

以上这些规划后,我们就可以开始进行编程了。下一章开始进入系统底层搭建

百万级日志型数据另类分表方式

对于时间性比较强的数据,比如日志类型、登录日志这样的数据,一般我们会建立一个日志表来存储,而当日志量超过百万级,则一个表来存储,将会造成很大的查询问题,而且对于日志数据,我们查询常常使用的是倒序查询,每页也仅仅查询几十条到几百条,查询效率会很差,因此必然会分表,那如何分表?在分表后又如何解决多表查询的问题呢?下面我就来推荐一种另类的分表方式

假设有这样一个日志类:

class Logs
{
    private $id;
    private $contents;
    private $datetime;

    public function __construct($contents)
    {
        $this->contents = $contents;
        $this->datetime = date('Y-m-d H:i:s', time());
    }

    public function save()
    {
        $sql = "INSERT INTO `logs`(`contents`, `datetime`) VALUES('{$this->contents}', '{$this->datetime}')";
        # 执行sql,插入到数据库中,并返回插入的日志id, 此处省略过程
        $this->id = $insert_id;
        return $this->id;
    }
}

通过日志类的结构,我们建立一个数据表

CREATE TABLE `logs` (
	`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`contents` text,
	`datetime` datetime NOT NULL,
	PRIMARY KEY (`id`)
) ENGINE=`MyISAM` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

一般来说,单表情况下,我们的id为自增。现在我们来分析这个日志类的特点:

Docker部署学习记录(二)

上篇文章安装了Docker到系统中,本篇开始部署Docker容器。

上篇我们下载了mysql的Docker镜像,那么我们开始部署一个mysql的容器

创建容器,docker使用两种方式,一种为Docker File方式,通过编写Docker File来部署,此种方式暂时还未研究,以后会补上,那些下面先从第二种方式来创建容器。

首先我们规划目录,进入根目录

cd /

创建一个目录app,用于存储所有的容器内部署的应用的相关映射

mkdir app

进入app目录,创建配置目录 conf,日志目录 logs,数据目录data,网站根目录www

cd app

mkdir -p conf logs data www

进入各目录,建立相关应用目录

cd conf
mkdir -p mysql nginx php
cd ..
cd logs
mkdir -p mysql nginx php
cd ..
cd data
mkdir mysql

以上我们规划了即将部署的多个应用的目录结构,下面我们来创建一个mysql的容器

Docker部署学习记录(一)

这几天开始对docker部署方式感兴趣,因此开始学习docker部署,故将网站做了部署调整。

首先,作为docker部署,docker官方希望docker成为单应用运行,这样将主流的LNMP架构中,Nginx、Mysql和PHP分别作了docker容器部署

当前仅仅学习了docker的皮毛,还没有弄清楚链接的使用,因此Nginx与php-fpm通讯、mysql和php-fpm的通讯,均直接使用了相关容器的ip来做通讯,后面弄清楚链接的使用后,会修改此处

首先,安装docker,使用了yum直接安装

yum install docker

期间yum会提示很多安装包,并提示是否下载这些包,输入y确认即可

安装完毕后,使用命令启动docker的守护进程

service start docker

启动后,就可以正常使用docker的命令了

可以使用以下命令来获取docker的帮助说明

docker --help

因为刚刚下载的docker,是没有任何镜像的,可以使用以下命令来查看当前系统可以使用的镜像

docker images

我们可以使用search命令来查询可以使用的镜像,镜像发布在docker.io上,例如查询可以使用的mysql镜像