使用vagrant搭建LNMP 环境

最后更新于:2018-12-17 13:52:28

准备工作:
  1. 安装 OracleVMVirtualBox https://www.virtualbox.org/
  2. 安装 vagrant http://www.vagrantup.com/
  3. 下载使用的box文件http://www.vagrantbox.es/

把好的box文件(以Ubuntu.16.04box镜像为例)放入一个文件夹

进入cmd终端然后切入刚刚放入Ubuntu.16.04box镜像的文件夹

输入vagrant box add server 用鼠标拉住Ubuntu.16.04box镜像拉入终端(这是告诉vagrant你的box文件路径)回车

使用vagrant box list 查看是否有server (virtualbox, 0)

看到有之后,我们执行vagrant init server 初始化 然后我们的工作目录就生成了一个vagrantfile的配置文件

因为我们虚拟机默认只分配一个访问外网的 IP, 项目使用的IP得手动设置打开 Vagrantfile 找到29行设置一个私有 IP(我自己的在29行)并去掉注释

然后我们就可以使用vagrant up 启动 成功后会在当前目录生成一个.vagrant的隐藏文件

打开Oracle VM VirtualBox就发现server的虚拟机已经运行了

使用vagrant ssh直接连接到虚拟机里面 ls查看vagrant是同步本地的文件夹

vagrant box add NAME URL #添加一个box
vagrant box list #查看本地已添加的box
vagrant box remove NAME virtualbox #删除本地已添加的box,如若是版本1.0.x,执行vagrant box remove NAME(NAME是添加的box名字)
vagrant init NAME #初始化,实质应是创建Vagrantfile文件(NAME是添加的box名字)
vagrant up #启动虚拟机
vagrant halt #关闭虚拟机
vagrant destroy #销毁虚拟机
vagrant reload #重启虚拟机
vagrant package #当前正在运行的VirtualBox虚拟环境打包成一个可重复使用的box
vagrant ssh #进入虚拟环境


安装PHP7.1 之前,要先进行:

sudo vim /etc/apt/source.list 将里面的内容换成下面内容(换清华源,国内速度较快)

    # deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restricted
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial universe
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates universe
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial multiverse
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates multiverse
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security universe
    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security multiverse

执行sudo apt-get update 命令更新

sudo apt-get install -y language-pack-en-base 解决语言冲突

安装完成之后,执行:locale-gen en_US.UTF-8

安装 git ,vim: sudo apt-get install git vim

执行: sudo apt-get install software-properties-common 安装依赖包

执行:sudo LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php

再次:sudo apt-get update

然后就可以安装php7.1了:运行 apt-cache search php7.1

安装php7.1:sudo apt-get install php7.1 -y

执行:php -V 查看是否安装成功

继续安装php与mysql的通信模块:sudo apt-get install php7.1-mysql -y

然后安装fpm,这是nginx用来解析php文件的:sudo apt-get install php7.1-fpm -y

其他必备模块:sudo apt-get install php7.1-curl php7.1-xml php7.1-mcrypt php7.1-json php7.1-gd php7.1-mbstring -y


安装MySQL 5.7

运行:wget http://dev.mysql.com/get/mysql-apt-config_0.5.3-1_all.deb

然后使用dpkg命令添加MySQL的源:sudo dpkg -i mysql-apt-config_0.5.3-1_all.deb
选择 Server MySQL 5.7 Apply

执行:sudo apt-get update 更新

安装: sudo apt-get install mysql-server -y

卸载MySQL

sudo apt-get autoremove --purge mysql-server-5.0

sudo apt-get remove mysql-server

sudo apt-get autoremove mysql-server

sudo apt-get remove mysql-common 这个很重要上面的其实有一些是多余的

dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P清理残留数据


安装NGINX

安装:sudo apt-get install nginx -y

安装:sudo apt-get install curl -y

执行:curl localhost查看是否成功

卸载NGINX

执行:sudo apt-get --purge remove nginx
执行:sudo apt-get autoremove
执行:dpkg --get-selections|grep nginx
执行:罗列出与nginx相关的软件, nginx-common deinstall 然后
执行:sudo apt-get --purge remove nginx-common
这样就可以完全卸载掉nginx包括配置文件

安装组件:
sudo apt-get install unzip

sudo apt-get install zip

sudo apt-get install composer -y

进入:sudo vim /etc/php/7.1/fpm/php.inicgi.fix_pathinfo=1改为cgi.fix_pathinfo=0

进入:sudo vim /etc/php/7.1/fpm/pool.d/www.conflisten = /run/php/php7.1-fpm.sock修改为listen = 127.0.0.1:9000 然后重启

关闭:service php7.1-fpm stop
开启:service php7.1-fpm start

进入:sudo vim /etc/nginx/sites-available/default

将server这部分替换:

server {
    #listen 80 default_server;
    listen 80;
    #listen [::]:80 default_server ipv6only=on;

    root /var/www/your-project-name/public;
    index index.php index.html index.htm;

    # Make site accessible from http://localhost/
    server_name lufficc.com www.lufficc.com;

    location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            try_files $uri $uri/ /index.php?$query_string;
            # Uncomment to enable naxsi on this location
            # include /etc/nginx/naxsi.rules
    }

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
    #
    #       # With php7.1-cgi alone:
            fastcgi_pass 127.0.0.1:9000;
    #       # With php7.1-fpm:
    #       fastcgi_pass unix:/run/php/php7.1-fpm.sock;
    }
}

root:是你的项目的public目录,也就是网站的入口
index:添加了index.php,告诉Nginx先解析index.php文件
server_name:你的域名,没有的话填写localhost
location / try_files修改为了try_files uriuri/ /index.php?query_string; location ~ \.php部分告诉Nginx怎么解析Php,原封不动复制即可,但注意:fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;的目录要和fpm的配置文件中的listen一致。

sudo service nginx restart(重启nginx)
sudo service php7.1-fpm restart(重启fpm)

 

Linux 操作系统的诞生

最后更新于:2018-11-26 13:48:15

Linux 操作系统的诞生

创始人林纳斯·托瓦兹

