您的位置:

php操作riak(php使用)

本文目录一览:

有没有技术大牛了解java开发,测试和CI的关

大家可能对如下情景比较熟悉:

如果开发过SSH的web项目,启动服务器可能会比较慢,有的项目甚至需要1分多钟,甚至更多,这个启动时间的等待一般就浪费了;

在开发项目时,有些功能比较复杂,当时觉得思路特清晰,但是过了一段时间后,自己也忘了,完善功能时频繁出现bug,降低开发速度;

在维护项目时,不知道自己修改的对还是不对,是否存在隐患;维护速度降下来了;

如果开发一个很多人都使用的接口,典型的如用户系统,要保证比如升级时向下兼容;

在团队间协作时,有时候只定义好接口,对方还没有给实现,如何进行同步开发?

如上问题,估计只要是个开发人员,都可能遇到过;如果此时有了单元/集成测试,那我们能很好的解决这些问题。(注:加下来如果没有特殊情况,不刻意强调 单元测试/集成测试,即提到测试是指的是单元/集成测试)

我从以下几个方面介绍测试:

1、为什么需要测试?

2、如何进行测试?

3、测试有哪些好处?

4、一切都需要测试吗?

1、为什么需要测试?

测试的目的是什么?我的理解是:

缩短发现问题到解决问题的速度;

给程序一个修改后能验证是否正确的保证;(回归测试)

如果是开源软件,我们可以通过单元测试了解其是怎么使用的;比如我之前通过cglib的单元测试学习过cglib的使用;

所以如果你遇到如上问题,就需要写测试。写测试可能是为了自己(1、2);也可能是为了帮助别人(3)。

2、如何进行测试?

很多朋友不知道如何进行测试,其实测试很简单,别把它想复杂了,按照自己的想法测试每个功能点是否正确即可。

2.1、测试流程

单元测试流程

集成测试流程

集成测试流程 

可以看出,单元测试与集成测试唯一不同点是一个调用依赖系统而一个不调用;因为单元测试是最小粒度的测试,如在Java中是测试一个类,不会测试依赖系统;而集成测试是会测试依赖系统的。

测试的步骤:

准备环境

调用被测系统

验证

清理环境

环境:也叫做夹具(fixture)或者固件,表示调用被测系统时需要准备/清理的数据等等;

被测系统:在Java中就是要测试的类,如UserService;

依赖系统:测试被测系统时,其依赖的部分,如UserDao;

测试用例:包含测试方法的类,里边有很多测试方法来测试被测系统。

接下来仔细看看各部分都做了哪些工作。

2.2、环境

环境,也叫做夹具(fixture),表示调用被测系统时需要准备/清理的数据等等;保证测试时环境是干净的,如不被之前的数据库数据影响;保证每次测试都是在干净/新鲜的环境中执行的。所谓干净的环境表示如当前测试不被之前测试插入/删除/修改的数据造成影响。在junit中可以使用:

@Before(setUp) 安装夹具或准备环境:在测试用例的每个测试方法之前执行;比如创建新鲜的被测系统,单元测试时安装Mock的依赖系统;

@After(tearDown)卸载夹具或清理环境:在测试用例的每个测试方法之后执行;比如数据库测试时回滚事务,删除数据;关闭文件;

@BeforeClass:在整个测试用例之前执行;

@AfterClass:在整个测试用例之后执行;

使用如上方法,而不是直接在测试方法中安装/卸载;是因为不管有没有异常,@After/@AfterClass都会执行,这样防止出现异常可能造成环境是不新鲜的问题。

如果大家使用spring test来测试数据库相关的系统,可以考虑使用@TransactionConfiguration来支持默认事务回滚,这样不会对现有系统造成影响。具体可参考《【第十三章】 测试 之 13.1 概述 13.2 单元测试 ——跟我学spring3》和《【第十三章】 测试 之 13.3 集成测试 ——跟我学spring3》

测试时一定要保证环境是干净/新鲜的,才能保证每次测试的结果是一样的。

2.3、被测系统与依赖系统

被测系统:在Java中就是被测试的Java类。

依赖系统:就是被测试Java类依赖的其他类。

如果是单元测试,一般情况下,会对依赖系统进行模拟(Mock),即给它一个假的实现;典型的如测试服务层时注入一个Mock的DAO层,这样的好处:

