银河漫游KK - 原创
type: channel
link: https://kisstime.top/tag/original
items: 在Linux下搭建我的世界(Minecraft)服务器
items: 通过Certbot安装Let's Encrypt证书实现全站的HTTPS访问
items: Mac下iTerm2 SSH 免密登陆阿里云
items: 在阿里云上部署WordPress
items: 伏梦
items: 这个周末上线一个帮朋友做的网站，遇到挺多坑，记录一下
items: PHP的软件包管理系统-Composer
items: 理解「依赖注入」和「控制反转」
items: Mac下安装Redis和php-redis扩展

在Linux下搭建我的世界(Minecraft)服务器
type: item
date: 2018-12-21T07:46:00+00:00
description: 最近薅了百度云双12的羊毛，1核2G一年150。突然想起以前大学整个宿舍通宵开黑挖泥土的岁月，所以刚好趁着这台服务器，打算自己搭建一个我的世界服务器，重温一下以前的感觉。系统要求 -google到的MC系统要求:CPU：双核内存：20-40人2GB，30-60人3GB，60+人8GB上面就是服务器端的需求，如果只是和小伙伴们一起玩，也并不需要多优秀的服务器。下面是我的配置：CPU：单核内存：2GLinux系统：CentOS 7.3 x86_64安装JavaMC是用Java写的（当然现在也有别的语言写的版本），由于服务器端的MC是一个jar包，我们在配置之后通过运行jar包来开启服务器端，同时我们在客户端上打开后通过IP地址即可搜索并进入服务器。所以我们首先要先安装Java。通过下面的方法来安装：yum install -y java-1.8.0-openjdk下载MC服务器端这里有一个要求，就是你和你的小伙伴要拥有同样版本的MC。不同的版本对应着不同的服务器端，所以我们要下载正确的版本。如何看MC版本呢，一般进入游戏后，游戏左下角会有版本显示。知道了版本号，那么用命令就可以下载对应版本的服务器端了。需要根据版本号补全命令格式：wget https://s3.amazonaws.com/Minecraft.Download/versions/<你要下载的版本号>/minecraft_server.<你要下载的版本号>.jar 例子：博主这边选择安装了比较稳定的1.12版本wget https://s3.amazonaws.com/Minecraft.Download/versions/1.12/minecraft_server.1.12.jar等下载提示结束后，minecraft_server.1.12.jar就躺在当前目录了。MC服务器，启动！我们就可以使用命令来运行MC服务器：java -Xms[初始启动分配内存] -Xmx[最大分配内存] -jar [jar包所在路径]/minecraft_server.[版本号].jar nogui例子：java -Xms256m -Xmx512m -jar /home/mc/minecraft_server.1.12.jar nogui关于命令最后一个参数 nogui，是分开的单词 no gui，意思是不需要图形界面，这样会大大减小内存的使用，如果你的Linux是有图形界面的，就可以不打这个 nogui。启动成功上面的命令输入完成后，等待参数由0%一直到100%就启动完成啦！下面给出博主启动完成的后几行显示：[05:58:08] [Server thread/INFO]: Loaded 488 advancements [05:58:08] [Server thread/INFO]: Preparing start region for level 0 [05:58:09] [Server thread/INFO]: Preparing spawn area: 0% [05:58:10] [Server thread/INFO]: Preparing spawn area: 41% [05:58:11] [Server thread/INFO]: Preparing spawn area: 76% [05:58:11] [Server thread/INFO]: Done (4.263s)! For help, type "help" or "?"MC，Shell脚本启动！我们如果一直使用上面那一句启动的话是不是非常麻烦！每次都要复制粘贴，那么我们可以写一个简单的Shell脚本，放在jar包所在目录，每次启动的时候直接启动脚本就能进入游戏了。vim start-game.sh编辑内容如下：#!/bin/sh java -Xms256m -Xmx512m -jar /home/mc/minecraft_server.1.12.jar nogui保存退出，每次启动游戏只需要运行下面命令即可:bash start-game.shMC服务器，关闭！按 Ctrl + C 来停止当前服务器MC服务起最常见的启动失败我们在第一次运行完jar包后，无论是否运行成功，都能发现当前目录下多出了一堆文件，运行失败的时候其实就是配置除了一点问题。我们在当前目录找一下文件：eula.txtvim eula.txt按i键进入编辑模式，找到如下一行把 false 改为 trueeula=false保存退出按 esc输入 :wq客户端连接MC服务器失败上面都启动成功之后，就可以下载对应服务器版本的客户端。下载好后启动，点击多人游戏，添加服务器，服务器地址输入我们云服务器的公网IP，就可连接上去愉快的玩耍了。但是这时候…

