‘壹’ php+Laravel框架RabbitMQ简单使用(PTP)
一、简介Point-to-Point,点对点通信模型。PTP是基于队列(Queue)的,一个队列可以有多个生产者,和多个消费者。消息服务器按照收到消息的先后顺序,将消息放到队列中。队列中的每一条消息,只能由一个消费者进行消费,消费之后就会从队列中移除。
特点:
每个消息只用一个消费者;
发送者和接受者没有时间依赖;
接受者确认消息接受和处理成功。
P 表示为生产者 、C 表示为消费者,红色表示队列。
在RabbitMQ中有生产者,消费者的概念,本篇主要是消息如何生产以及消费者这部分的实现。使用的laravel框架,php-amqplib拓展。
二、Laravel中添加依赖在项目根目录下执行一下命令
composer require php-amqplib/php-amqplib
lishuo@李硕的MacBook?Pro:~/Code/php/www.zfw.com?(branch:?master!)$?composer?require?php-amqplib/php-amqplibUsing?version?^3.1?for?php-amqplib/php-amqplib./composer.json?has?been?updatedRunning?composer?update?php-amqplib/php-amqplibLoading?composer?repositories?with?package?informationUpdating?dependenciesNothing?to?modify?in?lock?fileInstalling?dependencies?from?lock?file?(including?require-dev)Nothing?to?install,?update?or?removePackage?caouecs/laravel-lang?is?abandoned,?you?should?avoid?using?it.?Use?https://github.com/Laravel-Lang/lang?instead.Package?swiftmailer/swiftmailer?is?abandoned,?you?should?avoid?using?it.?Use?symfony/mailer?instead.Generating?optimized?autoload?files>?::postAutoloadDump>?@php?artisan?package:discover?--ansiDiscovered?Package:?barryvdh/laravel-ide-helperDiscovered?Package:?facade/ignitionDiscovered?Package:?fruitcake/laravel-corsDiscovered?Package:?jenssegers/mongodbDiscovered?Package:?laravel/passportDiscovered?Package:?laravel/sailDiscovered?Package:?laravel/sanctumDiscovered?Package:?laravel/tinkerDiscovered?Package:?maatwebsite/excelDiscovered?Package:?nesbot/carbonDiscovered?Package:?nunomaro/collisionPackage?manifest?generated?successfully.100?packages?you?are?using?are?looking?for?funding.Use?the?`composer?fund`?command?to?find?out?more!>?@php?artisan?vendor:publish?--tag=laravel-assets?--ansiNo?publishable?resources?for?tag?[laravel-assets].Publishing?complete.三、使用Laravel的command来实现消息的生产和消费1.创建生产者执行以下命令快速创建生产者
php artisan make:command RabbitmqProcerCommand
lishuo@李硕的MacBook?Pro:~/Code/php/www.zfw.com?(branch:?master!)$?php?artisan?make:command?RabbitmqProcerCommandConsole?command?created?successfully.基本代码(接下来就在command里面写生产消息的逻辑)<?phpnamespace?AppConsoleCommands;use?IlluminateConsoleCommand;//引入amqp扩展use?;use?PhpAmqpLibMessageAMQPMessage;class?RabbitmqProcerCommand?extends?Command{????/**?????*?The?name?and?signature?of?the?console?command.?????*?????*?@var?string?????*/????protected?$signature?=?'rabbitmq_procer'//给生产者起个command名称????/**?????*?The?console?command?description.?????*?????*?@var?string?????*/????protected?$description?=?'Command?description'????/**?????*?Create?a?new?command?instance.?????*?????*?@return?void?????*/????public?function?__construct()????{????????parent::__construct();????}????/**?????*?Execute?the?console?command.?????*??生产者消息代码?????*?@return?int?????*/????public?function?handle()????{????????//创建服务器连接????????$connection?=?new?AMQPStreamConnection('localhost',?5672,?'guest',?'guest');????????//连接信道????????//信道是生产消费者与rabbit通信的渠道,生产者publish或者消费者消费一个队列都是需要通过信道来通信的????????//信道是建立在TCP上面的虚拟链接,也就是rabbitMQ在一个TCP上面建立成百上千的信道来达到多个线程处理。????????//注意是一个TCP?被多个线程共享,每个线程对应一个信道,信道在rabbit都有唯一的ID,保证了信道的私有性,对应上唯一的线程使用。????????$channel?=?$connection->channel();????????//channel->queue_declare通过信道创建一个是否是持久化的消息队列????????//queue第一个参数代表消息队列名称????????$channel->queue_declare('test',?false,?false,?false,?false);????????//往队列里要发送内容,待发送的内容????????$msg?=?new?AMQPMessage('我是一个生产者消息');????????//通过信道来进行发送消息????????//而exchange是怎么知道消息应该推到哪个queue呢,这就要通过绑定queue与exchange时的routingkey了,通过代码进行绑定并且指定routingkey,下面有一张关系图,p(发布者)?—>?x(exchange)?bindding(绑定关系也就是我们的routingkey)?红色代表着queue????????$channel->basic_publish($msg,?'',?'test');????????echo?"?[x]?Sent?'我是一个生产者消息!' ";????????//关闭信道????????$channel->close();????????//关闭连接????????$connection->close();????}}2.创建消费者因为消费者是需要常驻内存的,所以需要在cli下运行,我们可以通过以下操作创建一个任务。
?php?artisan?make:command?RabbitmqConsumerCommand基本代码(接下来就在command里面写消费消息的逻辑)<?phpnamespace?AppConsoleCommands;use?IlluminateConsoleCommand;use?;class?RabbitmqConsumerCommand?extends?Command{????/**?????*?The?name?and?signature?of?the?console?command.?????*?????*?@var?string?????*/????protected?$signature?=?'rabbitmq_consumer'//给消费者起个command名称????/**?????*?The?console?command?description.?????*?????*?@var?string?????*/????protected?$description?=?'Command?description'????/**?????*?Create?a?new?command?instance.?????*?????*?@return?void?????*/????public?function?__construct()????{????????parent::__construct();????}????/**?????*?Execute?the?console?command.?????*?????*?@return?int?????*/????public?function?handle()????{????????//创建服务器连接????????$connection?=?new?AMQPStreamConnection('localhost',?5672,?'guest',?'guest');????????//连接信道????????//信道是生产消费者与rabbit通信的渠道,生产者publish或者消费者消费一个队列都是需要通过信道来通信的????????//信道是建立在TCP上面的虚拟链接,也就是rabbitMQ在一个TCP上面建立成百上千的信道来达到多个线程处理。????????//注意是一个TCP?被多个线程共享,每个线程对应一个信道,信道在rabbit都有唯一的ID,保证了信道的私有性,对应上唯一的线程使用。????????$channel?=?$connection->channel();????????//channel->queue_declare通过信道创建一个是否是持久化的消息队列????????//queue第一个参数代表消息队列名称????????$channel->queue_declare('test',?false,?false,?false,?false);????????echo?"?[*]?Waiting?for?messages.?To?exit?press?CTRL+C ";????????//进行监听消费者是否有消息,如果有进行输出消息内容????????$callback?=?function?($msg)?{????????????echo?'?[x]?Received?',?$msg->body,?" ";????????};????????//通过信道进行消费消息????????$channel->basic_consume('test',?'',?false,?true,?false,?false,?$callback);????????//如果信道是打开状态????????while?($channel->is_open())?{????????????//然后让信道一直处于监听等待状态????????????$channel->wait();????????}????????//关闭信道????????$channel->close();????????//关闭连接????????$connection->close();????}}三、使用command进行测试生产消息和消费消息是否成功执行生产消息 php artisan rabbitmq_procer 执行消费消息 hp artisan rabbitmq_consumer
‘贰’ mongodb的save和insert函数的区别
mongodb的save和insert函数都可以向collection里插入数据,但两者是有两个区别:
一、使用save函数里,如果原来的对象不存在,那他们都可以向collection里插入数据,如果已经存在,save会调用update更新里面的记录,而insert则会忽略操作
二、insert可以一次性插入一个列表,而不用遍历,效率高, save则需要遍历列表,一个个插入。对于远程调用来说,是一性次将整个列表post过来让mongodb去自己处理,效率会高些。
mongodb相关教程;PHP程序员,雷雪松的个人博客。
‘叁’ 哪位高手可以推荐几款通用的数据库管理工具
1、MySQL Workbench
MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具。它是着名的数据库设计工具DBDesigner4的继任者。你可以用MySQL Workbench设计和创建新的数据库图示,建立数据库文档,以及进行复杂的MySQL 迁移
MySQL Workbench是下一代的可视化数据库设计、管理的工具,它同时有开源和商业化的两个版本。该软件支持Windows和Linux系统,下面是一些该软件运行的界面截图:
2、数据库管理工具 Navicat Lite
NavicatTM是一套快速、可靠并价格相宜的资料库管理工具,大可使用来简化资料库的管理及降低系统管理成本。它的设计符合资料库管理员、开发人员及中小企业的需求。 Navicat是以直觉化的使用者图形接口所而建的,让你可以以安全且简单的方式建立、组织、存取并共用资讯。
界面如下图所示:
Navicat 提供商业版Navicat Premium 和免费的版本 Navicat Lite 。免费版本的功能已经足够强大了。
Navicat 支持的数据库包括MySQL、Oracle、SQLite、PostgreSQL和SQL Server 等。
3、开源ETL工具Kettle
Kettle是一款国外开源的etl工具,纯java编写,绿色无需安装,数据抽取高效稳定(数据迁移工具)。Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。
·授权协议:LGPL
·开发语言: Java
·操作系统: 跨平台
4、Eclipse SQLExplorer
SQLExplorer是Eclipse集成开发环境的一种插件,它可以被用来从Eclipse连接到一个数据库。
SQLExplorer插件提供了一个使用SQL语句访问数据库的图形用户接口(GUI)。通过使用SQLExplorer,你能够显示表格、表格结构和表格中的数据,以及提取、添加、更新或删除表格数据。
SQLExplorer同样能够生成SQL脚本来创建和查询表格。所以,与命令行客户端相比,使用SQLExplorer可能是更优越的选择,下图是运行中的界面,很好很强大。
l授权协议: 未知
l开发语言: Java
l操作系统: 跨平台
5、MySQL管理工具phpMyAdmin
phpMyAdmin是一个非常受欢迎的基于web的MySQL数据库管理工具。它能够创建和删除数据库,创建/删除/修改表格,删除/编辑/新增字段,执行SQL脚本等。
l授权协议:GPL
l开发语言:PHP
l操作系统:跨平台
6、Mongodb 管理工具Mongodb Studio
Mongodb是一款性能优良,功能丰富的文档型非关系型数据库。由于该数据库是开源项目并且还在不断更新中,目前为止在任何平台上都不能找到功能相对完整的客户端数据库管理工具。而越来越多的项目中使用了Mongodb,使得管理起来十分麻烦.如果点点鼠标就搞定了.那该有多好。
基于如上背景,我们制作了此MongoDB管理工具,在DBA/开发/管理员三个维度提供一定层次的管理功能。
Mongodb Management Studio功能如下:
l服务器管理功能
添加服务器,删除服务器
l服务器,数据库,表,列,索引,树形显示和状态信息查看
l查询分析器功能.
支持select,insert,Delete,update
支持自定义分页函 数 $rowid(1,5)查询第一条到第五条,需放在select后面.
l索引管理功能
支持列名的显示,索引的创建,查看,删除.
l数据库Profile管理.
可以设置Profile开关,查看Profile信息.自定义分页大小.
lmaster/slave信息显示
7、MySQL监控小工具mycheckpoint
mycheckpoint是一个开源的 MySQL监控工具,主要用来监控数据。通过视图方式提供监控数据报表。mycheckpoint支持以独立的Web服务器来运行。
例如:SELECTinnodb_read_hit_percent, DML FROM sv_report_chart_sample;
查看详细报表示例。
安装手册:http://code.openark.org/forge/mycheckpoint/documentation/installation
8、SQL SERVER 数据库发布向导
Microsoft SQL Server DatabasePublishing Wizard (微软SQLServer数据库发布向导) 是微软发布的一个开源工具,使用该工具可以帮你将SQLSERVER 数据库导出成一个 SQL脚本,类似 MySQL 的 mysqlmp工具。
官方说明:SQLServer数据库发布向导提供了一种将数据库发布到 T-SQL 脚本或者直接发布到支持宿主服务提供程序的方法。
9、Eclipse 的Oracle插件jOra
jOra是一个为 Oracle开发者和管理员提供的 Eclipse 插件,可轻松的对Oracle进行开发和管理。
安装地址:http://jora.luenasoft.de/updatesite
插件截图
l授权协议:免费,非开源
l开发语言:Java
l操作系统:跨平台
10、免费PostgreSQL监控工具pgwatch
pgwatch 是一个简单易用的PostgreSQL的监控工具,支持PostgreSQL 9.0 以及更新的版本。
主要特性:
- 配置简单
- 大量的监控图表
- 快速系统检查面板
- 自动收集统计信息
- 交互式的 Flash 图表
- 集成 SQL worksheet
l授权协议: Artistic
l开发语言:PHP
l操作系统: Linux
11、MySQL Browser
MySQL的客户端工具MySQL Browser的优点是简单,及其的简单,安装之后能够立刻上手,马上就能使用的那种,布局也很简陋,功能也很简陋,简单使用没有问题,尤其是刚开始学习mysql的同学,可以尝试一下。
·授权协议:未知
·操作系统: Windows
12、MySQL客户端软件HeidiSQL
HeidiSQL是一个功能非常强大的 MySQL 客户端软件,采用Delphi 开发,支持 Windows 操作系统。
l授权协议:GPL
l开发语言:Delphi/Pascal
l操作系统: Windows
13、SQLite管理工具SQLiteStudio
SQLiteStudio 是一个跨平台的 SQLite数据库的管理工具,采用 Tcl语言开发。
l授权协议:未知
l操作系统:跨平台
14、SQL客户端工具SQLyog
SQLyog 是一个易于使用的、快速而简洁的图形化管理MYSQL数据库的工具,它能够在任何地点有效地管理你的数据库。
功能:
l快速备份和恢复数据;
l以GRID/ TEXT格式显示结果;
l支持客户端挑选、过滤数据;
l批量执行很大的SQL脚本文件;
l快速执行多重查询并能够返回每页超过1000条的记录集,而这种操作是直接生成在内存中的;
l程序本身非常短小精悍!压缩后只有348 KB ;
l完全使用MySQLC APIs程序接口;
l以直观的表格界面建立或编辑数据表;
l以直观的表格界面编辑数据;
l进行索引管理;
l创建或删除数据库;
l操纵数据库的各种权限:库、表、字段;
l编辑BLOB类型的字段,支持Bitmap/GIF/JPEG格式;
l输出数据表结构/数据为SQL脚本;
l支持输入/输出数据为CSV文件;
l可以输出数据库清单为HTML文件;
l为所有操作建立日志;
l个人收藏管理操作语句;
l支持语法加亮显示;
l可以保存记录集为CSV、HTML、XML格式的文件;
l21、99% 的操作都可以通过快捷键完成;
l支持对数据表的各种高级属性修改;
l查看数据服务器的各种状态、参数等;
l支持更改数据表类型为ISAM, MYISAM, MERGE, HEAP, InnoDB, BDB;
l刷新数据服务器、日志、权限、表格等;
l诊断数据表:检查、压缩、修补、分析。
l授权协议:GPLv2
l开发语言:C/C++
l操作系统: Windows
15、数据挖掘工具RapidMiner
RapidMiner是世界领先的数据挖掘解决方案,在一个非常大的程度上有着先进技术。它数据挖掘任务涉及范围广泛,包括各种数据艺术,能简化数据挖掘过程的设计和评价。
功能和特点
l免费提供数据挖掘技术和库;
l100%用Java代码(可运行在操作系统);
l数据挖掘过程简单,强大和直观;
l内部XML保证了标准化的格式来表示交换数据挖掘过程;
l可以用简单脚本语言自动进行大规模进程;
l多层次的数据视图,确保有效和透明的数据;
l图形用户界面的互动原型;
l命令行(批处理模式)自动大规模应用;
lJava API(应用编程接口);
l简单的插件和推广机制;
l强大的可视化引擎,许多尖端的高维数据的可视化建模;
l400多个数据挖掘运营商支持;
l耶鲁大学已成功地应用在许多不同的应用领域,包括文本挖掘,多媒体挖掘,功能设计,数据流挖掘,集成开发的方法和分布式数据挖掘。
l授权协议:未知
l开发语言:Java
l操作系统:跨平台
16、Oracle 数据库开发工具Oracle SQL Developer
Oracle SQL Developer 是一个免费非开源的用以开发数据库应用程序的图形化工具,使用SQLDeveloper 可以浏览数据库对象、运行 SQL 语句和脚本、编辑和调试 PL/SQL语句。另外还可以创建执行和保存报表。该工具可以连接任何 Oracle 9.2.0.1 或者以上版本的 Oracle 数据库,支持Windows、Linux 和 Mac OS X 系统。
·授权协议:免费,非开源
·开发语言:Java
·操作系统:Windows Linux MacOS
17、EMS SQL Manager for MySQL
EMS SQL Manager for MySQL是一款高性能MySQL数据库服务器系统的管理和开发工具。它支持从MySQL 3.23到6.0的任一版本,并支持最新版本的MySQL的特点,包括:查看、存储规程和函数、InnoDB外部键字和其他特点。它提供了大量工具以满足富有经验的用户的所有要求。添加了精心设计的操作向导系统,以及SQL Manager for MySQL那富有艺术感的图形用户界面,即使新手也可以不会为如何使用而感到困扰。
l授权协议:商业软件
l开发语言:C/C++
l操作系统: Windows
18、数据库管理工具CoolSQL
CoolSQL是一个数据库客户端管理工具。
·支持大部分数据库包括:DB2、oracle、mysql、MS SQL Server、Derby、HSQL、Informix、Sybase、PostgresSQL等。
·为用户提供友好和漂亮UI,其整体框架由视图组成类似于Eclipse。支持直接修改SQL查询结果。
·支持将表格数据导出成文本文件,EXCEL和HTML。
·拥有一个支持SQL语法着色显示,智能提示,文本编辑和查找的SQL编辑器。
·能够展示数据库大部分元数据包括:版本,数据类型、函数,连接信息等。
·支持导出数据对象信息包括对象数据(INSERT SQL语句),生成创建/删除脚本(create script/drop script)。
·所有SQL脚本都可以以批量的模式执行。
·能够搜索所有数据包括数据库列,表/视图和其他表格型。
·支持i18n,当前提供两种语言(中文和英文)。
·提供收藏功能,管理由用户收集的文本信息。
·支持通过插件扩展其功能。
ll 授权协议:未知
l开发语言:Java
l操作系统:跨平台
19、SQLite Manager
这是一款方便firefox对任何SQLite数据库操作的扩展。使用这款扩展,可以在firefox下很容易的创建表格、建立索引、浏览搜索等操作。此外它还具有一个语法检查功能的下拉式菜单,从而保证用户的操作不会出错。
20、MySQL GUI Tools
这是MySQL官方专业的数据库管理工具,同时支持多种操作系统。该工具包括下面三个产品:
·MySQL Administrator 1.2
·MySQL Query Browser 1.2
·MySQL MigrationToolkit 1.1
21、SQL客户端管理工具SQuirreL SQL Client
SQuirreL SQL Client是一个SQL客户端管理工具。它允许你查看一个兼容JDBC的数据库的结构,浏览表格中的数据,运行SQL命令, 可连接的数据库有ORCAL,MS SQLSERVER, DB2 等, 它还允许用户安装和创建用于补充应用程序基本功能的插件。
功能和特点:
l柱状图显示对像;
l自动完成;
l语句提示;
l标记;
l自动纠正;
l编辑查询结果;
l关系图;
l分页打印。
l授权协议:未知
l语言:Java
l操作系统:跨平台
22、Tomcat管理工具EasyTomcat
EasyTomcat是一个用来帮助简化 Tomcat和 MySQL管理的系统,你可以启动、停止和配置Tomcat和MySQL服务器,同时也提供了监控的功能。
l授权协议:未知
l开发语言:Java
l操作系统:跨平台
23、SQL Server管理工具sqlBuddy
SqlBuddy是C#编写的一款用于Microsoft SQLServer和MSDE的开源工具,使用它可以很容易的编写SQL脚本。SqlBuddy提供的功能和查询分析器的目的有些微不同,它倾向于帮助使用者编写SQL。
l授权协议:未知
l开发语言:C#
l操作系统: Windows
24、数据库开发工具GSQL
GSQL 是 Gnome 下的一个集成数据库开发工具。数据库结构显示在下图左边的树状结构中,支持SQL的语法着色。
l授权协议:未知
l操作系统:Linux
25、SQLite数据库管理SQLiteSpy
sqlitespy是一个快速和紧凑的数据库SQLite的GUI管理软件 。它的图形用户界面使得它很容易探讨,分析和操纵sqlite3数据库。
l授权协议:未知
l开发语言:Delphi/Pascal
l操作系统:Windows
26、数据库开发工具Aqua Data Studio
Aqua DataStudio 是一个为数据库开发人员准备的集成开发环境,可以对数据库做查询、管理,提供大量的数据库工具,例如数据库比较、源码控制等,目前支持的数据库包括:Oracle, DB2iSeries, DB2 LUW, MS SQL Server, Sybase ASE, Sybase Anywhere, Sybase IQ, Informix,PostgreSQL, MySQL, Apache Derby, JDBC, and ODBC.
l授权协议:未知
l开发语言:C/C++
l操作系统:跨平台
27、MySQL 架构管理工具MySQL MMM
MySQL Master-Master 架构常被用在 SQLquery 相依性低的情况,像是 counter常使用的INSERT INTO ... ON DUPLICATEKEY UPDATE a = a + 1不会因为out-of-order而造成问题。而 MySQL MMM算是其中一套写得比较好的 MySQLMaster-Master架构管理工具。
l授权协议:未知
l开发语言:Python
l操作系统: Linux
28、MySQL Client
MySQL的客户端工具,主界面如下:
l授权协议:未知
l操作系统:Windows
‘肆’ ThinkPHP 3.2 版本升级了哪些内容
3.2.3更新日志
[新增] 增加index连贯操作方法,用于数据集的强制索引操作
[新增] Model类增加using连贯操作用于多表操作
[新增] 增加strict连贯操作,用于设置数据写入和查询是否严格检查是否存在字段 默认情况下 不合法数据字段自动删除,如果设置了严格检查则会抛出异常。 例如: $model->strict(true)->add($data);
[新增] 增加fetchSql连贯操作
[新增] 添加yaml_parse_file()函数,解析yaml文件返回一个数组
[新增] 增加memcache Session驱动
[新增] 增加聚合模型,方便一对一的关联数据表操作
[新增] 新增TMPL_PATH常量支持 可以全局改版模板目录到模块目录之外
[新增] 增加Lite模式Db类,仅支持原生SQL操作
[新增] 数据库调试增加单独的配置参数 DB_DEBUG(如未设置依然取调试模式常量 APP_DEBUG)
[新增] 新增框架核心葡萄牙语言包
[新增] 增加COOKIE_SECURE和COOKIE_HTTPONLY配置参数
[新增] MySQL驱动增加ON DUPLICATE KEY UPDATE功能
[改进] Db类和数据库驱动类完全基于PDO重写
[改进] 添加全局过滤机制(默认关闭)
[改进] I函数增加修饰符功能和正则检测支持
[改进] 采用主从分布式数据库时,从数据库连接失败自动连接主服务器
[改进] 增加Model类对复合主键的支持
[改进] 改进Mongo模型和驱动类,使用更加方便
[改进] 改进session函数删除操作支持数组
[改进] 改进session函数对多维赋值的支持
[改进] 改进数据库字段缓存的文件标识 加上数据表前缀,避免不同前缀的表产生混淆
[改进] 针对数据库视图无主键的问题,使用默认id作为主键,与未开启DB_FIELDS_CACHE时行为一致
[改进] SAE模式惯例配置增加上传驱动设置
[改进] 改进参数绑定机制
[改进] 确保使用参数绑定后日志中生成sql语句的准确性
[改进] 模型类的setInc和setDec方法支持延迟写入,同时取消高级模型的相关方法
[改进] 日志写入的时候自动创建目录
[改进] 改进SQL缓存
[改进] 优化缓存队列功能
[改进] 路由的请求类型定义不区分大小写
[改进] 数据库驱动增加通用insertAll方法支持
[改进] 完善 url的验证正则
[改进] 单字母函数返回值类型修正以及一些拼写错误修正
[改进] 自动创建模型模块的父目录 直接调用\Think\Build::buildController和buildModel的情况下创建目录
[改进] 日志驱动增加自动目录创建支持
[改进] 自动生成的目录结构增加模块的缓存目录
[改进] mysql存储过程支持完善
[改进] Db类改进对多表更新和删除的支持,多表删除支持USING和JOIN操作
[改进] 改进parseLock的位置
[改进] Db类的update和delete方法增加多表操作的支持
[改进] 改进CURD操作 可以直接返回sql语句而不真正执行。
[改进] 插件控制器的命名空间可定义 不再局限于模块下面 增加 ADDON_PATH 用于定义插件目录 默认位于 应用目录下面的Addon
[改进] 改进静态缓存读取的有效判断对sae的支持
[改进] 日志目录分模块
[改进] 模型类的getField方法改进 支持在字段名中使用函数
[改进] 改进Db类的parseWhere方法
[改进] 改进模型的page和limit方法 改进分页类
[改进] 改进配置文件自动生成
[改进] 完善ShowPageTraceBehavior一处函数调用大小写规范
[改进] U函数支持多级控制器
[改进] send_http_status函数增加状态
[改进] 允许在项目中定义 APP 常量
[改进] 改进定义TMPL_PATH后的模板路径定义
[改进] Image类的imagick驱动save方法增加quality参数 用于图片质量设置,默认值为80
[改进] 改进Image类的JPEG图片生成质量
[改进] Gd库驱动类改进
[改进] 改进T函数对TMPL_PATH常量定义的支持
[改进] 改进I函数对path.0的支持
[改进] 改进关联模型
[改进] 改进dispatch_jump模板
[改进] 更新api模式支持配置文件的后缀定义
[改进] 改进Model类的getModelName方法对多层模型的支持
[改进] 改进cookie函数对secure和httponly的支持
[改进] 改进模板标签对命名空间的支持,写法 {$var|Org\Util\String::rand}
[改进] 改进数据表自动识别规则正则规则 可以正确识别带有数字的数据表
[改进] Model类的cache方法使用改进 cache(10) 等同于 cache(true, 10)
[修正] 修正ShowRuntime行为扩展
[修正] 修正Model类的add和addall方法中的_facade和_parseOptions的调用顺序问题
[修正] 修正使用数组方式动态指定表名后的BUG
[修正] 修正ChromShowPage行为扩展
[修正] 修正自定义公共模块路径时,加载公共模块类库失败
[修正] 修正参数绑定的一处判断
[修正] 解决PDO参数绑定后的获取最终SQL语句问题
[修正] 修正开启布局后show方法的问题
[修正] 解决调用trace()无法返回trace日志问题
[修正] 修复mongo出现错误输出的问题
[修正] 修正页面Trace的日志保存
[修正] 修正Model类的save方法
[修正] 修正令牌验证没有设置TOKEN_NAME的问题
[修正] 修复RestController中请求资源类型总是为html的bug
[修正] 修正Model类的getField方法的一处变量冲突问题
[修正] 修正Mongo驱动的page处理
[修正] 修正 extract方法 在分解变量的时候 可能导致变量被覆盖的问题
[修正] 修正Imagick类库
[修正] 修正页面trace插件开启PAGE_TRACE_SAVE后出错的问题
[修正] 修正controller方法 对不使用命名空间的支持
[修正] 修正Image类的save方法支持图片质量
[修正] 修正高级模型的乐观锁功能
[修正] 修正I函数通过FILTER_VALIDATE_EMAIL方式传入常量过滤的一处错误 并且过滤参数支持数组
[修正] 修正GIF类的架构函数
[修正] Cache类一处常量错误修正
[修正] 修改自动生成的配置文件支持CONF_EXT定义
[删除] 去掉多余的URL_404_REDIRECT配置参数
3.2.2 更新日志
[增加]配置文件增加yaml/json/xml/ini/自定义格式支持
[增加]增加load_config函数用于加载配置文件
[增加]增加CONF_EXT和CONF_PARSE常量,用于定义配置文件后缀及解析方法
[增加]模块增加状态配置文件
[增加]cookie函数增加httponly参数支持
[增加]增加COOKIE_HTTPONLY配置参数
[增加]增加插件的控制器访问支持
[增加]增加CONTROLLER_PATH常量用于定义控制器的命名空间路径
[增加]添加VAR_ADDON配置参数 用于设置默认的插件控制器命名空间变量
[增加]dispatcher类增加getSpace方法用于获取控制器的命名空间路径
[增加]I函数增加path和data类型变量的用法
[增加]引入composer支持(还需要完善)
[增加]xcahe和wincache驱动增加clear方法
[增加]自动生成机制支持多个模块的控制器和模型类的批量生成
[修正]修正上传类不能动态改变rootPath的BUG
[修正]修正RestController类的执行顺序
[修正]修正Model类的参数绑定的一处BUG
[修正]修正CronRun行为扩展一处错误
[修正]修正GIF类
[修正]修正rest控制器的encodeData方法
[修正]修正ViewModel可能因空格导致Order方法错误的bug
[修正]修正MongoModel类的写入数据的自增获取
[修正]修正第三方模板引擎驱动类
[修正]修正自动加载可能的一处导致重复加载的问题
[修正]修正__CONTROLLER__ 在URL不区分大小写情况下的获取
[修正]修正Route类中请求类型判断错误的bug
[修正]修正mysqli驱动的free方法
[改进]改进CronRun行为扩展
[改进]TOKEN_NAME 未设置时使用默认值__hash__
[改进]模类的_after_insert回调返回false后直接返回
[改进]Model类的save方法 如果data为空则不执行
[改进]Model类的delete方法 如果条件为空 则不执行删除操作
[改进]改进获取模块方法,支持驼峰法模块命名
[改进]改进模型的查询方法对表前缀的支持,使用当前模型设置的表前缀
[改进]视图模型的视图定义中的_table属性和关联模型中的relation_table 支持 __TABLE_NAME__定义方式
[改进]Model类的query和execute方法支持 __TABLE_NAME__定义方式
[改进]改进PDO驱动对pgsql字符转义的支持
[改进]改进Cookie函数对名称中包含“.”的支持
[改进]改进Sae上传驱动 增加file['url']信息存储
[改进]Page类添加默认的listRows值
[改进]改进IS_CGI常量的判断,支持fcgi
[改进]改进Db类的multiConnect方法 避免切换数据库的时候 配置数据被缓存
[改进]改进Db类对传入的参数 如果未设置数据编码,设置默认的编码为utf8
[改进]改进B方法支持对行为和扩展类的调用,需要传入完整的类名
[改进]改进验证码类 添加验证成功后是否重置session的参数 reset 默认为true
[改进]改进session和cookie函数,支持获取全部
[改进]调试模式下,错误的查询条件和非法数据写入会抛异常
[改进]改进Model类的getField方法
[调整]设置VIEW_PATH后参数后无需再定义模块子目录
[调整]为了避免和函数规则冲突,规则路由排除分隔符改为“-”
3.2.1 更新日志
[增加] 增加Rpc控制器支持
[增加] 添加原来的部分扩展类库
[增加] 增加RestController
[增加] 添加Boris行为扩展
[增加] 增加Boris第三方类库
[增加] 增加BIND_MODULE BIND_CONTROLLER BIND_ACTION 常量定义 用于在入口文件中绑定
[增加] 增加 mole_check 标签位
[增加] 增加buildLite行为 用于根据当前环境生成运行时lite文件 可以替换框架入口文件运行,提高效率
[增加] Think类增加getMap方法
[增加] C函数增加默认值功能 可以是获取配置参数的时候,当没有定义的时候获取传入的默认值
[增加] 增加Yar扩展支持
[增加] 添加jsonRPC扩展
[增加] 增加Api应用模式扩展和Mode扩展目录
[增加] 添加第三方模板引擎
[增加] 支持操作方法绑定到类
[增加] 增加Think\Auth类
[增加] 增加Hprose控制器和第三方类库包
[增加] 增加CONF_PATH常量定义
[增加] 应用和模块增加自动读取当前应用模式配置文件的功能
[修正] 修正正则路由的一个函数处理的bug
[修正] 修正模板引擎类的一处bug
[修正] 修正L函数的一处错误
[修正] 修正驱动类一处错误
[修正] 修正MongoModel一处错误
[修正] 修正Verify类对多个验证码同一个页面显示的bug
[修正] 修正找不到Log类的错误
[修正] 修正模型类的一处bug
[修正] 修正session函数一处警告错误
[修正] 修正U函数的一处警告错误
[修正] 修正compile函数的一处bug
[修正] 修正验证码的背景图片功能
[修正] Think\Image类常量修正
[修正] 修正Image类的架构方法错误
[修正] 修正Mongodb数据库驱动
[修正] 修正trace方法在CLI下面中文输出乱码
[修正] 修正控制器类当调用不存在的方法的报错
[改进] 改进操作方法的名称识别
[改进] 改进数据库驱动 支持不同的链接指定不同的charset参数
[改进] 改进get_client_ip函数
[改进] 改进L函数支持传入变量
[改进] 改进PDO驱动 当版本低于PHP5.3.6的时候禁用模拟预处理语句
[改进] 调整dispatcher类的模块、控制器和操作名获取方法
[改进] 页面trace扩展CLI下面不执行
[改进] 优化trace方法
[改进] 解决因配置文件加载顺序错误导致在SAE环境中运行出错的问题
[改进] 改进Storage类
[改进] 优化load_ext_file函数
[改进] Behavior类简化(下一版本可能会废弃)
[改进] 核心行为类简化取消对Behavior的继承
[改进] C函数并入系统函数库文件
[改进] union连贯操作方法 字符串用法支持 TABLE_NAME 方式替换
[改进] 改进Jion和table连贯操作方法,当使用TABLE_NAME解析的时候支持动态指定的表前缀
[改进] 优化U函数
[改进] 路由类改进
[改进] 改进路由的闭包支持 闭包函数如果返回布尔值 则继续执行后续 否则中止执行
[改进] 应用模式定义文件移动到MODE_PATH目录下面 便于管理
[改进] 默认URL不区分大小写
[改进] 改进路由闭包定义
[改进] 改进路由的额外参数传入
[改进] 重写查询缓存功能
[改进] 关联模型修改
[改进] Image类水印生成支持透明度参数
[改进] 改进Image驱动
[改进] 验证码类改进
[改进] 改进上传类及驱动
[改进] session驱动类接口改进 无需定义execute方法
[改进] 静态缓存仅在get请求下生效
[改进] 改进静态缓存行为
[改进] 语言文件更新
[改进] Storage类的SAE驱动更新
[改进] 英文语言包修正
[改进] 改进PDO驱动
[改进] 默认生成的测试控制器规范改进
[删除] 废除APP_FILE_CASE参数配置 改为Windows下调试模式自动开启区分大小写
‘伍’ php新手学习路线是怎样的
第一阶段:基础阶段(基础PHP程序员)
重点:把LNMP搞熟练(核心是安装配置基本操作) 目标:能够完成基本的LNMP系统安装,简单配置维护;能够做基本的简单系统的PHP开发;能够在PHP中型系统中支持某个PHP功能模块的开发。
时间:完成本阶段的时间因人而异,有的成长快半年一年就过了,成长慢的两三年也有。
Linux
基本命令、操作、启动、基本服务配置(包括rpm安装文件,各种服务配置等);会写简单的shell脚本和awk/sed 脚本命令等。
Nginx
做到能够安装配置nginx+php,知道基本的nginx核心配置选项,知道 server/fastcgi_pass/access_log 等基础配置,目标是能够让nginx+php_fpm顺利工作。
MySQL
会自己搭建mysql,知道基本的mysql配置选项;知道innodb和myisam的区别,知道针对InnoDB和MyISAM两个引擎的不同配置选项;知道基本的两个引擎的差异和选择上面的区别;能够纯手工编译搭建一个MySQL数据库并且配置好编码等正常稳定运行;核心主旨是能够搭建一个可运行的MySQL数据库。
PHP
基本语法数组、字符串、数据库、XML、Socket、GD/ImageMgk图片处理等等;熟悉各种跟MySQL操作链接的api(mysql/mysqli/PDO),知道各种编码问题的解决;知道常规熟练使用的PHP框架(ThinkPHP、Zendframework、Yii、Yaf等);了解基本MVC的运行机制和为什么这么做,稍微知道不同的PHP框架之间的区别;能够快速学习一个MVC框架。能够知道开发工程中的文件目录组织,有基本的良好的代码结构和风格,能够完成小系统的开发和中型系统中某个模块的开发工作。
前端
如果条件时间允许,可以适当学习下 HTML/CSS/JS 等相关知识,知道什么web标准,div+css的web/wap页面模式,知道HTML5和HTML4的区别;了解一些基本的前端只是和JS框架(jQuery之类的);了解一些基本的JavaScript编程知识;(本项不是必须项,如果有时间,稍微了解一下是可以的,不过不建议作为重点,除非个人有强烈兴趣)。
系统设计
能够完成小型系统的基本设计,包括简单的数据库设计,能够完成基本的:浏览器 -> Nginx+PHP -> 数据库 架构的设计开发工作;能够支撑每天几十万到数百万流量网站的开发维护工作;
第二阶段:提高阶段 (中级PHP程序员)
重点:提高针对LNMP的技能,能够更全面的对LNMP有熟练的应用。 目标:能够随时随地搭建好LNMP环境,快速完成常规配置;能够追查解决大部分遇到的开发和线上环境的问题;能够独立承担中型系统的构架和开发工作;能够在大型系统中承担某个中型模块的开发工作。
1. Linux
在第一阶段的基础上面,能够流畅的使用Shell脚本来完成很多自动化的工作;awk/sed/perl 也操作的不错,能够完成很多文本处理和数据统计等工作;基本能够安装大部分非特殊的Linux程序(包括各种库、包、第三方依赖等等,比如MongoDB/Redis/Sphinx/Luncene/SVN之类的);了解基本的Linux服务,知道如何查看Linux的性能指标数据,知道基本的Linux下面的问题跟踪等。
2. Nginx
在第一阶段的基础上面,了解复杂一些的Nginx配置;包括 多核配置、events、proxy_pass,sendfile/tcp_*配置,知道超时等相关配置和性能影响;知道nginx除了web server,还能够承担代理服务器、反向静态服务器等配置;知道基本的nginx配置调优;知道如何配置权限、编译一个nginx扩展到nginx;知道基本的nginx运行原理(master/worker机制,epoll),知道为什么nginx性能比apache性能好等知识。
3. MySQL/MongoDB
在第一阶段的基础上面,在MySQL开发方面,掌握很多小技巧,包括常规SQL优化(group by/order by/rand优化等);除了能够搭建MySQL,还能够冷热备份MySQL数据,还知道影响innodb/myisam性能的配置选项(比如key_buffer/query_cache/sort_buffer/innodb_buffer_pool_size/innodb_flush_log_at_trx_commit等),也知道这些选项配置成为多少值合适;另外也了解一些特殊的配置选项,比如 知道如何搭建mysql主从同步的环境,知道各个binlog_format的区别;知道MySQL的性能追查,包括slow_log/explain等,还能够知道基本的索引建立处理等知识;原理方面了解基本的MySQL的架构(Server+存储引擎),知道基本的InnoDB/MyISAM索引存储结构和不同(聚簇索引,B树);知道基本的InnoDB事务处理机制;了解大部分MySQL异常情况的处理方案(或者知道哪儿找到处理方案)。条件允许的情况,建议了解一下NoSQL的代表MongoDB数据库,顺便对比跟MySQL的差别,同事能够在合适的应用场景安全谨慎的使用MongoDB,知道基本的PHP与MongoDB的结合开发。
4. Redis/Memcached
在大部分中型系统里面一定会涉及到缓存处理,所以一定要了解基本的缓存;知道Memcached和Redis的异同和应用场景,能够独立安装 Redis/Memcached,了解Memcahed的一些基本特性和限制,比如最大的value值,知道PHP跟他们的使用结合;Redis了解基本工作原理和使用,了解常规的数据类型,知道什么场景应用什么类型,了解Redis的事务等等。原理部分,能够大概了解Memcached的内存结构(slab机制),redis就了解常用数据类型底层实现存储结构(SDS/链表/SkipList/HashTable)等等,顺便了解一下Redis的事务、RDB、AOF等机制更好。
5. PHP
除了第一阶段的能力,安装配置方面能够随意安装PHP和各种第三方扩展的编译安装配置;了解php-fpm的大部分配置选项和含义(如max_requests/max_children/request_terminate_timeout之类的影响性能的配置),知道mod_php/fastcgi的区别;在PHP方面已经能够熟练各种基础技术,还包括各种深入些的PHP,包括对PHP面向对象的深入理解/SPL/语法层面的特殊特性比如反射之类的;在框架方面已经阅读过最少一个以上常规PHP MVC框架的代码了,知道基本PHP框架内部实现机制和设计思想;在PHP开发中已经能够熟练使用常规的设计模式来应用开发(抽象工厂/单例/观察者/命令链/策略/适配器 等模式);建议开发自己的PHP MVC框架来充分让开发自由化,让自己深入理解MVC模式,也让自己能够在业务项目开发里快速升级;熟悉PHP的各种代码优化方法,熟悉大部分PHP安全方面问题的解决处理;熟悉基本的PHP执行的机制原理(Zend引擎/扩展基本工作机制)。
6. C/C++
开始涉猎一定的C/C++语言,能够写基本的C/C++代码,对基本的C/C++语法熟悉(指针、数组操作、字符串、常规标准API)和数据结构(链表、树、哈希、队列)有一定的熟悉下;对Linux下面的C语言开发有基本的了解概念,会简单的makefile文件编写,能够使用简单的GCC/GDB的程序编译简单调试工作;对基本的网络编程有大概了解。(本项是为了向更高层次打下基础)。
7. 前端
在第一阶段的基础上面,熟悉基本的HTTP协议(协议代码200/300/400/500,基本的HTTP交互头);条件允许,可以在深入写出稍微优雅的HTML+CSS+JavaScript,或者能够大致简单使用某些前端框架(jQuery/YUI/ExtJS/RequireJS/BootStrap之类);如果条件允许,可以深入学习JavaScript编程,比如闭包机制、DOM处理;再深入些可以读读jQuery源码做深入学习。(本项不做重点学习,除非对前端有兴趣)。
8. 系统设计
能够设计大部分中型系统的网站架构、数据库、基本PHP框架选型;性能测试排查处理等;能够完成类似:浏览器 -> CDN(Squid) -> Nginx+PHP -> 缓存 -> 数据库 结构网站的基本设计开发维护;能够支撑每天数百万到千万流量基本网站的开发维护工作;
第三阶段:高级阶段 (高级PHP程序员)
重点:除了基本的LNMP程序,还能够在某个方向或领域有深入学习。(纵深维度发展) 目标:除了能够完成基本的PHP业务开发,还能够解决大部分深入复杂的技术问题,并且可以独立设计完成中大型的系统设计和开发工作;自己能够独立hold深入某个技术方向,在这块比较专业。(比如在MySQL、Nginx、PHP、Redis等等任一方向深入研究)
1. Linux
除了第二阶段的能力,在Linux下面除了常规的操作和性能监控跟踪,还能够使用很多高级复杂的命令完成工作(watch/tcpmp/starce/ldd/ar等);在shell脚本方面,已经能够编写比较复杂的shell脚本(超过500行)来协助完成很多包括备份、自动化处理、监控等工作的shell;对awk/sed/perl 等应用已经如火纯青,能够随意操作控制处理文本统计分析各种复杂格式的数据;对Linux内部机制有一些了解,对内核模块加载,启动错误处理等等有个基本的处理;同时对一些其他相关的东西也了解,比如NFS、磁盘管理等等;
2. Nginx
在第二阶段的基础上面,已经能够把Nginx操作的很熟练,能够对Nginx进行更深入的运维工作,比如监控、性能优化,复杂问题处理等等;看个人兴趣,更多方面可以考虑侧重在关于Nginx工作原理部分的深入学习,主要表现在阅读源码开始,比如具体的master/worker工作机制,Nginx内部的事件处理,内存管理等等;同时可以学习Nginx扩展的开发,可以定制一些自己私有的扩展;同时可以对Nginx+Lua有一定程度的了解,看看是否可以结合应用出更好模式;这个阶段的要求是对Nginx原理的深入理解,可以考虑成为Nginx方向的深入专业者。
3. MySQL/MongoDB
在第二阶段的基础上面,在MySQL应用方面,除了之前的基本SQL优化,还能够在完成一些复杂操作,比如大批量数据的导入导出,线上大批量数据的更改表结构或者增删索引字段等等高危操作;除了安装配置,已经能够处理更多复杂的MySQL的问题,比如各种问题的追查,主从同步延迟问题的解决、跨机房同步数据方案、MySQL高可用架构等都有涉及了解;对MySQL应用层面,对MySQL的核心关键技术比较熟悉,比如事务机制(隔离级别、锁等)、对触发器、分区等技术有一定了解和应用;对MySQL性能方面,有包括磁盘优化(SAS迁移到SSD)、服务器优化(内存、服务器本身配置)、除了二阶段的其他核心性能优化选项(innodb_log_buffer_size/back_log/table_open_cache/thread_cache_size/innodb_lock_wait_timeout等)、连接池软件选择应用,对show *(show status/show profile)类的操作语句有深入了解,能够完成大部分的性能问题追查;MySQL备份技术的深入熟悉,包括灾备还原、对Binlog的深入理解,冷热备份,多IDC备份等;在MySQL原理方面,有更多了解,比如对MySQL的工作机制开始阅读部分源码,比如对主从同步(复制)技术的源码学习,或者对某个存储引擎(MyISAM/Innodb/TokuDB)等等的源码学习理解,如果条件允许,可以参考CSV引擎开发自己简单的存储引擎来保存一些数据,增强对MySQL的理解;在这个过程,如果自己有兴趣,也可以考虑往DBA方向发展。MongoDB层面,可以考虑比如说在写少读多的情况开始在线上应用MongoDB,或者是做一些线上的数据分析处理的操作,具体场景可以按照工作来,不过核心是要更好的深入理解RMDBS和NoSQL的不同场景下面的应用,如果条件或者兴趣允许,可以开始深入学习一下MongoDB的工作机制。
4. Redis/Memcached
在第二阶段的基础上面,能够更深入的应用和学习。因为Memcached不是特别复杂,建议可以把源码进行阅读,特别是内存管理部分,方便深入理解;Redis部分,可以多做一些复杂的数据结构的应用(zset来做排行榜排序操作/事务处理用来保证原子性在秒杀类场景应用之类的使用操作);多涉及aof等同步机制的学习应用,设计一个高可用的Redis应用架构和集群;建议可以深入的学习一下Redis的源码,把在第二阶段积累的知识都可以应用上,特别可以阅读一下包括核心事件管理、内存管理、内部核心数据结构等充分学习了解一下。如果兴趣允许,可以成为一个Redis方面非常专业的使用者。
5. PHP
作为基础核心技能,我们在第二阶段的基础上面,需要有更深入的学习和应用。从基本代码应用上面来说,能够解决在PHP开发中遇到95%的问题,了解大部分PHP的技巧;对大部分的PHP框架能够迅速在一天内上手使用,并且了解各个主流PHP框架的优缺点,能够迅速方便项目开发中做技术选型;在配置方面,除了常规第二阶段会的知识,会了解一些比较偏门的配置选项(php auto_prepend_file/auto_append_file),包括扩展中的一些复杂高级配置和原理(比如memcached扩展配置中的memcache.hash_strategy、apc扩展配置中的apc.mmap_file_mask/apc.slam_defense/apc.file_update_protection之类的);对php的工作机制比较了解,包括php-fpm工作机制(比如php-fpm在不同配置机器下面开启进程数量计算以及原理),对zend引擎有基本熟悉(vm/gc/stream处理),阅读过基本的PHP内核源码(或者阅读过相关文章),对PHP内部机制的大部分核心数据结构(基础类型/Array/Object)实现有了解,对于核心基础结构(zval/hashtable/gc)有深入学习了解;能够进行基本的PHP扩展开发,了解一些扩展开发的中高级知识(minit/rinit等),熟悉php跟apache/nginx不同的通信交互方式细节(mod_php/fastcgi);除了开发PHP扩展,可以考虑学习开发Zend扩展,从更底层去了解PHP。
6. C/C++
在第二阶段基础上面,能够在C/C++语言方面有更深入的学习了解,能够完成中小型C/C++系统的开发工作;除了基本第二阶段的基础C/C++语法和数据结构,也能够学习一些特殊数据结构(b-tree/rb-tree/skiplist/lsm-tree/trie-tree等)方便在特殊工作中需求;在系统编程方面,熟悉多进程、多线程编程;多进程情况下面了解大部分多进程之间的通信方式,能够灵活选择通信方式(共享内存/信号量/管道等);多线程编程能够良好的解决锁冲突问题,并且能够进行多线程程序的开发调试工作;同时对网络编程比较熟悉,了解多进程模型/多线程模型/异步网络IO模型的差别和选型,熟悉不同异步网络IO模型的原理和差异(select/poll/epoll/iocp等),并且熟悉常见的异步框架(ACE/ICE/libev/libevent/libuv/Boost.ASIO等)和使用,如果闲暇也可以看看一些国产自己开发的库(比如muo);同时能够设计好的高并发程序架构(leader-follow/master-worker等);了解大部分C/C++后端Server开发中的问题(内存管理、日志打印、高并发、前后端通信协议、服务监控),知道各个后端服务RPC通信问题(struct/http/thirft/protobuf等);能够更熟络的使用GCC和GDB来开发编译调试程序,在线上程序core掉后能够迅速追查跟踪解决问题;通用模块开发方面,可以积累或者开发一些通用的工具或库(比如异步网络框架、日志库、内存池、线程池等),不过开发后是否应用要谨慎,省的埋坑去追bug。
7. 前端
深入了解HTTP协议(包括各个细致协议特殊协议代码和背后原因,比如302静态文件缓存了,502是nginx后面php挂了之类的);除了之前的前端方面的各种框架应用整合能力,前端方面的学习如果有兴趣可以更深入,表现形式是,可以自己开发一些类似jQuery的前端框架,或者开发一个富文本编辑器之类的比较琐碎考验JavaScript功力。
8. 其他领域语言学习
在基础的PHP/C/C++语言方面有基本积累,建议在当前阶段可以尝试学习不同的编程语言,看个人兴趣爱好,脚本类语言可以学学 Python/Ruby 之类的,函数式编程语言可以试试 Lisp/Haskell/Scala/Erlang 之类的,静态语言可以试试 Java/Golang,数据统计分析可以了解了解R语言,如果想换个视角做后端业务,可以试试 Node.js还有前面提到的跟Nginx结合的Nginx_Lua等。学习不同的语言主要是提升自己的视野和解决问题手段的差异,比如会了解除了进程/线程,还有轻量级协程;比如在跨机器通信场景下面,Erlang的解决方案简单的惊人;比如在不想选择C/C++的情况下,还有类似高效的Erlang/Golang可用等等;主要是提升视野。
9. 其他专业方向学习
在本阶段里面,会除了基本的LNMP技能之外,会考虑一些其他领域知识的学习,这些都是可以的,看个人兴趣和长期的目标方向。目前情况能够选择的领域比较多,比如、云计算(分布式存储、分布式计算、虚拟机等),机器学习(数据挖掘、模式识别等,应用到统计、个性化推荐),自然语言处理(中文分词等),搜索引擎技术、图形图像、语音识别等等。除了这些高大上的,也有很多偏工程方面可以学习的地方,比如高性能系统、移动开发(Android/IOS)、计算机安全、嵌入式系统、硬件等方向。
10. 系统设计
系统设计在第二阶段的基础之上,能够应用掌握的经验技能,设计出比较复杂的中大型系统,能够解决大部分线上的各种复杂系统的问题,完成类似 浏览器 -> CDN -> 负载均衡 ->接入层 -> Nginx+PHP -> 业务缓存 -> 数据库 -> 各路复杂后端RPC交互(存储后端、逻辑后端、反作弊后端、外部服务) -> 更多后端 酱紫的复杂业务;能够支撑每天数千万到数亿流量网站的正常开发维护工作。
‘陆’ ThinkPHP 3.2 版本升级了哪些内容
ThinkPHP 更新了很多从3.1-3.2这之间的我都给你看看!!!
[新增] 增加index连贯操作方法,用于数据集的强制索引操作
[新增] Model类增加using连贯操作用于多表操作
[新增] 增加strict连贯操作,用于设置数据写入和查询是否严格检查是否存在字段 默认情况下 不合法数据字段自动删除,如果设置了严格检查则会抛出异常。 例如: $model->strict(true)->add($data);
[新增] 增加fetchSql连贯操作
[新增] 添加yaml_parse_file()函数,解析yaml文件返回一个数组
[新增] 增加memcache Session驱动
[新增] 增加聚合模型,方便一对一的关联数据表操作
[新增] 新增TMPL_PATH常量支持 可以全局改版模板目录到模块目录之外
[新增] 增加Lite模式Db类,仅支持原生SQL操作
[新增] 数据库调试增加单独的配置参数 DB_DEBUG(如未设置依然取调试模式常量 APP_DEBUG)
[新增] 新增框架核心葡萄牙语言包
[新增] 增加COOKIE_SECURE和COOKIE_HTTPONLY配置参数
[新增] MySQL驱动增加ON DUPLICATE KEY UPDATE功能
[改进] Db类和数据库驱动类完全基于PDO重写
[改进] 添加全局过滤机制(默认关闭)
[改进] I函数增加修饰符功能和正则检测支持
[改进] 采用主从分布式数据库时,从数据库连接失败自动连接主服务器
[改进] 增加Model类对复合主键的支持
[改进] 改进Mongo模型和驱动类,使用更加方便
[改进] 改进session函数删除操作支持数组
[改进] 改进session函数对多维赋值的支持
[改进] 改进数据库字段缓存的文件标识 加上数据表前缀,避免不同前缀的表产生混淆
[改进] 针对数据库视图无主键的问题,使用默认id作为主键,与未开启DB_FIELDS_CACHE时行为一致
[改进] SAE模式惯例配置增加上传驱动设置
[改进] 改进参数绑定机制
[改进] 确保使用参数绑定后日志中生成sql语句的准确性
[改进] 模型类的setInc和setDec方法支持延迟写入,同时取消高级模型的相关方法
[改进] 日志写入的时候自动创建目录
[改进] 改进SQL缓存
[改进] 优化缓存队列功能
[改进] 路由的请求类型定义不区分大小写
[改进] 数据库驱动增加通用insertAll方法支持
[改进] 完善 url的验证正则
[改进] 单字母函数返回值类型修正以及一些拼写错误修正
[改进] 自动创建模型模块的父目录 直接调用\Think\Build::buildController和buildModel的情况下创建目录
[改进] 日志驱动增加自动目录创建支持
[改进] 自动生成的目录结构增加模块的缓存目录
[改进] mysql存储过程支持完善
[改进] Db类改进对多表更新和删除的支持,多表删除支持USING和JOIN操作
[改进] 改进parseLock的位置
[改进] Db类的update和delete方法增加多表操作的支持
[改进] 改进CURD操作 可以直接返回sql语句而不真正执行。
[改进] 插件控制器的命名空间可定义 不再局限于模块下面 增加 ADDON_PATH 用于定义插件目录 默认位于 应用目录下面的Addon
[改进] 改进静态缓存读取的有效判断对sae的支持
[改进] 日志目录分模块
[改进] 模型类的getField方法改进 支持在字段名中使用函数
[改进] 改进Db类的parseWhere方法
[改进] 改进模型的page和limit方法 改进分页类
[改进] 改进配置文件自动生成
[改进] 完善ShowPageTraceBehavior一处函数调用大小写规范
[改进] U函数支持多级控制器
[改进] send_http_status函数增加状态
[改进] 允许在项目中定义 APP 常量
[改进] 改进定义TMPL_PATH后的模板路径定义
[改进] Image类的imagick驱动save方法增加quality参数 用于图片质量设置,默认值为80
[改进] 改进Image类的JPEG图片生成质量
[改进] Gd库驱动类改进
[改进] 改进T函数对TMPL_PATH常量定义的支持
[改进] 改进I函数对path.0的支持
[改进] 改进关联模型
[改进] 改进dispatch_jump模板
[改进] 更新api模式支持配置文件的后缀定义
[改进] 改进Model类的getModelName方法对多层模型的支持
[改进] 改进cookie函数对secure和httponly的支持
[改进] 改进模板标签对命名空间的支持,写法 {$var|Org\Util\String::rand}
[改进] 改进数据表自动识别规则正则规则 可以正确识别带有数字的数据表
[改进] Model类的cache方法使用改进 cache(10) 等同于 cache(true, 10)
[修正] 修正ShowRuntime行为扩展
[修正] 修正Model类的add和addall方法中的_facade和_parseOptions的调用顺序问题
[修正] 修正使用数组方式动态指定表名后的BUG
[修正] 修正ChromShowPage行为扩展
[修正] 修正自定义公共模块路径时,加载公共模块类库失败
[修正] 修正参数绑定的一处判断
[修正] 解决PDO参数绑定后的获取最终SQL语句问题
[修正] 修正开启布局后show方法的问题
[修正] 解决调用trace()无法返回trace日志问题
[修正] 修复mongo出现错误输出的问题
[修正] 修正页面Trace的日志保存
[修正] 修正Model类的save方法
[修正] 修正令牌验证没有设置TOKEN_NAME的问题
[修正] 修复RestController中请求资源类型总是为html的bug
[修正] 修正Model类的getField方法的一处变量冲突问题
[修正] 修正Mongo驱动的page处理
[修正] 修正 extract方法 在分解变量的时候 可能导致变量被覆盖的问题
[修正] 修正Imagick类库
[修正] 修正页面trace插件开启PAGE_TRACE_SAVE后出错的问题
[修正] 修正controller方法 对不使用命名空间的支持
[修正] 修正Image类的save方法支持图片质量
[修正] 修正高级模型的乐观锁功能
[修正] 修正I函数通过FILTER_VALIDATE_EMAIL方式传入常量过滤的一处错误 并且过滤参数支持数组
[修正] 修正GIF类的架构函数
[修正] Cache类一处常量错误修正
[修正] 修改自动生成的配置文件支持CONF_EXT定义
[删除] 去掉多余的URL_404_REDIRECT配置参数
3.2.2 更新日志
[增加]配置文件增加yaml/json/xml/ini/自定义格式支持
[增加]增加load_config函数用于加载配置文件
[增加]增加CONF_EXT和CONF_PARSE常量,用于定义配置文件后缀及解析方法
[增加]模块增加状态配置文件
[增加]cookie函数增加httponly参数支持
[增加]增加COOKIE_HTTPONLY配置参数
[增加]增加插件的控制器访问支持
[增加]增加CONTROLLER_PATH常量用于定义控制器的命名空间路径
[增加]添加VAR_ADDON配置参数 用于设置默认的插件控制器命名空间变量
[增加]dispatcher类增加getSpace方法用于获取控制器的命名空间路径
[增加]I函数增加path和data类型变量的用法
[增加]引入composer支持(还需要完善)
[增加]xcahe和wincache驱动增加clear方法
[增加]自动生成机制支持多个模块的控制器和模型类的批量生成
[修正]修正上传类不能动态改变rootPath的BUG
[修正]修正RestController类的执行顺序
[修正]修正Model类的参数绑定的一处BUG
[修正]修正CronRun行为扩展一处错误
[修正]修正GIF类
[修正]修正rest控制器的encodeData方法
[修正]修正ViewModel可能因空格导致Order方法错误的bug
[修正]修正MongoModel类的写入数据的自增获取
[修正]修正第三方模板引擎驱动类
[修正]修正自动加载可能的一处导致重复加载的问题
[修正]修正__CONTROLLER__ 在URL不区分大小写情况下的获取
[修正]修正Route类中请求类型判断错误的bug
[修正]修正mysqli驱动的free方法
[改进]改进CronRun行为扩展
[改进]TOKEN_NAME 未设置时使用默认值__hash__
[改进]模类的_after_insert回调返回false后直接返回
[改进]Model类的save方法 如果data为空则不执行
[改进]Model类的delete方法 如果条件为空 则不执行删除操作
[改进]改进获取模块方法,支持驼峰法模块命名
[改进]改进模型的查询方法对表前缀的支持,使用当前模型设置的表前缀
[改进]视图模型的视图定义中的_table属性和关联模型中的relation_table 支持 __TABLE_NAME__定义方式
[改进]Model类的query和execute方法支持 __TABLE_NAME__定义方式
[改进]改进PDO驱动对pgsql字符转义的支持
[改进]改进Cookie函数对名称中包含“.”的支持
[改进]改进Sae上传驱动 增加file['url']信息存储
[改进]Page类添加默认的listRows值
[改进]改进IS_CGI常量的判断,支持fcgi
[改进]改进Db类的multiConnect方法 避免切换数据库的时候 配置数据被缓存
[改进]改进Db类对传入的参数 如果未设置数据编码,设置默认的编码为utf8
[改进]改进B方法支持对行为和扩展类的调用,需要传入完整的类名
[改进]改进验证码类 添加验证成功后是否重置session的参数 reset 默认为true
[改进]改进session和cookie函数,支持获取全部
[改进]调试模式下,错误的查询条件和非法数据写入会抛异常
[改进]改进Model类的getField方法
[调整]设置VIEW_PATH后参数后无需再定义模块子目录
[调整]为了避免和函数规则冲突,规则路由排除分隔符改为“-”
3.2.1 更新日志
[增加] 增加Rpc控制器支持
[增加] 添加原来的部分扩展类库
[增加] 增加RestController
[增加] 添加Boris行为扩展
[增加] 增加Boris第三方类库
[增加] 增加BIND_MODULE BIND_CONTROLLER BIND_ACTION 常量定义 用于在入口文件中绑定
[增加] 增加 mole_check 标签位
[增加] 增加buildLite行为 用于根据当前环境生成运行时lite文件 可以替换框架入口文件运行,提高效率
[增加] Think类增加getMap方法
[增加] C函数增加默认值功能 可以是获取配置参数的时候,当没有定义的时候获取传入的默认值
[增加] 增加Yar扩展支持
[增加] 添加jsonRPC扩展
[增加] 增加Api应用模式扩展和Mode扩展目录
[增加] 添加第三方模板引擎
[增加] 支持操作方法绑定到类
[增加] 增加Think\Auth类
[增加] 增加Hprose控制器和第三方类库包
[增加] 增加CONF_PATH常量定义
[增加] 应用和模块增加自动读取当前应用模式配置文件的功能
[修正] 修正正则路由的一个函数处理的bug
[修正] 修正模板引擎类的一处bug
[修正] 修正L函数的一处错误
[修正] 修正驱动类一处错误
[修正] 修正MongoModel一处错误
[修正] 修正Verify类对多个验证码同一个页面显示的bug
[修正] 修正找不到Log类的错误
[修正] 修正模型类的一处bug
[修正] 修正session函数一处警告错误
[修正] 修正U函数的一处警告错误
[修正] 修正compile函数的一处bug
[修正] 修正验证码的背景图片功能
[修正] Think\Image类常量修正
[修正] 修正Image类的架构方法错误
[修正] 修正Mongodb数据库驱动
[修正] 修正trace方法在CLI下面中文输出乱码
[修正] 修正控制器类当调用不存在的方法的报错
[改进] 改进操作方法的名称识别
[改进] 改进数据库驱动 支持不同的链接指定不同的charset参数
[改进] 改进get_client_ip函数
[改进] 改进L函数支持传入变量
[改进] 改进PDO驱动 当版本低于PHP5.3.6的时候禁用模拟预处理语句
[改进] 调整dispatcher类的模块、控制器和操作名获取方法
[改进] 页面trace扩展CLI下面不执行
[改进] 优化trace方法
[改进] 解决因配置文件加载顺序错误导致在SAE环境中运行出错的问题
[改进] 改进Storage类
[改进] 优化load_ext_file函数
[改进] Behavior类简化(下一版本可能会废弃)
[改进] 核心行为类简化取消对Behavior的继承
[改进] C函数并入系统函数库文件
[改进] union连贯操作方法 字符串用法支持 TABLE_NAME 方式替换
[改进] 改进Jion和table连贯操作方法,当使用TABLE_NAME解析的时候支持动态指定的表前缀
[改进] 优化U函数
[改进] 路由类改进
[改进] 改进路由的闭包支持 闭包函数如果返回布尔值 则继续执行后续 否则中止执行
[改进] 应用模式定义文件移动到MODE_PATH目录下面 便于管理
[改进] 默认URL不区分大小写
[改进] 改进路由闭包定义
[改进] 改进路由的额外参数传入
[改进] 重写查询缓存功能
[改进] 关联模型修改
[改进] Image类水印生成支持透明度参数
[改进] 改进Image驱动
[改进] 验证码类改进
[改进] 改进上传类及驱动
[改进] session驱动类接口改进 无需定义execute方法
[改进] 静态缓存仅在get请求下生效
[改进] 改进静态缓存行为
[改进] 语言文件更新
[改进] Storage类的SAE驱动更新
[改进] 英文语言包修正
[改进] 改进PDO驱动
[改进] 默认生成的测试控制器规范改进
[删除] 废除APP_FILE_CASE参数配置 改为Windows下调试模式自动开启区分大小写