加快测试速度;因为不会调用真实的被测系统,所以速度特别快;

测试还没有完成的功能;尤其在多团队协作时,可以只在定义好接口的情况下开发系统;

如果是集成测试时,直接注入真实的依赖系统即可,好处:

完成联调;

发现自己的问题;

还可能发现自己使用上问题及使用的API的问题;

单元测试虽然好,但是是隔离测试,即不会调用被测系统来完成测试,因为不是真实的联调,所以很可能会潜在有一些问题,因此还是需要集成测试。(所以不是很刻意分单元或集成测试,且有些系统可能只有集成测试)

但是集成测试速度是比较慢的,一般提交给CI执行,不影响当前开发进度。

2.4、验证

验证的目的:是保证实际结果和我们预期的结果是否一致,说白了就是是否是我们想的那样。

一般使用断言来验证,如:

Assert.assertEquals(expectedResult, actualResult); //验证预期结果和实际结果是否相等

验证主要有两种:

结果验证

行为验证

结果验证:即验证被测系统返回的结果是否正确,如:

Java代码  

@Test

public void testCount() {

String ql = "select count(o) from User o";

long expectedCount = repositoryHelper.count(ql) + 1;

User user = createUser();

repositoryHelper.getEntityManager().persist(user);

long acutalCount = repositoryHelper.count(ql);

Assert.assertEquals(expectedCount, acutalCount);

}

验证返回的数据总数 = 插入之前的总数 + 1; 即结果验证。此处我们使用了一种叫做相对(delta)测试;即不关心数据库里到底多少条,只关心实际的和预期的差。

行为验证:即验证被测系统是否调用了依赖系统的某个API ,这个只有当我们使用Mock时测试时比较简单,如当用户注册时:

1、加积分

2、发系统消息

3、……

此时我们并不能通过结果验证是否调用了这些方法;那么我们可以使用Mock技术来完成验证是否调用了这些API,比如使用jmock测试框架就支持行为验证。集成测试是很难进行行为验证的,如果测试需要预留间谍接口。

3、测试有哪些好处?

我们写代码的目的是正确的完成某个功能,如何保证正确呢?测试!所以在不使用如单元测试技术时,我们也是需要测试,但是这个测试是我们人工验证的。缺点很明显:

不是自动的,每次需要对比预期结果与实际结果,尤其数据量/逻辑复杂时更痛苦;

不是回归的,上次测试完成后,下次还得重复自己一遍;

为了解决这个问题,我们使用如单元测试技术来解决这个问题:

测试自动化;即验证预期结果与实际结果交给计算机吧;

测试回归性,可以重复执行测试,验证修改后逻辑是否还是正确的;

即测试的好处,从如上已经提炼出来了:

缩短发现问题到解决问题的时间;

重复使用测试,保证修改后的代码还是正确的;

如果做开源项目,可以提供给使用人员参考如何使用;

因为单元测试都非常快,所以提升了开发速度;

4、一切都需要测试吗?

肯定不是,一切都是相对的;哪些不需要测试呢:

你非常熟悉的功能;

一些简单的CRUD;

你认为不需要测试的;比如你很有把握的东西,就没有必要浪费时间测试了;

哪些需要测试呢:

复杂的业务逻辑/系统核心功能,最典型的如订单系统:一定要有足够的单元测试保证,这是一个电商系统的核心;还有如用户系统、积分系统等等;

框架级别/工具级别/通用级别的代码需要测试,即提供给第三方使用的代码,因为这些代码可能被很多系统依赖,应该保证其正确性;而且还要保证以后版本升级的向下兼容;

你认为需要测试的,比如你没有把握的东西,还是写点测试来缩短如开发web项目的重启系统的时间吧;

测试不是不耗时间的,没意义的测试就是浪费时间,最典型是一些书上的对一个增删改查进行测试,实际项目没有任何意义。所以你应该只对自己很难驾驭的觉得有必要的代码进行测试。不要成为一个测试狂,什么都测试。

一些测试可以参考我的《es——JavaEE快速开发脚手架》中的代码。通过测试我得到了许多好处。

到此我们介绍完成了测试,但是如果我们使用了如集成测试时,测试执行起来可能比较慢,跑一遍测试可能需要5分钟,那怎么办呢?

每天下班前跑一遍集成测试,然后修复,下班走人;