通过Certbot安装Let's Encrypt证书实现全站的HTTPS访问
type: item
date: 2018-11-17T07:52:00+00:00
description: 相关知识HTTP/HTTPS 是什么?简单来说，HTTP 是一个传输网页内容的协议，比如我们浏览一个网页，网页上的文字、图片、 CSS 、 JS 等文件都是通过 HTTP 协议传输到我们的浏览器，然后被我们看到。因为 HTTP 是明文传输的，通过 HTTP 协议传输的内容很容易被偷看和篡改，为了安全（你肯定不想被人偷看或者篡改网页内容吧，比如网站银行密码什么的。）就为 HTTP 协议再加上了一层 SSL/TLS 安全协议，所以就有了 HTTPS 。SSL/TLS 是什么？SSL 是指安全套接字层（Secure Sockets Layer），内心纯洁的同学也可以理解为「带安全套的 HTTP」，因为带了安全套，所以当然会比较安全。TLS 是 传输层安全协议（Transport Layer Security），SSL 和 TLS 是同一个东西的不同阶段，理解为同一个东西也行，都是安全协议就对了。为什么要部署 HTTPS？说到底，就是 HTTPS 更安全。甚至为了安全，一个专业可靠的网站， HTTPS 是必须的。 Firefox 和 Chrome 都计划将没有配置 SSL 加密的 HTTP 网站标记为不安全，目前它们也正在联合其他相关的基金会与公司推动整个互联网 HTTPS 化，现在大家访问的一些主要的网站。如 Google 多年前就已经全部启用 HTTPS ，国内的淘宝、搜狗、知乎、百度等等也全面 HTTPS 了。甚至 Google 和百度的搜索结果也正在给予 HTTPS 的网站更高的排名和优先收录权。怎么部署 HTTPS 呢？你只需要有一张被信任的 CA （ Certificate Authority ）也就是证书授权中心颁发的 SSL 安全证书，并且将它部署到你的网站服务器上。一旦部署成功后，当用户访问你的网站时，浏览器会在显示的网址前加一把小绿锁，表明这个网站是安全的，当然同时你也会看到网址前的前缀变成了 HTTPS ，不再是 HTTP 了。怎么获得 SSL 安全证书呢？理论上，我们自己也可以签发 SSL 安全证书，但是我们自己签发的安全证书不会被主流的浏览器信任，所以我们需要被信任的证书授权中心（ CA ）签发的安全证书。而一般的 SSL 安全证书签发服务都比较贵，比如 Godaddy 、 GlobalSign 等机构签发的证书一般都需要20美金一年甚至更贵，不过为了加快推广 HTTPS 的普及， EEF 电子前哨基金会、 Mozilla 基金会和美国密歇根大学成立了一个公益组织叫 ISRG （ Internet Security Research Group ），这个组织从 2015 年开始推出了 Let’s Encrypt 免费证书。这个免费证书不仅免费，而且还相当好用，所以我们就可以利用 Let’s Encrypt 提供的免费证书部署 HTTPS 了。Let’s Encrypt 简介前面已经介绍过， Let’s Encrypt 是 一个叫 ISRG （ Internet Security Research Group ，互联网安全研究小组）的组织推出的免费安全证书计划。参与这个计划的组织和公司可以说是互联网顶顶重要的先驱，除了前文提到的三个牛气哄哄的发起单位外，后来又有思科（全球网络设备制造商执牛耳者）、 Akamai 加入，甚至连 Linux 基金会也加入了合作，这些大牌组织的加入保证了这个项目的可信度和可持续性。Certbot 简介ISRG 的发起者 EFF （电子前哨基金会）为 Let’s Encrypt 项目发布了一个官方的客户端 Certbot ，利用它可以完全自动化的获取、部署和更新安全证书。虽然第三方工具也可以使用，但是官方工具更权威，风险也更小，而且遇到问题也更容易解决，毕竟有官方的支持。实际操作Certbot 使用方法Certbot 的官网是https://certbot.eff.org/, 我们打开这个链接，选择自己使用的 web server 和操作系统。选择完之后，官网就会显示出对应的安装操作步骤。以目前我所使用的服务器为例，web server 使用Nginx(1.12)，操作系统是CentOS(7.3)。因为 Certbot 打包在EPEL中，所以在安装 Certbot 之前要先安装EPELyum -y install epel-release然后按着官网给出的步骤提示命令安装 Certbotyum install python2-certbot-nginx安装完毕后，继续输入官网提示命令certbot --nginx运行此命令会自动获取证书，并且 Certbot 会自动编辑Nginx配置文件配置HTTPS服务。这边在运行配置命令时遇到一个坑ImportError: No module na…