、发展和成长过程始终依赖着五个重要支柱:UNIX 操作系统、MINIX 操作系统、GNU计划、POSIX 标准和Internet 网络。

1981 年IBM公司推出微型计算机IBM PC。
1991年,GNU计划已经开发出了许多工具软件,最受期盼的GNU C编译器已经出现,GNU的操作系统核心HURD一直处于实验阶段,没有任何可用性,实质上也没能开发出完整的GNU操作系统,但是GNU奠定了Linux用户基础和开发环境。
1991年初,林纳斯·托瓦兹开始在一台386sx兼容微机上学习minix操作系统。1991年4月,林纳斯·托瓦兹开始酝酿并着手编制自己的操作系统。
1991 年4 月13 日在comp.os.minix 上发布说自己已经成功地将bash 移植到了minix 上,而且已经爱不释手、不能离开这个shell软件了。
1991年7月3日,第一个与Linux有关的消息是在comp.os.minix上发布的(当然此时还不存在Linux这个名称,当时林纳斯·托瓦兹的脑子里想的可能是FREAX,FREAX的英文含义是怪诞的、怪物、异想天开等)。
1991年的10月5日,林纳斯·托瓦兹在comp.os.minix新闻组上发布消息,正式向外宣布Linux内核的诞生(Freeminix-likekernel sources for 386-AT)。
1993年,大约有100余名程序员参与了Linux内核代码编写/修改工作,其中核心组由5人组成,此时Linux 0.99的代码大约有十万行,用户大约有10万左右。
1994年3月,Linux1.0发布,代码量17万行,当时是按照完全自由免费的协议发布,随后正式采用GPL协议。
1995年1月,Bob Young创办了RedHat(小红帽),以GNU/Linux为核心,集成了400多个源代码开放的程序模块,搞出了一种冠以品牌的Linux,即RedHat Linux,称为Linux"发行版",在市场上出售。这在经营模式上是一种创举。
1996年6月,Linux 2.0内核发布,此内核有大约40万行代码,并可以支持多个处理器。此时的Linux 已经进入了实用阶段,全球大约有350万人使用。
1998年2月,以Eric Raymond为首的一批年轻的"老牛羚骨干分子"终于认识到GNU/Linux体系的产业化道路的本质,并非是什么自由哲学,而是市场竞争的驱动,创办了"Open Source Intiative"(开放源代码促进会)"复兴"的大旗,在互联网世界里展开了一场历史性的Linux产业化运动。
2001年1月,Linux 2.4发布,它进一步地提升了SMP系统的扩展性,同时它也集成了很多用于支持桌面系统的特性:USB,PC卡(PCMCIA)的支持,内置的即插即用,等等功能。
2003年12月,Linux 2.6版内核发布,相对于2.4版内核2.6在对系统的支持都有很大的变化。
2004年的第1月,SuSE嫁到了Novell,SCO继续顶着骂名四处强行“化缘”, Asianux, MandrakeSoft也在五年中首次宣布季度赢利。3月,SGI宣布成功实现了Linux操作系统支持256个Itanium 2处理器。 [1-2]

vue各函数说明

最后更新于:2018-11-26 12:20:09

var vm = new Vue({
// 数据
data: "声明需要响应式绑定的数据对象",
props: "接收来自父组件的数据",
propsData: "创建实例时手动传递props,方便测试props",
computed: "计算属性",
methods: "定义可以通过vm对象访问的方法",
watch: "Vue实例化时会调用$watch()方法遍历watch对象的每个属性",
// DOM
el: "将页面上已存在的DOM元素作为Vue实例的挂载目标",
template: "可以替换挂载元素的字符串模板",
render: "渲染函数,字符串模板的替代方案",
renderError: "仅用于开发环境,在render()出现错误时,提供另外的渲染输出",
// 生命周期钩子
beforeCreate: "发生在Vue实例初始化之后,data observer和event/watcher事件被配置之前",
created: "发生在Vue实例初始化以及data observer和event/watcher事件被配置之后",
beforeMount: "挂载开始之前被调用,此时render()首次被调用",
mounted: "el被新建的vm.$el替换,并挂载到实例上之后调用",
beforeUpdate: "数据更新时调用,发生在虚拟DOM重新渲染和打补丁之前",
updated: "数据更改导致虚拟DOM重新渲染和打补丁之后被调用",
activated: "keep-alive组件激活时调用",
deactivated: "keep-alive组件停用时调用",
beforeDestroy: "实例销毁之前调用,Vue实例依然可用",
destroyed: "Vue实例销毁后调用,事件监听和子实例全部被移除,释放系统资源",
// 资源
directives: "包含Vue实例可用指令的哈希表",
filters: "包含Vue实例可用过滤器的哈希表",
components: "包含Vue实例可用组件的哈希表",
// 组合
parent: "指定当前实例的父实例,子实例用this.$parent访问父实例,父实例通过$children数组访问子实例",
mixins: "将属性混入Vue实例对象,并在Vue自身实例对象的属性被调用之前得到执行",
extends: "用于声明继承另一个组件,从而无需使用Vue.extend,便于扩展单文件组件",
provide&inject: "2个属性需要一起使用,用来向所有子组件注入依赖,类似于React的Context",
// 其它
name: "允许组件递归调用自身,便于调试时显示更加友好的警告信息",
delimiters: "改变模板字符串的风格,默认为{{}}",
functional: "让组件无状态(没有data)和无实例(没有this上下文)",
model: "允许自定义组件使用v-model时定制prop和event",
inheritAttrs: "默认情况下,父作用域的非props属性绑定会应用在子组件的根元素上。当编写嵌套有其它组件或元素的组件时,可以将该属性设置为false关闭这些默认行为",
comments: "设为true时会保留并且渲染模板中的HTML注释"
});

git rebase的简单用法

最后更新于:2018-11-26 12:21:57

rebase在git中是一个非常有魅力的命令,使用得当会极大提高自己的工作效率;相反,如果乱用,会给团队中其他人带来麻烦。它的作用简要概括为:可以对某一段线性提交历史进行编辑、删除、复制、粘贴;因此,合理使用rebase命令可以使我们的提交历史干净、简洁!

