CodeIgniter 入门
in php on CodeIgniter - Hits()
网上想要比较cakephp和CodeIgniter,答案是萝卜白菜各有所爱。
cakephp模仿ROR,没用过ROR的学习曲线要大些。
CodeIgniter适合小型项目,性能比较好,因为没有过多累赘。
cakephp中型项目,性能稍逊。但是特性较CodeIgniter多。
CodeIgniter文档较详细:
下载包中user_guide文件夹/index.html有,但是那个tablecontent一开始没注意到,它在页面顶部,点击出来下拉目录,囧。
照着文档读一遍,两个小时就够了,简单吧。
笔记:
以其index.php来作为你项目入口,
apache配置中需要配置文件夹
Options execCGI FollowSymLinks
AllowOverride All
-
静态页面控制:
默认连接方式是http://example.com/[controller-class]/[controller-method]/[arguments]
那么 http://example.com/news/latest/10 就会找到news这个控制器类调用其latest方法,传入10这个参数。
这个配置是在application/config/routes.php中
注意,例如这样的配置
routes[‘welcome’] = ‘welcome’
将会在controller中寻找welcome 文件夹中(或下面的controller子文件夹)的welcome.php文件中的Welcome类。文件名必须小写,类名必须以大写字母开头。
URL Helper类问题:
这里面的方法都是依据config.php中配置的$config['base_url']来的,
因此如果你配置的是abc.com,那么即使用户使用www.abc.com访问,返回的都是不带www的url,包括
current_url()这个方法也是如此,显然这个方法是个鸡肋,遇到ajax请求就跨域了,因为www.abc.com和abc.com是跨子域的。
异常处理:
他的异常在index.php中设置,不知道是什么原因,在其他地方再设置就没什么作用了,一旦出错就显示一堆错误,只能使用ob_end_clean();把它的输出清除掉。
日志:
system\libraries\Log.php log_message('level', 'message')
日志显示级别在config.php中配置
$config['log_threshold'] = 4;
$config['log_path'] = ''; //空表示在站点目录下logs文件夹中,以php为扩展名
CI有个session过期的bug,因为它是每隔一段时间更新session对应的cookie(这是为了安全起见),所以可能造成前后两个ajax请求的session对应的cookie不一样:
1:请求A调用时正好导致更新cookie
2:请求B此时还是使用老cookie,由于A请求改了cookie,则会导致找不到session。
参见:http://codeigniter.com/forums/viewthread/102456/
这上面也没好的办法,要么是注释更新cookie的代码,要么将$config['sess_time_to_update'] = 300;设置为很长就不会调用更新cookie的方法。
参见http://www.path8.net/tn/archives/2526
CI可通过数据库保存session,但是无论怎样,都是依赖客户端的cookie配合的,所以定时更新cookie的方法让session长期不过期的目标不好实现。
下面是自定义的Session类,CI可以自定义核心类:
user_guide/general/core_classes.html
放在application/core/即可,会自动加载的,要以MY_开头,要继承想要扩展的父类。
下面是MY_Session类:
<?php <?php if (!defined('BASEPATH')) exit ('No direct script access allowed'); /** * ------------------------------------------------------------------------ * CI Session Class Extension for AJAX calls. * ------------------------------------------------------------------------ * * Save as application/libraries/MY_Session.php */ if (!function_exists('is_ajax_request')) { function is_ajax_request() { return (!empty ($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'); } } class MY_Session extends CI_Session { // -------------------------------------------------------------------- /** * sess_update() * * Do not update an existing session on ajax calls * * @access public * @return void */ public function sess_update() { //still have the problem // return; if (!is_ajax_request()) { parent :: sess_update(); }else{ } } // -------------------------------------------------------------------- /** * sess_destroy() * * Clear's out the user_data array on sess::destroy. * * @access public * @return void */ public function sess_destroy() { $this->userdata = array (); parent :: sess_destroy(); } } // ------------------------------------------------------------------------ /* End of file MY_Session.php */ /* Location: ./application/libraries/MY_Session.php */ ?>
我使用之后发现还是有问题,要从根本上解决还是要将sess_update这个方法不起作用,但是这样的话降低了安全性,CI主要是为了cookie安全才定时刷新cookie的。
is_ajax_request这个方法判断的头对于jquery 来说是靠谱的,因为jq加了这个头,但是别的库就没有。在后来的CI版本中添加了input->is_ajax_request方法。
配置hook
user_guide/general/hooks.html
首先需要在application/config/config.php中设置$config['enable_hooks'] = TRUE;
然后在application/config/hooks.php中设置扩展
这里可以配置pre_controller的hook,即controllers被调用之前的hook
$hook['pre_controller'][] = array (
'class' => 'MYClass'
);