Mac下iTerm2 SSH 免密登陆阿里云
type: item
date: 2018-11-09T07:53:00+00:00
description: 服务器配置1 登录到服务器修改sshd的配置文件vim /etc/ssh/sshd_config找到以下内容，去掉前面的注释（#）RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys重启sshd服务service sshd restart本机配置1 本机生成公钥和私钥（已生成跳过）ssh-keygen -t rsa一路回车即可。默认在 ~/.ssh目录生成两个文件id_rsa ：私钥 id_rsa.pub ：公钥2 将本地公钥导入到服务器认证文件中ssh-copy-id -i ~/.ssh/id_rsa.pub root@你的公网IP3 修改 mac 下的配置文件 ~/.ssh/config （没有则创建）Host aliyun ### 别名 Hostname 192.168.10.10 ###公网 IP Port 22 ###端口 User root ###登录账号 IdentityFile ~/.ssh/id_rsa ###本机私钥地址4 使用ssh连接ssh aliyun

在阿里云上部署WordPress
type: item
date: 2018-10-18T07:54:00+00:00
description: 最近刚好因为活动买了一台新的服务器，空着也空着，刚好可以用来搭博客使用，搭建博客这件事。之前也做过很多次，不管是用静态博客生成器，还是手写一个博客项目。都尝试过，思来想去，这次打算用用WordPress，听闻许久，也该用用看了。安装Nginxyum -y install nginx安装Mysql5.7安装 mysql 官方 yum 源rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm查看 MySQL yum 源yum list | grep mysql发现只有 mysql80 的包，这是因为没有开启 mysql57 的包，关闭80包，开启57包。yum-config-manager --disable mysql80-community yum-config-manager --enable mysql57-community报错-bash: yum-config-manager: 未找到命令这个是因为系统默认没有安装这个命令，这个命令在yum-utils 包里，可以通过命令yum -y install yum-utils 安装就可以了。安装 yum-utils 包yum -y install yum-utils再次查看Mysql包列表出现57安装包安装 Mysql57yum -y install mysql-community-server启动 Mysql57服务systemctl start mysqld查看初始密码grep 'temporary password' /var/log/mysqld.log登录 Mysql，修改密码mysql -uroot -p set password for root@localhost = password('你的密码');如果提示错误，那是因为 mysql57 对密码的复杂度进行了限制，依次执行下列命令，取消复杂度限制，再修改set global validate_password_policy=0; set global validate_password_mixed_case_count=0; set global validate_password_number_count=3; set global validate_password_special_char_count=0; set global validate_password_length=3;提示错误[root@izuf6fco0zwyipdq9485s2z ~]# mysql -uroot -p Enter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)如下操作修复# 先关闭服务 systemctl stop mysqld # 跳过权限验证 mysqld --user=root --skip-grant-tables & # 登录 mysql -u root mysql # 设置密码 UPDATE user SET authentication_string=PASSWORD('new password') where USER='root'; # 刷新设置 FLUSH PRIVILEGES;安装 PHP7.2php7.2 版本的 yum 源在 webtatic 上，但还有一部分需要依赖 epel-release 。EPEL(Extra Packages for Enterprise Linux )，是基于Fedora的一个项目，为“红帽系”的操作系统提供额外的软件包，适用于RHEL、CentOS和Scientific Linux。安装 epel-releaseyum -y install epel-release安装完成后，在 /etc/yum.repos.d 目录下，就会多一个 epel.repo 的文件，还有一个 testing 的测试文件。当系统通过 yum 进行安装软件时，如果需要 epel 里的扩展包，就会自动下载安装。安装 webtatic yum 源rpm -ivh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm安装完成后，在 /etc/yum.repos.d 目录下会多出 webtatic.repo 和 webtatic-archive.repo 两个文件，还有一个 testing 的测试文件。查看 php 可以安装的包 yum list | grep php72上面这些 rpm 包就是 w…

