月度归档:2015年09月

PHP中闭包的使用

PHP中闭包的使用

例子一

例子二

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使用例子

生产方

消费方

PHP版本Socket学习

PHP版本Socket学习

Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

Socket起源于UNIX,在Unix一切皆文件哲学的思想下,Socket是一种 打开—读/写—关闭 模式的实现,服务器和客户端各自维护一个”文件”,在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket

Socket通信流程

  • 服务器为socket绑定ip地址和端口号
  • 服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开
  • 客户端创建socket
  • 客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket
  • 服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入 阻塞 状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求
  • 客户端连接成功,向服务器发送连接状态信息
  • 服务器accept方法返回,连接成功
  • 客户端向socket写入信息
  • 服务器读取信息
  • 客户端关闭
  • 服务器端关闭

服务端代码,运行在cli模式

客户端代码