分类目录归档:PHP扩展

用vagrant来搭建自己专属的开发环境

最近vagrant比较流行,它的主要作用简言之就是打包一份已经装好的系统,打包好的系统在各平台通用。特别是对于一个比较复杂的开发环境,新换一台电脑,新换一个工作,必须在重新搭建环境,这种事情搞起来还是比较费时间的,比如PHP开发所用的LAMP环境(我平时都装LANMP – Apache+Nginx+MySQL+PHP),还有Redis,MongoDB,RabbitMQ这些扩展的东东,虽然自己有完全的文档,但是多年搞下来也成一个体力活儿了。这样vagrant对我的优势简直不言而愉了。可以将一个已经打包好的系统给你,你可以和我有完全相当的开发环境。节省时间,提升效率

废话不多说了,接下来开始使用这个vagrant

  • 安装软件的事情就不啰嗦了(vagrant+virtualbox),闭眼下一步就行
  • 下载一个box镜像(直接找个镜像下载就行)

    上面那两步完成以后,让我们来添加一个叫lamp的box

添加一个叫lamp的虚拟机(MAC OS X环境)

vi Vagrantfile 编辑配置文件,加入以下内容,在初始化的时候会用到

在这里介绍一下网络配置,一般情况单机开发用私有网络,只有自己可以访问这个IP,但是这个IP还可以联互联网,满足了我们大部分人的需求

vagrant ssh

vagrant package lamp –output D:/vagrant/lamp.box

———————————–分割线下面是一些命令————————————

———————————–分割线下面是在windows下实际操作————————————

用xshell来连接vagrant

Ubuntu下手动编译php-amqp扩展附PHP中RabbitMQ使用例子

Linux教程之ubuntu下手动编译php-amqp扩展

首先,神马是amqp?介绍在这里,简单的讲就是高级队列协议。而这个扩展就是为了让php可以支持amqp协议与相关的队列服务通讯。

优点:可以解决服务器处理的并发问题。
高级消息队列协议(AMQP)是一个异步消息传递所使用的应用层协议规范。作为线路层协议,而不是API(例如JMS),AMQP 客户端能够无视消息的来源任意发送和接受信息。现在,已经有相当一部分不同平台的服务器和客户端可以投入使用。

(一)基本概念

RabbitMQ 是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协 议)的标准实现。如果不熟悉AMQP,直接看RabbitMQ的文档会比较困难。不过它也只有几个关键概念,这里简单介绍。

几个概念说明:

  • Broker:简单来说就是消息队列服务器实体。
  • Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
  • Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
  • Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
  • Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
  • vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
  • producer:消息生产者,就是投递消息的程序。
  • consumer:消息消费者,就是接受消息的程序。
  • channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

(二)使用流程

即 Client – AMQP server – Client
左边的Client向右边的Client发送消息,流程:

  • 获取Conection
  • 获取Channel
  • 定义Exchange,Queue
  • 使用一个RoutingKey将Queue Binding到一个Exchange上
  • 通过指定一个Exchange和一个RoutingKey来将消息发送到对应的Queue上,
  • 接收方在接收时也是获取connection,接着获取channel,然后指定一个Queue直接到它关心的Queue上取消息,它对Exchange,RoutingKey及如何binding都不关心,到对应的Queue上去取消息就OK了

由于ubuntu的默认源里面没有php5-amqp这个包,所以要用上amqp得考手动编译。

准备工作:

安装php编译工具

安装rabbitmq的库

如果你的Linux发行版没有现成的librabbitmq-dev包,那么可以通过下载源码编译安装

然后如果你没有安装git话请安装一下git,因为我们要从官方的版本库中获取源代码

克隆源码并编译

编译库

然后我们需要去下载php扩展的源代码,地址在此:

http://pecl.php.net/package/amqp

当前最新版本为1.4.0

创建配置文件

然后重启你的web服务器或者php-fpm并打印phpinfo,如果见到以下的内容就说明扩展安装好了

@RabbitMQ使用例子

生产方

消费方

msgpack二进制打包协议

MessagePack简称msgpack,官方网站是http://msgpack.org/ ,代码可以在github上查看https://github.com/msgpack。

官方介绍是“Extremely efficient object serialization library for cross-language communication.It’s like JSON, but very fast and small.”, 是一种 跨语言的基于二进制的数据格式。

从官方的介绍来看 , 它能够比google protocol buffers快4倍,比json快10倍多 。

下面给PHP安装msgpack扩展

先查找有没有phpize工具

 

 

不好意思,报错了,根据他说的来吧

 

 

文件添加 extension=msgpack.so

service php-fpm restart 再次重启,成功!

php -m | grep msgpack
php -i | grep msgmack

安装成功以后,来一段代码吧。

MessagePack的核心压缩方式:

1.true、false 之类的:这些太简单了,直接给1个字节,(0xc2 表示true,0xc3表示false)