伏梦
type: item
date: 2018-09-10T07:55:00+00:00
description: 前阵子感冒了，不算严重。期间去过趟医院打针吃药。那天是周五，请了一天假，下午回家后吃完药。就觉的特别的困，可能是前几天实在没有睡好，也可能是药效起的作用。这一觉睡了有个9小时。这之间做了一个梦，算是噩梦。但没有突然的惊醒，浑身冷汗。只感觉睡了好久好久，醒后觉的浑身无力。但这个梦却莹莹沥沥。它是一个故事，不知道是从前哪里看的小说还是哪部电影中留下的碎念。所以，我决定将它稍加改动记录下来：一个女孩，外衣深黑色针织衫，里面穿着一件白色衬衫，红色格子百褶裙，柔柔弱弱的印象。在一家咖啡店中，靠窗的位置坐着，像是在完成学业。突然电话响了，应该是一位好友的来电。女孩说：「不知道哦，挺久没联系了，可能不喜欢我了。打算用这种方式分手吧」。没一会就挂了电话，女孩看了会窗外。用力的咳嗽了几下，从包里拿出了一瓶感冒药，看来也是重感冒，倒了两颗药出来，胶囊状的，瓶子上像是写着女孩的名字。拿起桌子上的水杯服了下去。不久，女孩起身准备离开，拿起桌子上的书籍和文件。出了咖啡店。像是去往家的路上，路上的风景似曾相识。有一颗无花果树攀出围墙，果子红红郁郁，似血似肉。女孩到了住处，习惯性的打开楼道门口的信箱，检查是否有来信。翻开信箱盖子，里面一封白色信封静静的躺在黑色的信盒中。女孩邹了下眉头，像是疑问。拿起信封翻看了一下，两面都是空白一片，没有署名，没有地址，没有邮编，是一封匿名信。女孩撕开信封，里面只有一张照片。拿起一看，顿时被吓了一跳，照片也被抖到了地上。地面上的照片中是一个人被烧死的照片，只有上半身，却血肉模糊，狰狞发呕。照片随着画面一步一步放大。（我也吓死了）画面一转，女孩在家中打着电话：「不会是恶作剧吧，太变态了。本来最近重感冒难受的要死，还有那么多门毕业考试要准备。烦死了」「有点害怕唉，要不报警吧？但是这些估计最多也就立个案」「哎呀，真的和他挺久没联系了，估计想用这种方式逼我先提出分手，他不理我，我也不理他，哼」「好呀，好呀，现在我就过去，在这今晚我肯定睡不着」。第二天早上，女孩和好友道了别，应该是回去拿一些重要的东西。再次来到楼道门口，女孩看了下信箱，拍了拍胸口呼了一口气，像是给自己打气。再次打开信箱，这次里面躺着两封信，女孩有些惊讶，拿起信封，一封清晰的印着是什么医师证书的回寄，而另外一封又是和昨天一样，双面空白，又是一封匿名信。女孩犹豫着要不要打开，「又是昨天那样的恶作剧？」，女孩还是撕开了这封匿名信，这次还是一张照片。一只手正在一个昏暗的房间中，拿着一个锤子敲碎着一具尸体的骨架。这次女孩镇定了很多，「我可是学医的，这吓不到我，死变态」，女孩把照片塞了回去，将信封直接扔进了边上的垃圾桶中。第三天早上，女孩整装待发，走出楼道，经过信箱时，突然有些犹豫。但还是慢慢的转身走向信箱，翻开信箱盖子，里面又躺着一份双面空白的匿名信。「我靠，有完没完」，女孩取出了这封新的信，快速的撕开了信封。这次信封中是两张照片。第一张，一只手将骨灰塞进一个像香烟头的小模具中，大拇指手指甲上还涂着鲜红的指甲油。女孩皱了下眉头，拿起另外一张。另一张，则是一个被装满药囊瓶子的特写。女孩突然懵了一下，好像意识到了什么。快速翻起自己包中的感冒药瓶子，和照片做了下比对。女孩干呕了声，将手中的照片和药瓶子扔在了地上，双手捂住了嘴巴，惊恐的退到了墙上。