前提:不要通过rebase对任何已经提交到公共仓库中的commit进行修改(你自己一个人玩的分支除外)

1.合并多个commit为一个完整commit

当我们在本地仓库中提交了多次,在我们把本地提交push到公共仓库中之前,为了让提交记录更简洁明了,我们希望把如下分支B、C、D三个提交记录合并为一个完整的提交,然后再push到公共仓库。

现在我们在测试分支上添加了四次提交,我们的目标是把最后三个提交合并为一个提交:

这里我们使用命令:

  git rebase -i  [startpoint]  [endpoint]

其中-i的意思是--interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint][endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。
在查看到了log日志后,我们运行以下命令:

git rebase -i 36224db

或:

git rebase -i HEAD~3 

然后我们会看到如下界面:

上面未被注释的部分列出的是我们本次rebase操作包含的所有提交,下面注释部分是git为我们提供的命令说明。每一个commit id 前面的pick表示指令类型,git 为我们提供了以下几个命令:

  • pick:保留该commit(缩写:p)
  • reword:保留该commit,但我需要修改该commit的注释(缩写:r)
  • edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
  • squash:将该commit和前一个commit合并(缩写:s)
  • fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
  • exec:执行shell命令(缩写:x)
  • drop:我要丢弃该commit(缩写:d)

根据我们的需求,我们将commit内容编辑如下:

然后是注释修改界面:

编辑完保存即可完成commit的合并了:

2.将某一段commit粘贴到另一个分支上

当我们项目中存在多个分支,有时候我们需要将某一个分支中的一段提交同时应用到其他分支中,就像下图:

我们希望将develop分支中的C~E部分复制到master分支中,这时我们就可以通过rebase命令来实现(如果只是复制某一两个提交到其他分支,建议使用更简单的命令:git cherry-pick)。
在实际模拟中,我们创建了master和develop两个分支:
master分支:

develop分支:

我们使用命令的形式为:

    git rebase   [startpoint]   [endpoint]  --onto  [branchName]

其中,[startpoint][endpoint]仍然和上一个命令一样指定了一个编辑区间(前开后闭),--onto的意思是要将该指定的提交复制到哪个分支上。
所以,在找到C(90bc0045b)和E(5de0da9f2)的提交id后,我们运行以下命令:

    git  rebase   90bc0045b^   5de0da9f2   --onto master

注:因为[startpoint][endpoint]指定的是一个前开后闭的区间,为了让这个区间包含C提交,我们将区间起始点向后退了一步。
运行完成后查看当前分支的日志:

可以看到,C~E部分的提交内容已经复制到了G的后面了,大功告成?NO!我们看一下当前分支的状态:

当前HEAD处于游离状态,实际上,此时所有分支的状态应该是这样:

所以,虽然此时HEAD所指向的内容正是我们所需要的,但是master分支是没有任何变化的,git只是将C~E部分的提交内容复制一份粘贴到了master所指向的提交后面,我们需要做的就是将master所指向的提交id设置为当前HEAD所指向的提交id就可以了,即:

      git checkout master
      git reset --hard  0c72e64

此时我们才大功告成!

作者:liqingbiubiu
链接:https://www.jianshu.com/p/4a8f4af4e803
來源:简书

常用的git命令

最后更新于:2018-11-26 12:22:21

详细操作

改写单次commit
git commit --amend

删改排以及合并多个commit
git rebase -i <commit range>

获取历史版本的某个文件
git checkout <commit> -- <filename>

移动HEAD指针
git reset [--hard] <commit>

创建一个回退提交
git revert <commit>

强制push,覆盖原有远程仓库
git push -f <remote> <branch>

Mac下安装php7.0+nginx

最后更新于:2018-11-18 22:08:14

安装软件特别方便,建议大家没有安装的话最好安装一下,省的被各种以来弄得脑袋疼。在安装之前,有必要解释下apache和nginx解析PHP的原理。以前,我一直使用的是apache做web服务器,配置过apache的都应该知道,php是挂在apache下的一个模块,当http请求一个php文件的话,apache会调用php模块儿进行解析,然后返回html给apache。

而nginx又点不一样,它必须通过一个FastCGI的进程管理器来启动php解析,也就是是php-fpm,当nginx接受的php请求时,它会向它监听的fpm发送一个请求,当fpm接受到请求以后,在创建一个子进程来调用php进行解析。当解析完成后,回收线程,返回html给nginx,这里也引出了一个问题,那就是php鸡肋一般的单例,由于php的生命周期是伴随着一个请求的开始和结束,当这个请求完毕后,该线程就会自动回收了,所以php的静态对象,只能存在于一个请求当中,不想Java等其他语言,静态变量会一直存在。

好了,下面上安装步骤(提前安装好homebrew)

1.卸载mac自带的apache和php,有用集成环境,建议也删掉

先停掉apache:

sudo apachectl stop

然后统统删掉

sudo rm /usr/sbin/httpd
sudo rm -r /etc/apache2/

2.安装nginx

brew install nginx

安装完后,先不急着修改配置文件

先设置权限

sudo chown root:wheel/usr/local/opt/nginx/bin/nginx
sudo chmod u+s/usr/local/opt/nginx/bin/nginx

如果想设开机启动的话

mkdir -p ~/Library/LaunchAgents
cp /usr/local/opt/nginx/homebrew.mxcl.nginx.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist

launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist(取消开机启动)

nginx命令

sudo nginx #打开 nginx
nginx -s reload|reopen|stop|quit  #重新加载配置|重启|停止|退出 nginx
nginx -t   #测试配置是否有语法错误
如果提示pid丢失的话,就用这句话
nginx -c "/usr/local/etc/nginx/nginx.conf"

好了nginx安装完毕,大家可以localhost一下,就可以看到nginx的信息了

3.安装MySQL

brew install mysql

加入开机启动
cp /usr/local/opt/mysql/homebrew.mxcl.mysql.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist(取消开机启动)

初始化mysql

cd /usr/local/Cellar/mysql/5.7.11/bin

mysql_install_db

设置root账户和密码

./mysql_secure_installation 一直跟着提示走就行

4.先安装php7

brew install php70 --without-apache --with-fpm

因为我们用nginx,所有--without-apache,并且加上--with-fpm来编译php

安装完成后,加入全局变量

vim ~/.bash_profile 添加  export PATH=/usr/local/bin:/usr/sbin:$PATH

然后 vim ~/.bashrc  添加   export PATH = "$(brew --prefix homebrew/php/php70)/bin:$PATH"

最后 sourc ~/.bash_profile  source ~/.bashrc

然后加入开机自启

mkdir -p ~/Library/LaunchAgents
cp /usr/local/opt/php70/homebrew.mxcl.php70.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php70.plist

5.安装php5.6.18

brew install php56 --without-apache --with-fpm

vim ~/.bashrc  修改 export PATH = "$(brew --prefix homebrew/php/php70)/bin:$PATH"  为 export PATH = "$(brew --prefix homebrew/php/php70)/bin:$(brew --prefix             homebrew/php/php56)/bin$PATH";

然后加入开机自启

mkdir -p ~/Library/LaunchAgents
cp /usr/local/opt/php70/homebrew.mxcl.php56.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php70.plist

6.安装php版本切换公具

brew install php-version

安装完成后 vim ~/.bashrc 添加  source $(brew --prefix php-version)/php-version.sh && php-version 7后面的 &&php-version是你想默认开启的php版本。自己选一个就行

sourc .bashrc后,命令行输入php-version,就可以看到在你电脑中的所有php版本,你想用哪个就php-version 5.6.18 或 php-version7.0.2来切换版本

7.安装php扩展包

其实很简单,比如你想安装php7的xdebug扩展,就brew install php70-xdebug,想安装mcrypt就 brew install php70-mcrypt

如果想按5.6的就 brew install php56-xxxx,是不so easy,另外你可以 brew search php70,可以看到所有php7的扩展库,同理

也可以查php56的

8.配置nginx 和 php-fpm

nginx 配置 很简单,nginx的配置文件在 /usr/local/etc/nginx/文件中  vim nginx.conf

然后 根据 自己的需求去配置就行,这里就不用详细说了

php-fpm的配置:     先cd到  /usr/local/etc/php,你可以看到7.0和5.6这俩个文件夹,至于你想要改哪个,就改就行

这没什么配置的,就是把nginx和fpm的端口统一就行

9.最后关键

每次修改了php.ini文件。都要重启php-fpm,就行启动apache一样,不过这会不用重启nginx

重启步骤

sudo killall php-fpm 先停掉所有php-fpm的进程

cd  /usr/local/Cellar/php/版本号/sbin

不同版本的php,sbin目录里会有不同的php-fpm,比如php7.0的是php70-fpm, php5.6.18的是 php56-fpm,你想启动哪个fpm就

敲 sudo ./php70-fpm start 或php56-fpm start就行

结束语,

好了,大概就是这么个步骤,可能大家的实际安装配置过程中有所不同,但大体思路就是这样。遇到问题,不要灰心,解决了任何一个问题都会对自己有一个提高,每次解决完问题后的喜悦,不就当初选择这行的原因吗!

Mac下安装 php+nginx+mysql 开发环境

最后更新于:2018-11-18 18:47:39

一、mysql安装

mysql是安装最简单顺利的

1. 首先去官方网站下载Mac适用的MySQL的dmg包

下载页面 选择图中最下方的dmg包下载进行安装

安装完成后 MySQL的安装目录为/usr/local/mysql/

2. 启动服务

设置里 找到MySQL 启动服务 显示running 则服务已启动

 

上图倒数第二

上图服务已启动

如果需要在终端内执行MySQL命令 需要加入环境变量

export PATH=$PATH:/usr/local/mysql/bin/

MySQL安装完成

二、redis安装

1. 到官方网站下载redis 当前版本 redis-3.2.1.tar.gz

下载地址:http://redis.io/download

tar -zxvf ./redis-3.2.1.tar.gz  #解压压缩包

cd ./redis-3.2.1          #进入解压的软件目录内

sudo make install          #执行安装

redis-server              #启动redis

2. 安装完成之后 修改redis的配置文件及启动脚本

配置文件 注意修改启动脚本相关路径的配置:

vi /Library/LaunchDaemons/com.redis.plist

#启动脚本内容

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<dict>

<keyLabel</key>

<stringcom.redis</string>

<keyRunAtLoad</key>

<true/>

<keyProgramArguments</key>

<array>

<string/usr/local/redis/bin/redis-server</string redis

<string/usr/local/redis/redis.conf</string redis.conf

</array>

</dict>

</plist>
#保存退出
​
launchctl load /Library/LaunchDaemons/com.redis.plist #加载启动脚本

launchctl start com.redis #启动服务

ps aux | grep redis  #查看进程是否启动

三、php安装

本人Mac里自带的php版本为5.5 启动正常 但是zend guard loader扩展始终安装不上最后决定使用php5.4

这里提到一个网站 http://php-osx.liip.ch/

网站里有多个PHP版本的集成包 已经内置好了各种扩展 redis memcace mysql等等安装过程极简单

官方给出了相应的命令

curl -s http://php-osx.liip.ch/install.sh | bash -s 5.4

等待命令执行完成 我这里用时大概二十分钟左右安装完成后php会安装到/usr/local/目录下php5

export PATH=/usr/local/php5/bin:$PATH #加入环境变量

php -v

PHP 5.4.45 (cli) (built: Mar 10 2016 13:43:09) 

Copyright (c) 1997-2014 The PHP Group

Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies

with Xdebug v2.2.5, Copyright (c) 2002-2014, by Derick Rethans

显示php已经是5.4版本

虽然安装了很多扩展 但是并没有zend guard loader的扩展 因此还要下载相关的扩展进行安装

这里要说明一下PHP安装完成后的目录结构

cd /usr/local/php5
ls -l
drwxr-xr-x  158 root  wheel      5372  7 17 13:25 bin
-rw-r--r--    1 root  wheel       440  3 10 20:46 entropy-php.conf
drwxr-xr-x    9 root  wheel       306  7 17 14:44 etc #配置文件目录php.ini php-fpm.conf 如有需要推荐修改./php.d/99-liip-developer.ini
drwxr-xr-x   90 root  wheel      3060  7 17 13:25 include
drwxr-xr-x   13 root  wheel       442  7 17 13:25 info
drwxr-xr-x  197 root  wheel      6698  7 17 14:32 lib
-rwxr-xr-x    1 root  wheel  12400208  3 10 20:46 libphp5.so
drwxr-xr-x   33 root  wheel      1122  7 17 14:43 php.d  #php各种扩展加载的配置目录 其中99-liip-developer.ini可修改配置相当于php.ini
drwxr-xr-x    8 root  wheel       272  7 17 13:24 sbin
drwxr-xr-x   12 root  wheel       408  7 17 13:24 share
drwxr-xr-x    4 root  wheel       136  7 17 13:24 var

安装ZendGuardLoader

tar -zxvf ./ZendGuardLoader-70429-PHP-5.4-darwin10.7-x86_64.tar.gz
cp ./ZendGuardLoader-70429-PHP-5.4-darwin10.7-x86_64/php-5.4.x/ZendGuardLoader.so /usr/local/php5/lib/php/extensions/no-debug-non-zts-20100525/

增加启动脚本(注意修改相关文件路径)

vi /etc/php-fpm

#! /bin/sh

### BEGIN INIT INFO

# Provides:          php-fpm

# Required-Start:    $remote_fs $network

# Required-Stop:     $remote_fs $network

# Default-Start:     2 3 4 5

# Default-Stop:      0 1 6

# Short-Description: starts php-fpm

# Description:       starts the PHP FastCGI Process Manager daemon

### END INIT INFO

prefix=/usr/local/php5/

exec_prefix=${prefix}


php_fpm_BIN=${exec_prefix}/sbin/php-fpm

php_fpm_CONF=${prefix}/etc/php-fpm.conf

php_fpm_PID=${prefix}/var/run/php-fpm.pid


php_opts="--fpm-config $php_fpm_CONF --pid $php_fpm_PID"


wait_for_pid () {

        try=0while test $try -lt 35 ; docase "$1" in

                        'created')

                        if [ -f "$2" ] ; then

                                try=''

                                break

                        fi

                        ;;

​

                        'removed')

                        if [ ! -f "$2" ] ; then

                                try=''

                                break

                        fi

                        ;;

                esacecho -n .

                try=`expr $try + 1`