CI:持续集成,交给持续集成服务器,自动地测试完成后把测试报告以邮件的形式发到开发人员邮箱;

------------------------------------分割线----------------------------------

接下来介绍一下CI吧。

1、为什么需要CI

2、CI如何工作的

3、travis-ci介绍

1、为什么需要CI

正如前边说的,我们单独测试可能会遇到如下问题:

如果写了一个测试,就要把所有测试跑一遍看看整个系统是否是正确的,那么每次等待时间是非常漫长的;

如果团队中的其他成员改了功能并提交了,如何快速得到该次提交对当前系统代码是正确还是失败的反馈;

那怎么办呢?自动化地持续集成(CI)!CI的核心就是干这件事情的。自动化持续地集成测试。

使用CI后,如果使用Maven,可以新建多个profile:

本地测试时忽略一些比较慢的测试;

CI服务器上执行所有测试;

2、CI如何工作的

一个典型的持续集成流程:

定期检测版本服务器上是否有代码更新;

如果发现代码更新,从版本服务器下载最新的代码;

自动构建并自动化的测试;

不管错误/失败,生成报告给开发人员;

有些CI服务器还能产生可执行的软件,自动化地部署到测试机器,交给测试人员测试。

如图所示:

持续集成服务器其实就是一个定时器,自动帮你下载最新代码、编译、测试、集成及产生报告发给开发人员。

常见的CI服务器有:

Apache Continuum

Hudson

CruiseControl

Jenkins CI

TeamCity

Travis CI

我09年时使用过TeamCity社区版,足够满足常见需求;目前我使用github托管项目,使用Travis CI进行分布式的持续集成,免费,目前看来还是不错的。

3、travis-ci介绍

我现在开发的ES-JavaEE项目开发脚手架就是使用travis ci进行持续集成;具体参考《Getting started》进行与Github集成,其支持的语言:

C

C++

Clojure

Erlang

Go

Groovy

Haskell

Java

JavaScript (with Node.js)

Objective-C

Perl

PHP

Python

Ruby

Scala

支持的数据库:

MySQL

PostgreSQL

MongoDB

CouchDB

Redis

Riak

RabbitMQ

Memcached

Cassandra

Neo4J

ElasticSearch

Kestrel

SQLite3

更多请参考其官网的介绍。

如果是Java开发人员,支持的JDK包括:OpenJDK 和 OracleJDK。 如果使用的是OpenJDK,Maven中使用ascii2native插件时,需要如下配置:

Java代码  

plugin

groupIdorg.codehaus.mojo/groupId

artifactIdnative2ascii-maven-plugin/artifactId

version1.0-alpha-1/version

executions

execution

phasegenerate-resources/phase

goals

goalnative2ascii/goal

/goals

configuration

encodingUTF-8/encoding

srcsrc/main/messages/src

desttarget/${project.artifactId}/WEB-INF/classes/dest

includesmessages.properties/includes

/configuration

/execution

/executions

!-- native2ascii 使用的tools.jar --

dependencies

dependency

groupIdcom.sun/groupId

artifactIdtools/artifactId

version1.7.0/version

scopesystem/scope

systemPath${java.home}/../lib/tools.jar/systemPath

/dependency

/dependencies

/plugin

如果使用mysql,端口只能是3306。

如果想开端口测试,这是不允许的。

如下是我项目中的一个配置.travis.yml,放到项目的根下即可:

-----------------------------------

language: java           语言

env:                           环境

- DB=mysql              使用mysql

jdk:

- openjdk                jdk使用openjdk

mysql:

database: es         数据库名为es

username: root     用户名为root

password :            密码为空

encoding: utf8      编码为utf8

install:                     安装时执行的脚本

- mvn install -Dmaven.test.skip=true     mvn安装并跳过测试

before_script:        script之前执行的测试

- cd web            

- mvn db:create  创建数据库的mvn命令(此处使用了 maven-db-plugin 插件)

- mvn db:schema  创建脚本的mvn命令

- mvn db:data        安装数据的mvn命令

- cd ..

script:                      测试时执行的脚步

- cd common

- mvn test              测试common子模块

- cd ..

- cd web

- mvn test -Pit       测试web子模块,并指定使用it profile测试(即集成测试的配置,具体参考pom.xml中的profile/it)