这个周末上线一个帮朋友做的网站，遇到挺多坑，记录一下
type: item
date: 2018-05-07T07:56:00+00:00
description: 网站上线流程购买服务器，目前选择的是阿里云服务器，选择的是入门型1核1G实例配置SSH连接增加本机ssh连接配置，一般激活实例后，ssh的22端口是默认开放的，可以直接通过root用户进行登录配置部署环境，登录到服务器后，将自己的公钥加入到 ~/.ssh/authorized_keys 配置文件中就可直接通过秘钥进行登录服务器配置服务器系统版本：CentOS Linux release 7.4.1708 (Core)内存：1GCPU：1核硬盘：40G## 一. 安装Mysql5.5因为服务器配置有点低，所以这边选择安装比较低的mysql版本。从CentOS 7.0发布以来，yum源中开始使用mariadb来代替MySQL的安装。即使你输入的是yum install mysql , 显示的也是mariadb的安装内容，因此，如果使用yum安装MySQL的话，就需要去下载官方指定的yum源。网址： https://dev.mysql.com/downloads/repo/yum/。1. 先卸载mariadb，查看mariadb是否已经安装[root@iZbp17dq2xryqoixibq5u1Z ~]# yum list installed | grep mariadb mariadb-libs.x86_64 1:5.5.56-2.el7 @anaconda进行卸载[root@iZbp17dq2xryqoixibq5u1Z ~]# yum -y remove mariadb* Loaded plugins: fastestmirror Resolving Dependencies ...... **省略过程** Removed: mariadb-libs.x86_64 1:5.5.56-2.el7 Dependency Removed: postfix.x86_64 2:2.10.1-6.el7 redhat-lsb-core.x86_64 0:4.1-27.el7.centos.1 Complete!2. 获取yum源和数据库安装，官方指南wget http://repo.mysql.com/yum/mysql-5.5-community/el/6/x86_64/mysql-community-release-el6-5.noarch.rpm #MySQL5.5yum源安装yum源rpm -ivh mysql-5.5-community/el/6/x86_64/mysql-community-release-el6-5.noarch.rpm 安装好yum源后，需要修改一下配置文件，文件路径在 /etc/yum.repos.d/mysql-community.repo，要将5.5的enabled改为1，而5.6的enabled改为0# Enable to use MySQL 5.5 [mysql55-community] name=MySQL 5.5 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.5-community/el/6/$basearch/ enabled=1 gpgcheck=1 gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql # Enable to use MySQL 5.6 [mysql56-community] name=MySQL 5.6 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/ enabled=0 gpgcheck=1 gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql # Note: MySQL 5.7 is currently in development. For use at your own risk. # Please read with sub pages: https://dev.mysql.com/doc/relnotes/mysql/5.7/en/ [mysql57-community-dmr] name=MySQL 5.7 Community Server Development Milestone Release baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/6/$basearch/ enabled=0 gpgcheck=1 gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql修改后保存退出，…