​

        force-quit)

                echo -n "Terminating php-fpm "

​

                if [ ! -r $php_fpm_PID ] ; then

                        echo "warning, no pid file found - php-fpm is not running ?"

                        exit 1

                fikill -TERM `cat $php_fpm_PID`

​

                wait_for_pid removed $php_fpm_PID

​

                if [ -n "$try" ] ; then

                        echo " failed"

                        exit 1

                else

                        echo " done"

                fi

        ;;


        restart)

                $0 stop

                $0 start

        ;;


        reload)

                echo -n "Reload service php-fpm "

​

                if [ ! -r $php_fpm_PID ] ; then

                        echo "warning, no pid file found - php-fpm is not running ?"

                        exit 1

                fi

​

                kill -USR2 `cat $php_fpm_PID`

​

                echo " done"

        ;;

​

        *)

                echo "Usage: $0 {start|stop|force-quit|restart|reload|status}"

                exit 1

        ;;

esac

 

四、nginx安装

OpenResty">这里推荐使用OpenRestyOpenResty">

OpenResty ™ 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

下载OpenRestytar

#安装
tar -zxvf ./openresty-1.9.7.5.tar.gz

cd ./openresty-1.9.15.1

./configure

make 

make install

注意 这一步安装可能会报错 需要安装 PCRE 和 OpenSSL

