分类 代码分享 下的文章

利用 Docker 搭建 PHP 开发及生产环境

Docker 现在是越来越火了,它的出现让很多开发和运维的痛点得到了解决:

  • 大多数公司配备的开发机是 Windows,在 Windows 上配置开发和本地测试环境是非常无解的,常规虚拟机使用十分麻烦并且无法协作,Win10 的 WSL 目前看来只能当作玩具。
  • 多台开发机或者多人的开发团队的开发环境的同步问题,Vagrant 在一定程度上可以解决开发环境的问题,不过在团队协作方面还是 Docker 这种轻量级的方案更灵活快速,更重要的是 Vagrant 目前来看并不适合用于生产环境,而 Docker 则都能 hold 住,真的是一次配置,到处运行。
  • 开发完成项目进行上线后出现因环境不同而产生的问题,此时可能运维会背锅,不过其实在传统的模式下要想保障开发生产环境的一致需要开发和运维的密切配合,但由于处在两个体系下,往往难以避免地会出现问题,所以之前 DevOps 也很火。而有了 Docker 之后这个问题就很容易解决了,开发交付的时候给出的就是容器,运维只要负责把容器上线就行了,不用关心具体环境。
  • 安装各种应用时配置十分繁琐,编译安装时可能还需要解决依赖问题,第一次安装一个大型应用可能整个一套搞下来一天就过去了,甚至对主机造成一些不可逆的影响。现在大多数常见应用都提供官方 Docker 镜像了,只要 pull 下来改改环境变量,立马就能跑起来,节省了大量时间,也不用担心搞坏主机。

每个人对环境的需求可能都或多或少有些区别,如果简单使用的话推荐 laradock,可以说是 Docker 化的 homestead,对 Docker 有一定了解之后就可以根据自己的需求自己构建一套环境。

最后开源我自己常用的一套开发环境,后面准备把搭建博客的环境也改成用这套环境来搭建:https://github.com/takashiki/docker-env

参考文档:

徒手用 Docker 构建自己的 PHP 开发环境

CentOS 6.x 安装 Docker、Docker Compose 以及切换镜像源记录

首先,这是个大坑,不到万不得已千万不要轻易尝试!!!

由于工作需要,我不得不在 CentOS 6.x 上安装 Docker,而且由于需要一次性部署多个关联服务,不用 docker-compose 的话又会相当麻烦,于是便开始了这段折腾之路。

我这里总结一下主要步骤和注意事项,详细步骤包括具体命令请参见文末的参考链接。

  • 首先 CentOS 6.x 用的报管理器是 yum,yum 只支持 python 2.6 及以下的版本,而 docker compose 只支持 python 2.7 及以上的版本,所以要编译安装 python 2.7,然后把 yum 的几个脚本里的 python 路径改成 2.6 版本的路径,默认的 python 改成 2.7 版本
  • 然后根据参考链接里的步骤通过 epel 安装 1.7.1 版本的 docker,这个版本的 docker 是支持 CentOS 6.x 的最后一个版本了。貌似没有非常靠谱的方案在 CentOS 6.x 的机器上安装更高版本的 docker 了,因为新版本 docker 需要 3.x 的内核,以及其他很多高版本的依赖包,可能会出现问题,不过网上有成功升级内核至 3.10 并且升级 Docker 至 1.9.1 版本的记录,具体可查看文末参考链接
  • 之后通过 pip 安装 docker-compose,需要注意支持 docker 1.7.1 的最后一个版本的 docker-compose 是 1.5.2 版本,所以安装的时候要指定安装这个版本
  • 1.5.2 版本的 docker-compose 只能支持 version 1 的 docker-compose.yml 配置文件,使用新版本的配置文件时需要自己手工改成 v1 的格式
  • daocloud 的镜像加速器亲测不支持 1.7 版本的 docker,中科大的镜像貌似也有点问题,阿里云的镜像可以完美支持,需要注意 1.7 版本的 docker 修改 registry 需要修改 /etc/sysconfig/docker 中的启动参数,详见参考链接

参考链接:

CentOS6.x 安装 Docker 和 Docker Compose
centos 6.5 & docker1.7.1 & docker的阿里云代理镜像设置
CentOs 6.x升级内核到3.10, 安装并升级docker1.9.1

腾讯云 COS webpack 插件开源

今天想把一个老的 Yii2 项目改成比较时髦的前后端分离的开发模式,于是试用了 webpack,感觉还不错。

项目线上我是想直接把编译后的文件传到带 cdn 的对象存储上,因为服务器用的是腾讯云的 cvm,所以对象存储就顺便选择了 cos。

Github 上搜了下没有现成的 webpack 插件,不过有几个现成的七牛的,比较了一下发现 https://github.com/lyfeyaj/qn-webpack 这个项目的代码最简洁清晰,于是就在这个项目的基础上自己改出了一个 cos 的 webpack 插件并开源了出来:https://github.com/takashiki/cos-webpack

npm 发布包的步骤参考:手把手教你用npm发布一个包

下面是该插件的安装和使用方式:

前提

需要 Node 版本在 v4.0 以上,COS V4 以上(APPID 为 125 开头)

安装

npm i -D cos-webpack

使用方法

支持的配置项:

  • secretId COS SecretId
  • secretKey COS SecretKey
  • bucket COS 存储对象名称,格式为对象名称加应用 ID,如:bucket-1250000000
  • region COS 存储地域,参见官方文档
  • path 存储路径, 默认为 [hash],也可以指定 hash 长度,如: [hash:8]
  • exclude 可选,排除特定文件,正则表达式,如: /index\.html$/
  • include 可选,指定要上传的文件,正则表达式,如: /app\.js$/
  • batch 可选,批量上传文件并发数,默认 20