PHP的软件包管理系统-Composer
type: item
date: 2017-10-07T07:57:00+00:00
description: 一. What is composer?是 PHP 用来管理依赖（dependency）关系的工具。你可以在自己的项目中声明所依赖的外部工具库（libraries），Composer 会帮你安装这些依赖的库文件。 ---- Composer文档这边的依赖可以理解为各种开发包或者插件，当我们在项目中要使用第三方工具库的时候，我们往往要从官网或者一些别的其他途径来获取源文件，并放入到自己的项目中，在使用的时候，通过手动require的方式引用。当然我们大部分会通过写一个自动加载方法来进行require。但当我们使用比较大的第三方工具库时，可能它的其中又去依赖了更多别的第三方包。而且往往有时候工具库的版本更新可能会不兼容旧版本，我们手动去进行依赖那将会是一件痛苦的事情。 那么Compser能为我们解决哪些问题：a) 你有一个项目依赖于若干个库。b) 其中一些库依赖于其他库。c) 你声明你所依赖的东西。d) Composer 会找出哪个版本的包需要安装，并安装它们（将它们下载到你的项目中）。二. 开始使用Composer系统要求: 运行 Composer 需要 PHP 5.3.2+ 以上版本。 安装Composer: Composer文档-安装Composer的包版本符号composer的依赖声明通常都写在项目根目录下的composer.json文件中，通过JSON format的方式进行编写，就像这样子：{ "require": { "monolog/monolog": "1.0.*" } }require是指定Key，我们需要做的，就是在这个指定key中增加我们需要的依赖包 ("monolog/monolog") 和指定的版本 ("1.0.*"),那么在使用前，首先我们需要知道composer中是怎么声明我们需要依赖的包版本的:point_right:点击链接查看Composer install和update如果composer已经安装成功的话，可以直接在命令行中执行 "composer" 命令来查看命令列表，但在大部分的时候，使用频率最高的是install和update命令，顾名思义就是使用composer安装和更新依赖包。比如我们已经在项目的composer.json中声明了依赖{ "require":{ "mustache/mustache":"2.8.0" } }在命令行中直接执行 "composer install"，就能直接将这个工具库依赖到我们系统中$ composer install Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 1 install, 0 updates, 0 removals - Installing mustache/mustache (v2.8.0): Downloading (100%) Writing lock file Generating autoload files再打开项目文件夹，就能发现新增了vendor文件夹和composer.lock文件，vendor目录存放是composer的自动加载文件和我们刚刚下载的工具库，composer.lock文件是在安装依赖后，composer将把安装时确切的版本号列表(composer.json定义的)写入composer.lock 文件中，锁定项目所使用的包版本。这样做的意义是：在提交项目的时候，请将lock文件也提交，这样在团队开发中，如果有别的成员进入开发，建立项目时都将下载与指定版本完全相同的依赖，减轻潜在的部署错误。当我们的项目搁浅很久，在几个月后重新安装项目，也能正常的继续工作，尽管可能项目的依赖包已经发布了很多新版本。所以，如果已经存在lock文件的话，我们要更新在使用的依赖，这时候就需要执行 "composer update" 命令进行更新，update命令会从新读取composer.json的文件，更新所声明依赖版本并重新读写composer.lock文件。这边我将composer.json中的依赖版本声明为 "v2.9.0"执行命令$ composer update Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 0 installs, 1 update, 0 removals - Updating mustache/mustache (v…

理解「依赖注入」和「控制反转」
type: item
date: 2017-06-05T08:00:00+00:00
description: 一. 依赖注入和控制反转是什么？名词解释：IoC控制反转 Inversion of Control依赖关系的转移依赖抽象而非实践DI依赖注入 Dependency Injection不必自己在代码中维护对象的依赖容器自动根据配置，将依赖注入指定对象Container管理对象的生成、资源取得、销毁等生命周期建立对象与对象之间的依赖关系启动容器后，所有对象直接取用，不用编写任何一行代码来产生对象，或是建立对象之间的依赖关系------------以上引用自网络二. IoC代码演示高层应用程序需要调用底层模块接口,导致高层应用程序对低层模块产生依赖。<? // 高层类 class Order { private $track; public function __construct() { $this->track = new sf(); //顺丰快递 } public function query() { return $this->track->select(); } } // 底层类，快递接口 class sf { public function select { return "快递已送达"; } } $order = new Order(); $order->query(); 假设我们有一个订单类，需要跟踪订单的物流信息，物流目前是和顺丰快递进行合作。但后因种种原因，需要迁移快递物流平台到圆通上去,那现在因为产生了物流接口依赖，程序无法重用，并且必须要修改或者新增圆通快递接口。这就是由于低层模块变化导致高层也跟着变化，不好的设计。而正如上面的IoC解释控制反转 Inversion of Control依赖关系的转移依赖抽象而非实践程序不应该依赖于具体的实现，而是要依赖抽象的接口。如下：<?php // 物流平台接口 interface trackBox { public function select(); } // 高层类 class Order { private $track; public function setTrack($track) { $this->track = $track; } public function query() { return $this->track->select(); } } // 底层 顺丰 class sf implements trackBox { public function select() { return "顺丰快递已送达"; } } // 底层 圆通 class yt implements trackBox { public function select() { return "圆通快递已送达"; } } $order = new Order(); $order->setTrack(new sf()); $order->query(): //顺丰快递已送达 $order->setTrack(new yt()); $order->query(): //圆通快递已送达 这样就将原来的物流查询模块对程序的控制权转移到trackBox接口上，让order类和各种物流接口类都依赖于trackBox,这样就实现了控制反转。面对变化，高层不用修改一行代码，不再依赖低层，而是依赖注入，这也就引出了(依赖注入)DI。 依赖注入的方式有很多，但是主要思想就是如上所示，我们将一个依赖通过注入的方式进行使用。而不是直接将依赖写入被依赖中进行具体的实现。三. 依赖注入容器 Dependency Injection Container那我们接下来继续思考，如果此后业务扩张，合作的物流平台越来越丰富，那么高层程序依赖的物流接口就会越来越多，我们就需要创建的依赖接口实例也会越来越多，这样就很不利于后期的维护 //底层物流接口 class sf implements trackBox{ ... } //顺丰 class yt implements trackBox{ ... } //圆通 class zt implements trackBox{ ... } //中通 class yd implements trackBox{ ... } //韵达 class ems implements trackBox{ ... } //EMS //依赖注入 $order = new Order(); $order->setTrack(new sf()); $order->select(): //顺丰快递已送达 $order->setTrack(new yt()); $order->select(): //圆通快递已送达 $order->setTrack(new zt()); $order->selec…

Mac下安装Redis和php-redis扩展
type: item
date: 2017-03-10T07:58:00+00:00
description: 一. 安装redis服务器使用Homebrew安装redis可以减少大量的安装和配置的工作量。执行 brew install redis 安装redis常用命令redis-server #启动redis服务器redis-cli # redis客户端redis-server --port 6380 #Redis 默认端口是6379，也可以换个端口号启动redis-cli shutdown #关闭redis，服务端会断开所有客户端的连接，然后根据配置执行持久化，最后退出。二. 安装php-redis扩展php默认不支持redis，需要进行编译才能使用。下载源码编译 php官方扩展库链接将redis-4.0.2.tgz（写这篇文章时的最新版本）下载到本地执行tar -xzf命令，解压.tgz 后缀的文件进入到redis-4.0.2文件夹中，依次执行如下命令：phpize./configuremakesudo make install在php.ini中启用redis添加 extension=redis.so;重启php-fpm和nginx三. 在PHP中使用redis连接到 redis 服务php代码<?php //连接本地的 Redis 服务 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); echo "Connection to server sucessfully";//查看服务是否运行 echo "Server is running: " . $redis->ping();?>执行脚本，输出结果为：Connection to server sucessfully Server is running: PONG