Mac OS X 不像linux那样 可以使用yum安装软件 依赖包

推荐大家使用brew

首先执行下面命令进行安装

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

brew安装完成可以直接使用

关于brew的详细介绍请查看官方说明https://git.io/brew-docs

brew update

brew install pcre openssl

安装完成后重新编译安装openresty

./configure --prefix=/usr/local/openresty \   #指定安装目录

   --with-cc-opt="-I/usr/local/Cellar/openssl/1.0.2h_1/include/ -I/usr/local/Cellar/pcre/8.39/include/" \

   --with-ld-opt="-L/usr/local/Cellar/openssl/1.0.2h_1/lib/ -L/usr/local/Cellar/pcre/8.39/lib/" \

#使用 ./configure --help 查看更多的选项。

make 

make install

OpenResty安装完成后 找到nginx目录进行配置文件的修改

cd /usr/local/openresty 

ls -l

drwxr-xr-x   7 root  admin    238  7 17 17:59 bin

drwxr-xr-x   6 root  admin    204  7 17 17:59 luajit

drwxr-xr-x   7 root  admin    238  7 17 17:59 lualib

drwxr-xr-x  11 root  admin    374  7 18 16:22 nginx

drwxr-xr-x@ 40 root  admin   1360  7 17 17:59 pod

-rw-r--r--@  1 root  admin  95458  7 17 17:59 resty.index

cd ./nginx/conf/

ls -l

-rw-r--r--@  1 root  admin  1077  7 17 17:59 fastcgi.conf

-rw-r--r--@  1 root  admin  1077  7 17 17:59 fastcgi.conf.default

-rw-r--r--@  1 root  admin  1007  7 17 17:59 fastcgi_params

-rw-r--r--@  1 root  admin  1007  7 17 17:59 fastcgi_params.default

-rw-r--r--   1 root  admin  2856  1 25 17:19 injection.lua

-rw-r--r--@  1 root  admin  2837  7 17 17:59 koi-utf

-rw-r--r--@  1 root  admin  2223  7 17 17:59 koi-win

-rw-r--r--@  1 root  admin  3957  7 17 17:59 mime.types

-rw-r--r--@  1 root  admin  3957  7 17 17:59 mime.types.default

-rw-r--r--   1 root  admin  4167  7 17 18:05 nginx.conf

-rw-r--r--@  1 root  admin  2656  7 17 17:59 nginx.conf.default

-rw-r--r--@  1 root  admin   636  7 17 17:59 scgi_params

-rw-r--r--@  1 root  admin   636  7 17 17:59 scgi_params.default