notifications:          触发

email:                  测试完成后测试报告发到哪

- zhangkaitao0503@gmail.com

-----------------------------------

持续集成不能修复代码的错误,而是和单元测试一样,缩短发现问题带解决问题的时间,这样可以提高开发效率,降低项目风险,提高项目的稳定性。而且尤其是团队协作时,可以发现其他人的代码是否对自己的代码产生影响。

到此我们利用单元测试+CI可以加速开发人员的开发速度。利用好单元测试和CI,不要纯粹为了单元测试和CI而去做这些事情。

本文没有介绍TDD,TDD并不会那么美好,我认为我们可以借鉴TDD的一些思想,但决不能迷信TDD,有时候,尤其如开发企业应用,先写功能再写测试可能效率更高,而且大部分时候是不需要TDD的。而且我也没能在实际项目中获取太多TDD的好处,但是我获得了测试的好处。

本文也没有介绍测试覆盖率,我认为不要一味的追求覆盖率,有时候有的覆盖率没有任何意义。所以不要让为了覆盖率而覆盖率拖慢了项目开发进度。

正如stackoverflow上的一篇帖子《How deep are your unit tests?》上Kent Beck的回答:

写道

老板为我的代码付报酬,而不是测试,所以,我对此的价值观是——测试越少越好,少到你对你的代码质量达到了某种自信。

可以前往coolshell的“单元测试要做多细?”去得到一些经验。

哪个不是Hadoop 的核心组件 hbase hive zookeeper riak

riak 华师大的吧- -

下面来简单介绍各个组件的作用:

HDFS(Hadoop distribute file system)——Hadoop生态系统的基础组件Hadoop分布式文件系统。它是其他一些工具的基础HDFS的机制是将大量数据分布到计算机集群上,数据一次写入,但可以多次读取用于分析。HDFS让Hadoop可以最大化利用磁盘。

HBase—— 一个构建在HDFS之上的面向列的NoSql数据库,HBase用于对打量数据进行快速读取/写入。HBase将Zookeeper用于自身的管理,以保证其所有组件都正在运行。HBase使得Hadoop可以最大化利用内存。

MapReduce——MapReduce是Hadoop的主要执行框架,它是一个用于分布式并行数据处理的编程模型,将作业分为mapping阶段和reduce阶段。开发人员谓Hadoop编写MapReduce作业,并使用HDFS中存储的数据,而HDFS可以保证快速的数据访问。鉴于MapReduce作业的特性,Hadoop以并行的方式将处理过程移向数据。MapReduce使得Hadoop可以最大化利用CPU。

Zookeeper——Zookeeper是Hadoop的分布式协调服务。Zookeeper被设计成可以在机器集群上运行,是一个具有高度可用性的服务,用于Hadoop操作的管理,而且很多Hadoop组件都依赖它。

Oozie—— Oozie是一个北极测很难过到Hadoop软件栈中的可扩展的Workflow系统。用于协调多个MapReduce作业的执行。它能够处理大量的复杂性,基于外部事件来管理执行。

Pig——Pig是对MapReduce编程复杂性的抽象,Pig平台包含用于分析Hadoop数据集的执行环境和脚本语言(Pig Latin)。它的编译器将Pig Latin翻译为MapReduce程序序列。

Hive——类似于SQL的高级语言,用于执行对存储在Hadoop中数据的查询,Hive允许不熟悉MapReduce的开发人员编写数据查询语句,它会将翻译为Hadoop中的MapReduce作业。类似于Pig。Hive是一个抽象层,适合于较熟悉SQL而不是java编程的数据库分析师。

Hadoop生态系统中还包含一些用于与其他企业级应用进行集成的框架,例如上图所示的Sqoop和Flume:

Sqoop是一个连通性工具,用于在关系型数据库和数据仓库Hadoop之间移动数据。Sqoop利用数据库来描述导入/导出数据的模式,并使用MapReduce实现并行操作和容错。

Fulme是一个分布式的、具有可靠性和高可用性的服务,用于从单独的机器上将大量数据高效的收集、聚合并移动到HDFS中。它给予一个简单灵活的架构,童工流式数据操所。它借助于简单可扩展的数据模型,允许将来自企业中多台机器上的数据移到Hadoop中。

mac brew 怎么安装msql 5.5