注: Webpack 的 output.publicPath 要指向 COS(或自定义的)域名地址

// 引入
const CosPlugin = require('cos-webpack');

// 配置 Plugin
const cosPlugin = new CosPlugin({
  secretId: 'my-secret-id',
  secretKey: 'my-secret-key',
  bucket: 'my-125000000',
  region: 'ap-chengdu',
  path: '[hash]/'
});

// Webpack 的配置
module.exports = {
 output: {
    // 此处为 COS 访问域名(bucket-1250000000.file.myqcloud.com) 加上 path([hash]/)
    publicPath: "http://bucket-1250000000.file.myqcloud.com/[hash]/"
    // ...
 },
 plugins: [
   cosPlugin
   // ...
 ]
 // ...
}

在原有的 Yii1.1 项目中使用 Yii2 框架的经验记录

目前公司由于历史原因,之前很多主体项目都是使用 Yii1.1 开发的,Yii1.1 在使用上还是有很多不便,为了使用 Yii2 的一些新特性,我决定在一个规模比较小的项目上尝试 Yii1.1 和 Yii2 共存并逐渐使用 Yii2 替代原有 Yii1.1 代码进行项目升级的方案。

主要的参考文档在 google 上搜了下就只有官方文档的一节 Using Yii 2 with Yii 1

最主要的是创建一个自定义的 Yii 类文件,这个类继承自 Yii2 的 BaseYii 类,而类里面需要手工把 Yii1.1 的 YiiBase 类中的代码复制过来,这样这个类就同时拥有 Yii1.1 和 Yii2 的属性和方法了。
然后最下面三行是为了能在项目中使用 Yii2 的自动加载机制和依赖注入容器,一定不能写错。

$yii2path = '/path/to/yii2';
require($yii2path . '/BaseYii.php'); // Yii 2.x

$yii1path = '/path/to/yii1';
require($yii1path . '/YiiBase.php'); // Yii 1.x

class Yii extends \yii\BaseYii
{
    // 这里要把 Yii1.1 中 YiiBase 类里的代码全部复制过来
}

Yii::$classMap = include($yii2path . '/classes.php');
// 通过 Yii1.1 的方法注册 Yii2 的自动加载器
Yii::registerAutoloader(['yii\BaseYii', 'autoload']);
// 创建依赖注入容器
Yii::$container = new yii\di\Container();

这个文件我们可以放在 components\Yii.php,然后我们就需要修改项目原先的 index.php 入口文件了,修改过后的关键代码如下:

// 引入上一步创建好的自定义 Yii 类文件
require(__DIR__ . '/../components/Yii.php');

// 首先读取 Yii2 的配置,实际配置可能更多,这里只是参考
$yii2Config = require(__DIR__ . '/../config/yii2/web.php');
// 不要调用 run() 方法,Yii2 只作为服务定位器使用
new yii\web\Application($yii2Config);

// 读取 Yii1.1 配置,实例化 Application 并运行
$yii1Config = require(__DIR__ . '/../config/yii1/main.php');
Yii::createWebApplication($yii1Config)->run();

配好这些就可以开始使用了,项目的目录组织的话可以根据实际项目情况而定,在编写 Yii2 代码时,我们可以无视原来的 Yii1.1 的所有代码,将项目作为一个常规的 Yii2 项目来看,这样的话目录结构就很清晰了。

这种方案要求 php 版本至少在 5.4 以上,我建议将 Yii1.1 的框架版本升级到最新的 1.1.19 这个版本可以支持 php7.0 和 php7.1。

总的来说并不困难,不过参考资料较少,实际使用过程中可能会遇到坑点,不过也都比较好解决,老项目这样一配可以说是枯木逢春,写起新功能来要舒服太多了。

分享一个自写的Yii2扩展——Yii2 IDE Helper

虽然github上已经有了几个yii2的ide helper,如:https://github.com/iiifx-production/yii2-autocomplete-helper,不过自己使用下来感觉不是特别好用,于是便自己实现了一个:https://github.com/takashiki/yii2-ide-helper

使用说明:

安装

用以下命令添加 composer 依赖:

composer require mis/yii2-ide-helper --dev

或者在 composer.json 文件的 require-dev 中添加如下内容后执行 composer update

"mis/yii2-ide-helper": "*"

使用

把如下配置加入应用的 console 配置文件中:

'bootstrap' => ['log', 'ideHelper'],
...
'components' => [
    'ideHelper' => [
        'class' => 'Mis\IdeHelper\IdeHelper',
    ],
  ...
],

之后就可以通过如下命令生成 IDE Helper 文件了:

php yii ide-helper/generate

可选配置列表

'ideHelper' => [
    'class' => 'Mis\IdeHelper\IdeHelper',
    'filename' => '_ide_helper',
    'format' => 'php',
    'rootDir' => dirname(__DIR__),
    'configFiles' => [
        'console/config/main.php',
        'console/config/main-local.php',
    ],
],

默认配置文件路径:

protected $defaultConfigFiles = [
    'config/web.php',
    'config/main.php',
    'config/main-local.php',
    'common/config/main.php',
    'common/config/main-local.php',
    'frontend/config/main.php',
    'frontend/config/main-local.php',
    'backend/config/main.php',
    'backend/config/main-local.php',
];