-rw-r--r--@  1 root  admin   664  7 17 17:59 uwsgi_params

-rw-r--r--@  1 root  admin   664  7 17 17:59 uwsgi_params.default

drwxr-xr-x  12 root  admin   408  7 17 18:14 vhosts

-rw-r--r--@  1 root  admin  3610  7 17 17:59 win-utf

#根据需要修改相关配置文件

nginx启动

sudo /usr/local/openresty/nginx/sbin/nginx

git合并多个提交

最后更新于:2018-11-18 18:37:33

git合并多个提交

[时间:2016-11] [状态:Open]
[关键词:git,git rebase,合并提交,commit]

0. 引言

本文是关于Git提交记录修改的方法,主要是将多个提交记录合并为一个,然后提交。这里使用到git rebase(一般译为衍和),多数情况下推荐在未提交到远程仓库之前修改本地git提交记录格式时使用。
我遇到这个问题主要是因为实际提交中需要在多个分支之间切换,不希望在另一个分支上看到当前分支的多次提交,只希望将多次提交压合成一个提交,然后在另一个分支上直接git cherry-pick即可。

1. 合并多个提交

为了美化commit history不择手段
首先,为了模拟实际git rebase效果,我们先在git上提交两个修改。git log如下:

commit e1a7dfa9dfea8e63ad079dba37c61d8e80ffbe1b
Author: Tocy
Date:   Mon Nov 28 14:01:45 2016 +0800

add text in second.txt

commit c6e45575484666245bb22d2d5d534bfee91f44c6
Author: Tocy
Date:   Mon Nov 28 13:59:43 2016 +0800

create second.txt

假设合并这两个提交,可以按照下面过程

git rebase -i HEAD~2

可以先用man查看下git rebase的命令参数,这样会有如下提示:

pick c6e4557 create second.txt
pick e1a7dfa add text in second.txt

# Rebase a71eba2..e1a7dfa onto a71eba2
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

第一列是rebase具体执行的操作,其中操作可以选择,其中含义如下:

  • 选择pick操作,git会应用这个补丁,以同样的提交信息(commit message)保存提交
  • 选择reword操作,git会应用这个补丁,但需要重新编辑提交信息
  • 选择edit操作,git会应用这个补丁,但会因为amending而终止
  • 选择squash操作,git会应用这个补丁,但会与之前的提交合并
  • 选择fixup操作,git会应用这个补丁,但会丢掉提交日志
  • 选择exec操作,git会在shell中运行这个命令

对比之前的两个提交提交,我觉得第一个提交可以保留,第二个合并到第一个就可以了。

将第二个pick改成squash或者s,然后保存退出。如下:

pick c6e4557 create second.txt
s e1a7dfa add text in second.txt

此时git会自动将第二个提交合并到第一个提交,并弹出合并提示信息,如下:

# This is a combination of 2 commits.
# The first commit's message is:

create second.txt

# This is the 2nd commit message:

add text in second.txt

# 请为您的变更输入提交说明。以 '#' 开始的行将被忽略,而一个空的提交
# 说明将会终止提交。
#
# 日期:  Mon Nov 28 13:59:43 2016 +0800
#
# 变基操作正在进行中;至 a71eba2
# 您在执行将分支 'master' 变基到 'a71eba2' 的操作时编辑提交。
#
# 要提交的变更:
#   新文件:   second.txt
#

如果需要修改下提交信息,如果不需要直接保存退出即可。

此时我们已经完成了将两个提交合并为一个的处理,可以通过git log查看

commit 251d222ac45f3596943480bd5a7cc695b5d7d6e9
Author: Tocy
Date:   Mon Nov 28 13:59:43 2016 +0800

    create second.txt
    
    add text in second.txt

总结

注意本文仅仅介绍了我遇到的多个提交合并的问题,关于git rebase用法,建议参考Git Community Book 中文版-rebase和参考资料中的介绍。
多数情况下git rebase仅限在本地使用,也就是在提交到远程分支之前。

48条高效率的PHP优化写法

最后更新于:2018-11-26 12:22:53

1 字符串">1 字符串1 字符串">

1.1 少用正则表达式

能用PHP内部字符串操作函数的情况下,尽量用他们,不要用正则表达式, 因为其效率高于正则。

没得说,正则最耗性能。

str_replace函数要比preg_replace快得多,strtr函数又比str_replace来得快。

有没有你漏掉的好用的函数?

例如:strpbrk()strncasecmp()strpos()strrpos()stripos()strripos()

1.2 字符替换

如果需要转换的全是单个字符,用字符串作为 strtr() 函数完成替换,而不是数组:

$addr = strtr($addr, "abcd", "efgh");       // 建议
$addr = strtr($addr, array('a' => 'e', ));  // 不建议

效率提升:10 倍。

str_replace字符替换比正则替换preg_replace快,但strtrstr_replace又快1/4

另外,不要做无谓的替换,即使没有替换,str_replace也会为其参数分配内存。很慢!

strpos 先查找(非常快),看是否需要替换,如果需要,再替换。

如果需要替换,效率几乎相等,差别在 0.1% 左右。

如果不需要替换:用 strpos200%

1.3 压缩大的字符串

使用 gzcompress() 和 gzuncompress() 对容量大的字符串进行压缩和解压,再存入和取出数据库

这种内置的函数使用gzip算法,能压缩字符串90%

1.4 echo 输出

echo 字符串用逗号代替点连接符更快些。

虽然,echo是一种语言结构,不是真正的函数。

但是,它可以把逗号隔开的多个字符串当作“函数”参数传入,所以速度会更快。

echo $str1, $str2;       // 速度快
echo $str1 . $str2;      // 速度稍慢

1.5 尽量用单引号

PHP 引擎允许使用单引号和双引号来封装字符串变量,但是它们的速度是有很大的差别的!

使用双引号的字符串会告诉 PHP 引擎,首先去读取字符串内容,查找其中的变量,并改为变量对应的值。

一般来说字符串是没有变量的,使用双引号会导致性能不佳。

最好使用字符串连接,而不是双引号字符串。

$output = "This is a plain string";  // 不好的实践
$output = 'This is a plain string';  // 好的实践

