edis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C ,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。<?php require __DIR__.'/shared.php'; use Predis\Command\CommandInterface; use Predis\Connection\StreamConnection; class SimpleDebuggableConnection extends StreamConnection { private $tstart = 0; private $debugBuffer = array(); public function connect() { $this->tstart = microtime(true); parent::connect(); }
使用数据库抽象层,意味着当从一个数据 库系统向另一个数据库系统迁移时,几乎不用更改太多的程序代码,如将MS SQL Server迁移到MySQL。首先,代码规划必须规范,即整个系统使 用同一个数据对象实例,并且使用同一个较好的数据库抽象层。如果有一天用 户要求将Oracle切 换到MySQL,则只需 要改变系统的配置文件即可。在当今工业领域中,每个数据库开发商如 微软、Oracle、MySQL,都有自己的一套SQL标准,它们声称是按照ANSI SQL92标准而增加自己的特性,以达 到垄断或占领市场的目的。优秀的数据库抽象层,会根据我们现在使 用的数据库自动调整一些SQL性能。当没有使用数据库本身特定的特性时,就不必更改太多的数据库连接和数据库SQL查询。 使用数据库抽象层的其他好处是:其性质、概念简化了复杂的任务。因此,我们不必学习某个数据库系统的全新特 性,而只用一个标准的抽象层的代码特性即可。<?php use Bernard\Message\PlainMessage; class EchoTimeService { public function echoTime(PlainMessage $message) { if (rand(0, 10) == 7) { throw new \RuntimeException('I failed because rand was 7'); } usleep(100); } }
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有 RabbitMQ等。abstract class AbstractChannel { const PROTOCOL_080 = '0.8'; const PROTOCOL_091 = '0.9.1'; public static $PROTOCOL_CONSTANTS_CLASS; public function __construct(AbstractConnection $connection, $channel_id) { $this->connection = $connection; $this->channel_id = $channel_id; $connection->channels[$channel_id] = $this; $this->frame_queue = array(); // Lower level queue for frames $this->method_queue = array(); // Higher level queue for methods $this->auto_decode = false; $this->msg_property_reader = new AMQPReader(null); $this->wait_content_reader = new AMQPReader(null); $this->dispatch_reader = new AMQPReader(null); $this->protocolVersion = self::getProtocolVersion(); switch ($this->protocolVersion) { case self::PROTOCOL_091: self::$PROTOCOL_CONSTANTS_CLASS = 'PhpAmqpLib\Wire\Constants091'; $c = self::$PROTOCOL_CONSTANTS_CLASS; $this->debug = new DebugHelper($c); $this->amqp_protocol_header = $c::$AMQP_PROTOCOL_HEADER; $this->protocolWriter = new Protocol091(); $this->waitHelper = new Wait091(); $this->methodMap = new MethodMap091(); break; case self::PROTOCOL_080: self::$PROTOCOL_CONSTANTS_CLASS = 'PhpAmqpLib\Wire\Constants080'; $c = self::$PROTOCOL_CONSTANTS_CLASS; $this->debug = new DebugHelper($c); $this->amqp_protocol_header = $c::$AMQP_PROTOCOL_HEADER; $this->protocolWriter = new Protocol080(); $this->waitHelper = new Wait080(); $this->methodMap = new MethodMap080(); break; default: throw new AMQPRuntimeException(sprintf( 'Protocol: %s not implemented.', $this->protocolVersion )); } }
OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAUTH认证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP、JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间,因而OAUTH是简易的。互联网很多服务如Open API,很多大公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权的标准。<?php namespace OAuth; use OAuth\Common\Service\ServiceInterface; use OAuth\Common\Consumer\CredentialsInterface; use OAuth\Common\Storage\TokenStorageInterface; use OAuth\Common\Http\Client\ClientInterface; use OAuth\Common\Http\Client\StreamClient; use OAuth\Common\Http\Uri\UriInterface; use OAuth\Common\Exception\Exception; use OAuth\OAuth1\Signature\Signature; class ServiceFactory { protected $httpClient; protected $serviceClassMap = array( 'OAuth1' => array(), 'OAuth2' => array() ); protected $serviceBuilders = array( 'OAuth2' => 'buildV2Service', 'OAuth1' => 'buildV1Service', ); public function setHttpClient(ClientInterface $httpClient) { $this->httpClient = $httpClient; return $this; }
rabbitmq(MQ)全称为Message Queue, 消息队列是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM WEBSPHERE MQ等等。 <?php require __DIR__ . '/../vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPLazyConnection; use Thumper\ConnectionRegistry; $connections = array( 'default' => new AMQPLazyConnection('localhost', 5672, 'guest', 'guest', '/') ); $registry = new ConnectionRegistry($connections, 'default');
rabbitmq(MQ)全称为Message Queue, 消息队列是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM WEBSPHERE MQ等等。<?php namespace PhpAmqpLib\Connection; class AMQPLazyConnection extends AMQPStreamConnection { /** * Gets socket from current connection * * @deprecated */ public function getSocket() { $this->connect(); return parent::getSocket(); } /** * {@inheritdoc} */ public function channel($channel_id = null) { $this->connect(); return parent::channel($channel_id); } /** * @return null|\PhpAmqpLib\Wire\IO\AbstractIO */ protected function getIO() { if (empty($this->io)) { $this->connect(); } return $this->io; } /** * Should the connection be attempted during construction? * * @return bool */ public function connectOnConstruct() { return false; } }
Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消费。<?php $rk = new RdKafka\Consumer(); $rk->setLogLevel(LOG_DEBUG); $rk->addBrokers("127.0.0.1"); $topic = $rk->newTopic("test"); $topic->consumeStart(0, RD_KAFKA_OFFSET_BEGINNING); while (true) { $msg = $topic->consume(0, 1000); if ($msg->err) { echo $msg->errstr(), "\n"; break; } else { echo $msg->payload, "\n"; } }
OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAUTH认证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP、JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间,因而OAUTH是简易的。互联网很多服务如Open API,很多大公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权的标准。class ServiceFactory { protected $httpClient; protected $serviceClassMap = array( 'OAuth1' => array(), 'OAuth2' => array() ); protected $serviceBuilders = array( 'OAuth2' => 'buildV2Service', 'OAuth1' => 'buildV1Service', ); public function setHttpClient(ClientInterface $httpClient) { $this->httpClient = $httpClient; return $this; } public function registerService($serviceName, $className) { if (!class_exists($className)) { throw new Exception(sprintf('Service class %s does not exist.', $className)); } $reflClass = new \ReflectionClass($className); foreach (array('OAuth2', 'OAuth1') as $version) { if ($reflClass->implementsInterface('OAuth\' . $version . '\Service\ServiceInterface')) { $this->serviceClassMap[$version][ucfirst($serviceName)] = $className; return $this; } } throw new Exception(sprintf('Service class %s must implement ServiceInterface.', $className)); }
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。<?php include 'src/MongoQB/Builder.php'; class QBtest extends PHPUnit_Framework_TestCase { function defaultConnect($connect = true) { return new \MongoQB\Builder(array( 'dsn'=>'mongodb://localhost:27017/mongoqbtest', 'query_safety'=>null ), $connect); }
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 <?php namespace League; use League\Monga\Connection; use MongoBinData; use MongoCode; use MongoConnectionException; use MongoDate; use MongoId; use MongoRegex; class Monga { public static function data($data, $type = null) { $type === null && $type = MongoBinData::BYTE_ARRAY; return new MongoBinData($data, $type); } public static function id($id) { return new MongoId($id); } public static function code($code, array $scope = []) { return new MongoCode($code, $scope); } public static function date($sec = null, $usec = 0) { $sec === null && $sec = time(); return new MongoDate($sec, $usec); } public static function regex($regex) { return new MongoRegex($regex); } public static function connection($server = null, array $options = [], array $driverOptions = []) { return new Connection($server, $options, $driverOptions); } }
Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消费。<?php namespace Kafka; class Broker { use SingletonTrait; private $groupBrokerId = null; private $topics = []; private $brokers = []; private $metaSockets = []; private $dataSockets = []; private $process; private $socket; private $config; public function setProcess(callable $process) { $this->process = $process; }
有很多情况会涉及到php和java进行数据交换。一般情况是通过json数据格式去交换。但是对于那种比如:商城采用php进行开发,管理系统使用java语言开发,这其中就会涉及到数据交互,而正好php进行过数据序列化存储到数据库,而java还必须去解析,所以就会有这份HTML5解析和序列化的PHP库。帮助大家轻松实现这个效果<?php require "vendor/autoload.php"; use Masterminds\HTML5; $html = <<< 'HERE' <html> <head> <title>TEST</title> <script language="javascript"> if (2 > 1) { alert("Math wins."); } </script> </head> <body id='foo'> <!-- This space intentionally left blank. --> <section class="section-a pretty" id="bar1"> <h1>Hello World</h1><p>This is a test of the HTML5 parser.</p> <hr> & Nobody nowhere. </section> <test xmlns:foo="http://example.com/foo">TEST</test> <![CDATA[Because we can.]]> © </body></html> HERE; $html5 = new HTML5(); $dom = $html5->loadHTML($html); print "Converting to HTML 5\n"; $html5->save($dom, fopen("php://stdin", 'w'));