PHP项目中CodeIgniter使用的一些建议Word文档格式.docx
- 文档编号:5142718
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:9
- 大小:73.58KB
PHP项目中CodeIgniter使用的一些建议Word文档格式.docx
《PHP项目中CodeIgniter使用的一些建议Word文档格式.docx》由会员分享,可在线阅读,更多相关《PHP项目中CodeIgniter使用的一些建议Word文档格式.docx(9页珍藏版)》请在冰点文库上搜索。
);
input->
post('
phone'
);
每次都要手动输入这么长的类似的语句对于追求高效的人来说显然是不可取的,所以得让Eclipse支持codeigniter特定的代码提示,包括Controller和Model。
把如下代码添加到
system/core/目录下的Controller文件中CI_Controller类的构造函数之前,这其实就是进行
变量声明,Model文件也是同样操作。
/**
*@varCI_Config
*/
var$config;
*@varCI_DB_active_record
var$db;
*@varCI_Email
var$email;
*@varCI_Form_validation
var$form_validation;
*@varCI_Input
var$input;
*@varCI_Loader
var$load;
*@varCI_Router
var$router;
*@varCI_Session
var$session;
*@varCI_Table
var$table;
*@varCI_Unit_test
var$unit;
*@varCI_URI
var$uri;
*@varCI_Pagination
var$pagination;
现在效果如下:
只需输入$this
即可产生代码提示,效率提高不少。
自定义辅助函数和库
一般一个项目中会有许多相同的逻辑,会使用到相同的代码。
如果每次都去复制粘贴不仅麻烦而且不利于后续修改,想到需要修改一个逻辑就要到每个文件里修改代码就觉得可怕(涉及到设计模式这一块了,值得我们学学)。
所以你要善于利用那些自定义辅助函数(helpers)和自定义的库(libraries)。
把相同的逻辑封装成函数或者类,每次遇到相同的逻辑之时只需调用现成的helper或者library即可,修改也只需要在helper或者library中一处修改,不需要到处找代码。
举一个我项目中的例子。
API需要给APP发送的请求返回json格式数据,那么在PHP中的一种实现方法就是:
echojson_encode($data);
//$data是array类型的数据
但是如果$data中包含中文字符的话,输出的json数据会把中文变成Unicode编码,为了避免客户端需要再次处理数据,需要加入一个参数,即:
echojson_encode($data,JSON_UNESCAPED_UNICODE);
这样就能输出原始的中文了。
但是问题又来了,每次都要写这么长一段代码实在是麻烦,所以封装成一个辅助函数。
在application/helpers文件夹中新建一个文件render_helper.php。
其中代码如下:
<
?
php
defined('
BASEPATH'
)orexit('
Nodirectscriptaccessallowed'
/**
*打印不转义中文的json
*@param[array]$data
functionecho_json($data){
echojson_encode($data,JSON_UNESCAPED_UNICODE);
}
那么每次调用之时只需先在类中的构造函数载入该辅助函数,如下:
helper('
render'
//载入打印json的自定义辅助函数
就可以在本类的所有成员函数中使用该方法:
echo_json($data);
这样省时省力(加上Eclipse的代码提示,你只需要输入echo,这个函数就可以出来了)。
以后需要修改成编码后中文,或者转换成英文等等(奇怪的需求~)你都可以只修改一行代码,效率提高不少。
善用缓存
如果一个APP的活跃用户不是很多,那么传统的LAMP架构就可以应付了。
但是随着用户的逐渐增多,要想提高并发量,最好还是加一个缓存。
在memcached和redis中,我选择了redis,主要因为它数据类型更丰富(不仅支持key-value型的数据,同时还提供list,set,zset,hash等数据结构的存储),能帮你实现一部分逻辑(避免重复造轮子)。
与Eclipse配置同理,首先得让计算机上的PHP能够和redis通讯(假设你的计算机已经安装了redis),那么首选的是phpredis扩展,这里介绍一下我在Debain服务器上的配置过程,执行的命令如下:
wget#下载扩展
tarxvfmaster.tar.gz#解压目录
cdphpredis-master/#进入解压后的目录
phpize
./configure--enable-redis
make&
&
makeinstall#安装
#但是报错-bash:
phpize:
commandnotfound(在使用apt-getinstallphp5安装php时,默
#认是没有安装phpize的,我们安装phpredis时,需要用到phpize,因此,需要先安装#phpize。
我们通过安装php开发者工具来获取phpize。
执行如下命令即可:
apt-getinstall#php5-dev)
ls/usr/lib/php5/20100525/#根据安装提示的文件,结果:
curl.sogd.soredis.so
vim/etc/php5/apache2/php.ini#打开PHP配置文件
#DynamicExtensions后面添加extension=redis.so,因为上面命令结果显示有redis.so
/etc/init.d/apache2restart#重启Apache服务器
现在PHP就能和redis通讯了,测试如下:
$redis=newRedis();
$redis->
connect('
127.0.0.1'
6379);
auth('
你的密码'
//为了安全,要给redis设置密码
set('
tom'
'
hanks'
echo'
tom:
'
.$redis->
get('
).'
/br>
;
//tom:
hanks
echo'
will:
will'
//will:
>
好了,现在来到配置codeigniter使其能够使用redis的步骤了。
Codeigniter3.0.0本身具有redis支持,但是它实现的功能过于单一,不能够满足我的业务需求,所以必须要修改。
但是最好不要直接在/system/libraries/Cache/drivers/Cache_redis.php中修改,因为以后codeigniter升级采用直接覆盖system文件夹的形式,会覆盖掉你的代码。
所以最明智的做法还是自己创建一个库,具体步骤如下:
1、在application/config/redis.php中加入配置信息:
$config['
socket_type'
]='
tcp'
config['
host'
你的服务器域名或者IP'
password'
你的redis密码'
port'
]=6379;
timeout'
]=0;
2、在application/libraries中建立如下图的文件结构
Rediscli.php代码如下:
classRediscliextendsCI_Driver_Library{
public$valid_drivers;
public$CI;
function__construct(){
$this->
CI=&
get_instance();
valid_drivers=array(
'
default'
}
Rediscli_default.php代码从/system/libraries/Cache/drivers/Cache_redis.php直接拷贝过来,唯一的不同是把类名从CI_Cache_redis改为Rediscli_default,这样就能按照官方的使用方法使用我们自己写的库。
3、现在可以在Rediscli_default.php中添加或者修改方法,具体操作取决于你自己的应用的需求。
比如在我的应用中,需要保持一个一定长度的队列,所以在Rediscli_default类中添加如下两个方法:
*弹出链表头元素
*@paramunknown$key,链表名
publicfunctionlpop($key){
return$this->
_redis->
lPop($key);
*插入元素到表尾
*@paramunknown$value,待插入值
publicfunctionrpush($key,$value){
rPush($key,$value);
某个类需要调用该库时只需在其构造函数中添加如下代码:
driver('
rediscli'
//加载redis自定义库
rediscli->
default->
is_supported();
//判断是否支持redis并打开连接
则该类的每个函数就都可以使用Rediscli_default类中的任一方法,示例如下:
lpop('
delnews'
//弹出名为delnews的链表头元素
rpush('
$nid);
//该链表加入尾元素$nid
登陆逻辑的实现
对于我们的APP来说,每个请求都要判断用户是否已登陆,对于登陆的合法用户正常显示请求,对于未登录的用户提示“请先登录”。
一般的web应用采用cookie-session机制,一般的session都是以文件形式保存在服务器上,考虑到文件访问慢于内存访问,我们可以配置codeigniter的session保存于redis中。
我这里模仿这种机制:
用户正常login后返回一个特定的id和特定的token(你可以自定义产生算法),服务器以id为key、token为value直接保存在redis中。
以后的每次访问APP都必须带上用appsecret(预定义)加密后的参数id和token,服务器端校验成功即正常返回数据,否则提示“请先登录”。
那么是否每个类都需要写一遍检查登陆的代码呢?
当然不能这么干,我们可以自定义一个基类,在该基类的构造函数中检查登陆状态(还可以在这里加载常用的辅助函数和库,比如上面的render_helper和rediscli)。
然后其他的业务逻辑的类就继承该基类,并完成其自身逻辑即可。
具体操作就是在application/core中新建文件
MY_Controller.php,该文件对应MY_Controller类(继承CI_Controller类)。
该类只需要一个构造函数完成上述功能即可。
然后其它逻辑类只需继承MY_Controller类就不必再次校验登陆状态,而只需完成自身逻辑。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PHP 项目 CodeIgniter 使用 一些 建议