Brew 是 Mac 下面的包管理工具,通过 Github 托管适合 Mac 的编译配置以及 Patch,可以方便的安装开发工具。 Mac 自带ruby 所以安装起来很方便,同时它也会自动把git也给你装上。官方网站: brew/Homebrew/homebrew/go/install)" 使用以下方法可以查看brew是否安装成功,以及目前的版本:liondeMacBook-Pro:~ lion$ brew -v Homebrew 0/project/machomebrew/Bottles/curl-7/freetds/stable/freetds-0/project/machomebrew/Bottles/gmp-6.0.0a.mavericks.bottle.tar.gz ######################################################################## 100.0% == Pouring gmp-6.0.0a.mavericks.bottle.tar.gz /usr/local/Cellar/gmp/6.0.0a: 15 files, 3.2M == Installing php55 == Downloading /get/php-5.5.15.tar.bz2/from/this/mirror Already downloaded: /Library/Caches/Homebrew/php55-5.5.15 == ./configure --prefix=/usr/local/Cellar/php55/5.5.15 --localstatedir=/usr/local/var --sysconfdir=/usr/local/etc/php/5.5 -- == make == make install == /usr/local/Cellar/php55/5.5.15/bin/pear config-set php_ini /usr/local/etc/php/5.5/php.ini == Caveats The php.ini file can be found in: /usr/local/etc/php/5.5/php.ini ✩✩✩✩ PEAR ✩✩✩✩ If PEAR complains about permissions, 'fix' the default PEAR permissions and config: chmod -R ug+w /usr/local/Cellar/php55/5.5.15/lib/php pear config-set php_ini /usr/local/etc/php/5.5/php.ini ✩✩✩✩ Extensions ✩✩✩✩ If you are having issues with custom extension compiling, ensure that you are using the brew version, by placing /usr/local/bin before /usr/sbin in your PATH: PATH="/usr/local/bin:$PATH" PHP55 Extensions will always be compiled against this PHP. Please install them using --without-homebrew-php to enable compiling against system PHP. ✩✩✩✩ PHP CLI ✩✩✩✩ If you wish to swap the PHP you use on the command line, you should add the following to ~/.bashrc, ~/.zshrc, ~/.profile or your shell's equivalent configuration file: export PATH="$(brew --prefix homebrew/php/php55)/bin:$PATH" ✩✩✩✩ FPM ✩✩✩✩ To launch php-fpm on startup: * If this is your first install: mkdir -p ~/Library/LaunchAgents cp /usr/local/Cellar/php55/5.5.15/homebrew.mxcl.php55.plist ~/Library/LaunchAgents/ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php55.plist * If this is an upgrade and you already have the homebrew.mxcl.php55.plist loaded: launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.php55.plist cp /usr/local/Cellar/php55/5.5.15/homebrew.mxcl.php55.plist ~/Library/LaunchAgents/ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php55.plist The control script is located at /usr/local/Cellar/php55/5.5.15/sbin/php55-fpm Mountain Lion comes with php-fpm pre-installed, to ensure you are using the brew version you need to make sure /usr/local/sbin is before /usr/sbin in your PATH: PATH="/usr/local/sbin:$PATH" You may also need to edit the plist to use the correct "UserName". Please note that the plist was called 'homebrew-php.josegonzalez.php55.plist' in old versions of this formula. To have launchd start php55 at login: ln -sfv /usr/local/opt/php55/*.plist ~/Library/LaunchAgents Then to load php55 now: launchctl load ~/Library/LaunchAgents/homebrew.mxcl.php55.plist == Summary /usr/local/Cellar/php55/5.5.15: 477 files, 43M, built in 3.9 minutes 过程中如果出现configure: error: Cannot find OpenSSL's evp.h这样的错误,请执行以下命令,将xcode进行更新:xcode-select --install 在PHP5安装完成的提示中写到,如何进行PHP5和mac自带的php以及php-fpm替换,执行以下命令后,我们可以看到当前的php版本已经是最新的了:liondeMacBook-Pro:~ lion$ echo 'export PATH=/usr/local/bin:$PATH' ~/.bash_profile liondeMacBook-Pro:~ lion$ echo 'export PATH=/usr/sbin:$PATH' ~/.bash_profile liondeMacBook-Pro:~ lion$ echo 'export PATH=/usr/local/sbin:$PATH' ~/.bash_profile liondeMacBook-Pro:~ lion$ source ~/.bash_profile liondeMacBook-Pro:~ lion$ php -v PHP 5.5.15 (cli) (built: Aug 14 2014 15:37:16) (DEBUG) Copyright (c) 1997-2014 The PHP Group Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies liondeMacBook-Pro:~ lion$ 使用brew search php55-命令,可以查看还有哪些扩展可以安装,然后执行brew install php55-XXX就可以了。liondeMacBook-Pro:~ lion$ brew search php55- php55-amqp php55-igbinary php55-msgpack php55-runkit php55-varnish php55-apcu php55-imagick php55-mysqlnd_ms php55-scrypt php55-vld php55-augmentedtypes php55-inclued php55-oauth php55-snappy php55-wbxml php55-binpack php55-intl php55-opcache php55-solr php55-xcache php55-blitz php55-ioncubeloader php55-parsekit php55-sphinx php55-xdebug php55-boxwood php55-jsmin php55-pcntl php55-spl-types php55-xhgui php55-chdb php55-judy php55-pdflib php55-ssh2 php55-xhp php55-couchbase php55-leveldb php55-pdo-dblib php55-stats php55-xhprof php55-crypto php55-libevent php55-pdo-pgsql php55-stemmer php55-xmldiff php55-dbase php55-libvirt php55-phalcon php55-sundown php55-yac php55-dbus php55-lz4 php55-proctitle php55-svm php55-yaf php55-dmtx php55-lzf php55-propro php55-swoole php55-yaml php55-ev php55-mailparse php55-protobuf php55-thrift php55-yar php55-gearman php55-mcrypt php55-pspell php55-tidy php55-yaz php55-geoip php55-memcache php55-pthreads php55-timezonedb php55-yp php55-gmagick php55-memcached php55-raphf php55-tokyotyrant php55-yrmcds php55-graphdat php55-midgard2 php55-redis php55-twig php55-zmq php55-htscanner php55-mongo php55-redland php55-uploadprogress php55-zookeeper php55-http php55-mosquitto php55-riak php55-uuid 我安装的是以下php5.5几个扩展:liondeMacBook-Pro:~ lion$ brew install php55-imagick php55-igbinary php55-ev php55-gmagick php55-geoip php55-memcache php55-memcached php55-thrift php55-xdebug php55-sphinx composer 接下来我们测试php-fpm的配置是否正确,以及是否正确启动:#测试php-fpm配置是否正确 liondeMacBook-Pro:bin lion$ php-fpm -t [14-Aug-2014 16:14:30] NOTICE: configuration file /usr/local/etc/php/5.5/php-fpm.conf test is successful liondeMacBook-Pro:bin lion$ php-fpm -c /usr/local/etc/php/5.5/php.ini -y /usr/local/etc/php/5.5/php-fpm.conf -t [14-Aug-2014 16:14:48] NOTICE: configuration file /usr/local/etc/php/5.5/php-fpm.conf test is successful #启动php-fpm liondeMacBook-Pro:bin lion$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php55.plist #查看9000端口是否在运行 liondeMacBook-Pro:bin lion$ lsof -i:9000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME php-fpm 51241 lion 8u IPv4 0xce9d0f6417637937 0t0 TCP localhost:cslistener (LISTEN) php-fpm 51243 lion 0u IPv4 0xce9d0f6417637937 0t0 TCP localhost:cslistener (LISTEN) php-fpm 51244 lion 0u IPv4 0xce9d0f6417637937 0t0 TCP localhost:cslistener (LISTEN) php-fpm 51245 lion 0u IPv4 0xce9d0f6417637937 0t0 TCP localhost:cslistener (LISTEN) #关闭掉php-fpm进程,再查看9000端口,没有监听了 liondeMacBook-Pro:bin lion$ ps auxgrep php-fpmgrep -v 'grep'awk '{print $2}'xargs kill -9 liondeMacBook-Pro:bin lion$ lsof -i:9000 liondeMacBook-Pro:bin lion$ 设置PHP-FPM开机运行(其实在安装完成的提示中,也有说明):ln -sfv /usr/local/opt/php55/*.plist ~/Library/LaunchAgents launchctl load ~/Library/LaunchAgents/homebrew.mxcl.php55.plist