$type = "mixed";                     // 不好的实践
$output = "This is a $type string";

$type = 'mixed';                     // 好的实践
$output = 'This is a ' . $type . ' string';

1.6 使用isset代替strlen

在检验字符串长度时,我们第一想法会使用 strlen() 函数。

此函数执行起来相当快,因为它不做任何计算,只返回在zval结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。

但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化、哈希查找,会跟随被调用的函数一起执行。

在某些情况下,你可以使用 isset() 技巧加速执行你的代码。例如:

if (strlen($foo) < 5) {
    echo "Foo is too short";
}

// 使用isset()
if (!isset($foo{5})) {
    echo "Foo is too short";
}

1.7 用split分割字符串

在分割字符串时,split()要比explode()快。

split()
0.001813 - 0.002271 seconds (avg 0.002042 seconds)
explode()
0.001678 - 0.003626 seconds (avg 0.002652 seconds)

1.8 echo效率高于print

因为echo没有返回值,print返回一个整型。

注意:echo输出大字符串的时候,如果没有调整就会严重影响性能。

打开Apache的mod_deflate进行压缩,或者打开ob_start将内容放进缓冲区,可以改善性能问题。

2 语句">2 语句2 语句">

2.1 最好不用@

@掩盖错误会降低脚本运行速度,并且在后台有很多额外操作。

@比起不用,效率差距 3 倍。特别不要在循环中使用@

在 5 次循环的测试中,即使是先用error_reporting(0)关掉错误,循环完成后再打开,都比用@快。

2.2 避免使用魔术方法

对于__开头的函数就命名为魔术函数,它们都在特定的条件下触发。

这些魔术函数包括:__construct()__get()__call()__autoload()等等。

__autoload() 为例,如果不能将类名与实际的磁盘文件对应起来,将不得不做大量的文件存在判断。

而判断文件存在需要磁盘I/O操作,众所周知,磁盘I/O操作的效率很低,因此这才是使得autoload机制效率降低的原因。

因此,在系统设计时,需要定义一套清晰的、将类名与实际磁盘文件映射的机制。

这个规则越简单越明确,__autoload()机制的效率就越高。

autoload机制并不是天然的效率低下,只有滥用autoload、设计不好的自动装载函数,才会导致其效率的降低.

所以说,尽量避免使用__autoload等魔术方法,有待商榷。

2.3 别在循环里用函数

例如:

for($x=0; $x < count($array); $x++) {
}

这种写法在每次循环的时候都会调用 count() 函数,效率大大降低,建议这样:

$len = count($array);
for($x=0; $x < $len; $x++) {
}

让函数在循环外面一次获得循环次数。

2.4 使用三元运算符

在简单的判断语句中,三元运算符?:更简洁高效。

2.5 使用选择分支语句

switchcase好于使用多个ifelse if语句,并且代码更加容易阅读和维护。

2.6 屏蔽敏感信息

使用 error_reporting() 函数来预防潜在的敏感信息显示给用户。

理想的错误报告应该被完全禁用在php.ini文件里。

如果用的是共享虚拟主机,php.ini不能修改,最好添加 error_reporting() 函数。

放在每个脚本文件的第一行,或者用require_once()来加载,能有效的保护敏感的SQL查询和路径,在出错时不被显示。

2.7 不实用段标签<?

不要使用开始标志的缩写形式,你正在使用这样的符号吗<?,应该用完整的<?php开始标签。

当然,如果是输出变量,用<?= $value ?>这种方式是鼓励的,可以是代码更加简洁。

2.8 纯PHP代码不加结束标记

如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记?>

这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图。

2.9 永远不要使用register_globalsmagic quotes

这是两个很古老的功能,在当时(十年前)也许是一个好方法,但现在看来并非如此。

老版本的PHP在安装时会默认打开这两个功能,这会引起安全漏洞、编程错误及其他的问题。

如只有用户输入了数据时才会创建变量等。

PHP5.4.0开始这两个功能都被舍弃了,所以每个程序员都应该避免使用。

如果你过去的程序有使用这两项功能,那就尽快将其剔除吧。

3 函数">3 函数3 函数">

3.1 尽量使用PHP内部函数

内置函数使用C语言实现,并且经过PHP官方优化,效率更高。

3.2 使用绝对路径

includerequire中尽量使用绝对路径。

如果包含相对路径,PHP会在include_path里面遍历查找文件。

用绝对路径就会避免此类问题,解析路径所需的时间会更少。

3.3 包含文件

尽量不要用require_onceinclude_once包含文件,它们多一个判断文件是否被引用的过程,能不用尽量不用。

而使用requireinclude方法代替。

鸟哥在其博客中就多次声明,尽量不要用require_onceinclude_once

3.4 函数快于类方法

调用只有一个参数、并且函数体为空的函数,花费的时间等于7-8$localvar++运算。

而同一功能的类方法大约为15次$localvar++运算。

3.5 用子类方法

基类里面只放能重用的方法,其他功能尽量放在子类中实现,子类里方法的性能优于在基类中。

3.6 类的性能和其方法数量没有关系

新添加10个或多个方法到测试的类后,性能没什么差异。

3.7 读取文件内容

在可以用file_get_contents()替代file()fopen()feof()fgets()等系列方法的情况下,尽量用file_get_contents()

因为他的效率高得多!

3.8  引用传递参数

通过参数地址引用的方式,实现函数多个返回值,这比按值传递效率高。

方法是在参数变量前加个 &

3.9 方法不要细分得过多

仔细想想你真正打算重用的是哪些代码?

3.10 尽量静态化

如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍。

当然了,这个测试方法需要在十万级以上次执行,效果才明显。

其实,静态方法和非静态方法的效率主要区别在内存

静态方法在程序开始时生成内存,实例方法(非静态方法)在程序运行中生成内存。

所以,静态方法可以直接调用,实例方法要先成生实例再调用,静态速度很快,但是多了会占内存。

任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。

静态内存是连续的,因为是在程序开始时就生成了,而实例方法申请的是离散的空间,所以当然没有静态方法快。

静态方法始终调用同一块内存,其缺点就是不能自动进行销毁,而实例化可以销毁。

