这里只讲cakephp3+,因为我只用过3
0.与其他框架的比较
我见过写的最好的一篇比较文章: Zend vs Symfony vs Laravel vs Cakephp
结论:
Use the right tool for the right job. (I’m sure that’s what you wanted to hear).If you need an extremely modular and well supported framework go with Symfony 2, if you want fast prototyping and ease of use go with Laravel 5, and if you want something in-between go with CakePHP 3.
这篇文章写得很中肯,不是单纯的比较,讲了各自的优缺点,里面还有些很有意思的总结。
1.安装
最正确的方式是使用 Composer 进行安装。
官网可能有时候进不去,并且国外镜像有些包可能下不动,你可以使用Composer中国镜像(国内镜像好像是Laravel中文社区那帮人弄的)。
本文已默认你能正确安装和使用Composer.
安装要求
- php5.6或更高版本 (支持php7)
- mbstring拓展
- intl拓展
php -v #在安装之前可以检查下php版本是否符合要求
php -m #查看所需拓展是否已经安装
composer self-update && composer create-project --prefer-dist cakephp/app my_app_name #新建cakephp 项目,my_app_name为你的项目名
至此,你已建立了一个cakephp 最新版本的项目
2.启动
以centos 6.5 nginx为例:
server {
listen 80;
server_name m.example.com admin.example.com api.example.com;
# root directive should be global
root /var/www/example.com/public/webroot;
index index.php;
access_log /var/www/example.com/log/access.log;
error_log /var/www/example.com/log/error.log;
location / {
try_files $uri $uri/ /index.php?$args; #兼容pathinfo
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
note:
- 那一行兼容pathinfo 路由的配置
- server_name 配置了多个域名在之后的子域名路由配置会用到。
- root配置到webroot这一级 (apache可以不用)
配完别忘了重载nginx配置
service nginx reload #重载nginx配置
这个时候如果是本地,更改host 添加一条映射m.example.com 将就可以访问
3.配置
Cakephp的配置跟其他框架比没有太多区别,使用的是数组配置,相对yaml比较简单。
Symfony使用yaml,如果不熟悉,很容易出错。
这里主要讲下我的个人配置习惯。
app.php
这个配置文件配置了数据库,debug模式,邮件,加密salt.这些配置往往可能是线上、开发者服务器、测试服务器都不同的。因此这个文件也被默认从版本中忽略(git被默认忽略)。所以你可以把一些不要被提交的个人配置写入这个文件。
例如:我在开发时会使用我本地vagrant 虚拟机的redis,我便会把redis配置写在app.php中
'Redis'=>[
'default'=>[
'host'=>'192.168.1.11',
'port'=>'6379'
],
]
数据配置
我这里的数据配置是指一些重要的密钥之类的配置,比如微信商户id,短信接口账户等等。我会配置一个dataconf.php 在bootstarp.php引入。
//bootstrap.php
Configure::load('dataconf');
//dataconf.php
return [
'key' => [
'hanvon' => 'b7be897a-a101-4163-88c9-d914cd9ecb59'
],
'encrypt'=>[
'key'=>'e878caddbb44ee591f30389477f21e30a3cd4377', //实际要求要32位
'salt'=>'d2339263f44886091b8a62ef43196f15',
],
'pvlog'=>[
'store_nums'=>100, //pvlog的redis 缓冲区数目
],
'baidu'=>[
'mapkey'=>'474572ab0a64485f5b02d3e8accaf09c'
],
];
4.路由
Cakephp的路由功能十分的强大和灵活,并且支持REST路由,在这里讲讲官方文档没讲到的子域名模式。
一般的项目开发当中,大家习惯建立一个前台目录和后台目录,多的可能或有一个移动端目录。大多数框架都是以子目录形式区分,也有的项目以子域名模式区分,但cakephp 通过路由配置配合prefix其实可以做到二者兼得。
$subdomain = substr(env('HTTP_HOST'), 0, strpos(env('HTTP_HOST'), '.'));
if (in_array($subdomain, ['admin', 'm','m-my','admin-my'])) {
if(in_array($subdomain,['m-my','m','api'])){
$subdomain = 'mobile';
}
if(in_array($subdomain,['admin','admin-my'])){
$subdomain = 'admin';
}
$routes->connect('/:controller/:action/*', ['prefix' => $subdomain]);
}
if ($subdomain == 'admin') {
//admin 域名 路由配置
}
5.脚手架
Cakephp的脚手架即bake命令,就实用而言,只能用在后台投入生产,因为后台的代码每个模块的相似度最高。可通过model 生成对应的可用代码。这一块没有太多的技巧,就是按照官方的demo,结合它的语法进行改造。这一块再配合plugin功能可组织一个高可复用的一套后台模板插件,类似python django 的admin。
6.缓存
Cakephp 的缓存的最大优势是简单的配置,可以轻松的利用redis,memcache,文件进行缓存一些内容。
7.shell
对于shell命令的使用我有2个场景:
1.交互式命令处理一些任务,比如最开始安装一个插件时,可用交互命令的形式提示开发者初始化一些数据。
2.shell+crontab 定时执行任务。如果业务允许还可以结合reids 队列做一些队列任务。
8.发布
这里讲一些发布所注意的事项。
- app.php中的debug 配置 false,关闭debug模式。
- 保证各个目录的权限,其中logs 和 tmp 两个目录php-fpm 需对其有读写权限。
composer dumpautoload -o #能加快类的读取速度
bin/cake plugin assets copy #官方建议 并且如果用到ueditor之类的,能解决它的上传问题