2.不用表示长度的:就是数字之类的,他们天然是定长的,是用一个字节表示后面的内容是什么东东,比如用(0xcc 表示这后面,是个uint 8,用oxcd表示后面是个uint 16,用 0xca 表示后面的是个float 32).

3.不定长的:比如字符串、数组,类型后面加 1~4个字节,用来存字符串的长度,如果是字符串长度是256以内的,只需要1个字节,MessagePack能存的最长的字符串,是(2^32 -1 ) 最长的4G的字符串大小。

4.ext结构:表示特定的小单元数据。

5.高级结构:MAP结构,就是key=>val 结构的数据,和数组差不多,加1~4个字节表示后面有多少个项。

 

为啥会快?

先说说JSON怎么解析吧,我们开发中一般都用cJSON这个库,cJSON存储的时候是采用链表存储的,其访问方式很像一颗树。每一个节点可以有 兄妹节点,通过next/prev指针来查找,它类似双向链表;每个节点也可以有孩子节点,通过child指针来访问,进入下一层。问题就是首先,构造这 个链表的时候,得一个字符一个字符地匹配过去吧,得判断是不是引号、括号之类的吧…

但是MessagePack 则简单多了,直接一遍遍历过去了,从前面的数据头,就可以知道后面的是什么数据,指针应该向后移动多少,比JSON的构建链表少了很多比较的过程。

来计算个数据吧,把刚才的数组,encode、decode重复1000000万次:

[root@test www]# php msgpack.php
json time: 5.0772788524628
msgpack time: 2.5925579071045

大概是快这么多吧,如果数组更大,理论上,MessagePack比Json快更多。

 

注:部分内容来自互联网

 

Ubuntu14.04安装Swoole扩展

Swoole是国内牛人写的一个PHP的异步,并行,分步式扩展,是一个PHP的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。
Swoole可以广泛应用于互联网、移动通信、企业软件、网络游戏、物联网、车联网、智能家庭等领域。 使用PHP+Swoole作为网络通信框架,可以使企业IT研发团队的效率大大提升,更加专注于开发创新产品。

下面在Ubuntu环境下安装一下Swoole扩展(前题:本人的Ubuntu环境看上篇博文)

1. 确认安装环境

仅支持Linux操作系统,核心代码兼容FreeBSD,需要调整某些编译的参数和细节才能通过
Linux内核版本2.3.32以上
PHP5.3.10以上版本
gcc4.4以上版本。核心代码兼容clang,需要关闭CPU亲和设置特性
cmake2.4+,编译为libswoole.so作为C/C++库时,需要使用cmake

2. 安装与配置

2. 1安装swoole:可pecl直接在线安装,或下载 releases版本的swoole编译安装
2.11编译安装swoole扩展

从此处下载: http://pecl.php.net/package/swoole

# cd swoole
# phpize
# ./configure
# make && make install

2.12 pecl安装swoole扩展

pecl不可用的请确认php安装目录的bin目录已加入系统变量

本文介绍的用pecl方式来安装
zzs@ubuntu:~$ sudo pecl install swoole
downloading swoole-1.7.8.tgz …
Starting to download swoole-1.7.8.tgz (412,906 bytes)
….done: 412,906 bytes
130 source files, building
running: phpize
sh: 1: phpize: not found
If the command failed with ‘phpize: not found’ then you need to install php5-dev packageYou can do it by running ‘apt-get install php5-dev’ as a root userERROR: `phpize’ failed

zzs@ubuntu:~$ sudo apt-get install php5-dev
正在读取软件包列表… 完成
正在分析软件包的依赖关系树
正在读取状态信息… 完成
将会安装下列额外的软件包:
pkg-php-tools shtool
建议安装的软件包:
dh-make
下列【新】软件包将被安装:
php5-dev pkg-php-tools shtool
升级了 0 个软件包,新安装了 3 个软件包,要卸载 0 个软件包,有 13 个软件包未被升级。
需要下载 0 B/527 kB 的软件包。
解压缩后会消耗掉 4,431 kB 的额外空间。
您希望继续执行吗? [Y/n] y

install ok: channel://pecl.php.net/swoole-1.7.8
configuration option “php_ini” is not set to php.ini location
You should add “extension=swoole.so” to php.ini
zzs@ubuntu:~$ sudo vim /etc/php5/mods-available/swoole.ini
里面加入内容

此时还没有swoole模块

 

附php5配置文件说明
cd /etc/php5/
ls
apache2 cli fpm mods-available
我的系统这里面有4个目录
其中 真正的扩展在mods-available目录中,其他的环境要想使扩展生效ubuntu使用软链接的方式使其生效,这样有个好处,当真正的配置文件发生变化,只需要改一处(modo-available)就可以了。

测试扩展

server.php:

client.php:

 

最后感谢作者rango为php开发出这么牛的扩展,为开源事业做出贡献,希望php越来越有范儿。