3.11 用C扩展方式实现

如果在代码中存在大量耗时的函数,可以考虑用C扩展的方式实现它们。

4 变量">4 变量4 变量">

4.1 及时销毁变量

数组对象GLOBAL变量在 PHP 中特别占内存的,这个由于 PHP 的底层的zend引擎引起的。

一般来说,PHP数组的内存利用率只有 1/10

也就是说,一个在C语言里面100M 内存的数组,在PHP里面就要1G。

特别是,在PHP作为后台服务器的系统中,经常会出现内存耗费太大的问题。

4.2 使用$_SERVER变量

如果你需要得到脚本执行的时间,$_SERVER['REQUSET_TIME']优于time()

一个是现成就可以直接用,一个还需要函数得出的结果。

4.3 方法里建立局部变量

在类的方法里建立局部变量速度最快,几乎和在方法里调用局部变量一样快。

4.4 局部变量比全局变量快

由于局部变量是存在栈中的。

当一个函数占用的栈空间不是很大的时候,这部分内存很有可能全部命中cache,CPU访问的效率是很高的。

相反,如果一个函数同时使用全局变量和局部变量,当这两段地址相差较大时,cpu cache需要来回切换,效率会下降。

4.5 局部变量而不是对象属性

建立一个对象属性(类里面的变量,例如:$this->prop++)比局部变量要慢3倍。

4.6 提前声明局部变量

建立一个未声明的局部变量,要比建立一个已经定义过的局部变量慢9-10倍。

4.7 谨慎声明全局变量

声明一个未被任何一个函数使用过的全局变量,也会使性能降低。

这和声明相同数量的局部变量一样,PHP可能去检查这个全局变量是否存在。

4.8 使用++$i递增

当执行变量$i的递增或递减时,$i++会比++$i慢一些。

这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码,并指望它们能立即变快,没用的。

++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。

后置递增实际上会产生一个临时变量,这个临时变量随后被递增。

而前置递增直接在原值上递增。

这是最优化处理的一种,正如Zend的PHP优化器所作的那样。

牢记,这个优化处理不失为一个好主意,因为不是所有的指令优化器都会做同样的优化处理。

4.9 不要随便复制变量

有时候为了使 PHP 代码更加整洁,一些 PHP 新手(包括我)会把预定义好的变量,复制到一个名字更简短的变量中。

其实这样做的结果是增加了一倍的内存消耗,只会使程序更加慢。

试想一下,在下面的例子中,如果用户恶意插入 512KB 字节的文字,就会导致 1MB 的内存被消耗!

// 不好的实践
$description = $_POST['description'];
echo $description;

// 好的实践
 echo $_POST['description'];

4.10 循环内部不要声明变量

尤其是大变量,这好像不只是PHP里面要注意的问题吧?

4.11 一定要对变量进行初始化

这里的“初始化”指的是“声明”。

当需要没有初始化的变量,PHP解释器会自动创建一个变量,但依靠这个特性来编程并不是一个好主意。

这会造成程序的粗糙,或者使代码变得另人迷惑。

因为你需要探寻这个变量是从哪里开始被创建的。

另外,对一个没有初始化的变量进行递增操作要比初始化过的来得慢。

所以对变量进行初始化会是个不错的主意。

5 数组">5 数组5 数组">

5.1 用字符串而不是数组作为参数

如果一个函数既能接受数组,又能接受简单字符做为参数,那么尽量用字符作为参数。

例如,字符替换函数,参数列表并不是太长,就可以考虑额外写一段替换代码。

使得每次传递参数都是一个字符,而不是接受数组做为查找和替换参数。

5.2 数组元素加引号

$row['id']$row[id]速度快7倍。

如果不带引号,例如$a[name],那么PHP会首先检查有没有define定义的name常量。

如果有,就用这个常量值作为数组键值。如果没有,再查找键值为字符串'name'的数组元素。

多了一个查找判断的过程,所以建议养成数组键名加引号的习惯。

正如上面字符串部分所述,用'又比用"速度更快。

5.3 多维数组操作

多维数组尽量不要循环嵌套赋值。

5.4 循环用foreach

尽量用foreach代替whilefor循环,效率更高。

6 架构">6 架构6 架构">

6.1 压缩输出

在php.ini中开启gzip压缩:

zlib.output_compression = On
zlib.output_compression_level = (level)

level可能是1-9之间的数字,你可以设置不同的数字。

几乎所有的浏览器都支持Gzip的压缩方式,gzip可以降低80%的输出.

付出的代价是,大概增加了10%的cpu计算量。

但是还是会赚到了,因为带宽减少了,页面加载会变得很快。

如果你使用apache,也可以激活mod_gzip模块。

6.2 静态化页面

Apache/Nginx解析一个PHP脚本的时间,要比解析一个静态HTML页面慢210倍。

所以尽量使页面静态化,或使用静态HTML页面。

6.3 将PHP升级到最新版

提高性能的最简单的方式是不断升级、更新PHP版本。

6.4 利用PHP的扩展

一直以来,大家都在抱怨PHP内容太过繁杂。

最近几年来,开发人员作出了相应的努力,移除了项目中的一些冗余特征。

即便如此,可用库以及其它扩展的数量还是很可观。

甚至一些开发人员开始考虑实施自己的扩展方案。

6.5 PHP缓存

一般情况下,PHP脚本被PHP引擎编译后执行,会被转换成机器语言,也称为操作码。

如果PHP脚本反复编译得到相同的结果,为什么不完全跳过编译过程呢?

PHP加速器缓存了编译后的机器码,允许代码根据要求立即执行,而不经过繁琐的编译过程。

对PHP开发人员而言,目前提供了两种可用的缓存方案。

一种是APC(Alternative PHP Cache,可选PHP缓存),它是一个可以通过PEAR安装的开源加速器。

另一种流行的方案是OPCode,也就是操作码缓存技术。

6.6 使用NoSQL缓存

Memchached或者Redis都可以。

这些是高性能的分布式内存对象缓存系统,能提高动态网络应用程序性能,减轻数据库的负担。

这对运算码 (OPcode)的缓存也很有用,使得脚本不必为每个请求重新编译。