PHP项目中CodeIgniter使用的一些建议

前日再给三个应用程式写API,同有的时候候还要写相应的后台管理网址。为了有扶植开发和代码协会与管理,作者决定利用三个存活的框架。Codeigniter由于其轻量轻松自定制的特点吸引了自身,一路费用过来也是有大致年时间了,写下一些团结在付出进度中的一些体会来与大家共勉。

1.希图专门的学问
下载PHPExcel:
这是个有力的Excel库,这里只演示导出Excel文件的功用,个中的大部意义或许都用不着。

2.安装PHPExcel到Codeigniter

1)解压压缩包里的Classes文件夹中的内容到applicationlibraries目录下,目录构造如下:
–applicationlibrariesPHPExcel.php
–applicationlibrariesPHPExcel(文件夹)
2)修改applicationlibrariesPHPExcelIOFactory.php文件
–将其类名从PHPExcel_IOFactory改为IOFactory,遵循CI类命名准绳。
–将其结构函数改为public

3.安装达成,写一个导出excel的调整器(Controller)

代码如下:
复制代码
代码如下:classTable_exportextendsCI_Controller{
    function__construct()
    {
        parent :: __construct();
        // Hereyoushouldaddsomesortofuservalidation
        // topreventstrangersfrompullingyourtabledata
    }
    functionindex($table_name)
    {
        $query = $this -> db -> get($table_name);
        if(!$query)
            returnfalse;
        // StartingthePHPExcellibrary
        $this -> load -> library(‘PHPExcel’);
        $this -> load -> library(‘PHPExcel/IOFactory’);
        $objPHPExcel = newPHPExcel();
        $objPHPExcel -> getProperties() -> setTitle(“export”)
-> setDescription(“none”);
        $objPHPExcel -> setActiveSheetIndex(0);
        // Fieldnamesinthefirstrow
        $fields = $query -> list_fields();
        $col = 0;
        foreach($fieldsas$field)
        {
            $objPHPExcel -> getActiveSheet() ->
setCellValueByColumnAndRow($col, 1, $field);
            $col++;
            }
        // Fetchingthetabledata
        $row = 2;
        foreach($query -> result()as$data)
        {
            $col = 0;
            foreach($fieldsas$field)
            {
                $objPHPExcel -> getActiveSheet() ->
setCellValueByColumnAndRow($col, $row, $data -> $field);
                $col++;
                }
            $row++;
            }
        $objPHPExcel -> setActiveSheetIndex(0);
        $objWriter = IOFactory :: createWriter($objPHPExcel,
‘Excel5’);
        // Sendingheaderstoforcetheusertodownloadthefile
        header(‘Content-Type:application/vnd.ms-excel’);
        header(‘Content-Disposition:attachment;filename=”Products_’ .
date(‘dMy’) . ‘.xls”‘);
        header(‘Cache-Control:max-age=0’);
        $objWriter -> save(‘php://output’);
        }
    }

4.测试

投入数据库有表名称叫products,当时得以访谈

本文由码农网 –
邱康原创,转发请看清文末的转发必要,迎接加入大家的付费投稿安排!

PHPExcel是用来操作OfficeExcel文书档案的三个PHP类库,它根据微软的OpenXML规范和PHP语言。能够采取它来读取、写入不相同格式的原子钟格。而Codeigniter是叁个作用强大的PHP框架。二者组合就能够起到非常屌的功效啊!

① 下载

开拓工具

开拓工具备为数不菲,每个人的习贯也不一样。Eclipse一直是自己的最爱,那么怎么让Eclipse援助codeigniter呢?

先是那是个PHP项目,所以得让Eclipse协理PHP。假如你的Computer已经安装了PHP,那么最轻便易行的做法正是在Eclipse的market space中探寻PDT并安装。具体操作:Help -> Eclipse
Marketplace。在输入框中输入PDT,点击find,如图:

图片 1

点击右下方的install,等待几分钟就可以。

今后得以在Eclipse中写PHP了,可是对于codeigniter来讲,经常接收的语句相通如下:

$this->load->model ( 'user_model' );

$this->input->post ('phone');

老是都要手动输入这么长的切近的言语对于追求高速的人的话肯定是不可取的,所以得让Eclipse帮衬codeigniter特定的代码提示,包蕴Controller和Model。把之类代码增加到

system/core/
目录下的Controller文件中CI_Controller类的布局函数从前,那实际正是开展

变量申明,Model文件也是如出风华正茂辙操作。

 /**
       * @var CI_Config
       */

       var $config;

       /**
       * @var CI_DB_active_record
       */

       var $db;

       /**
       * @var CI_Email
       */

       var $email;

       /**
       * @var CI_Form_validation
       */

       var $form_validation;

       /**
       * @var CI_Input
       */

       var $input;

       /**
       * @var CI_Loader
       */

       var $load;

       /**
       * @var CI_Router
       */

       var $router;

       /**
       * @var CI_Session
       */

       var $session;

       /**
       * @var CI_Table
       */

       var $table;

       /**
       * @var CI_Unit_test
       */

       var $unit;

       /**
       * @var CI_URI
       */

       var $uri;

       /**
       * @var CI_Pagination
       */

       var $pagination;

现今效果如下:

图片 2

只需输入$this 就可以发生代码提醒,作用进步不菲。

将下载解压的php_redis.dll放在php解释器的ext,会发掘mysql等的模块也都位居此处,然后张开php.ini,找到;extension=php_bz2.dll,在其上边加多extension=php_redis.dll

擅长缓存

假诺多少个APP的活泼顾客不是不菲,那么人生观的LAMP结构就足以应付了。不过随着客户的逐步增添,要想巩固并发量,最棒照旧加一个缓存。在memcached和redis中,笔者选拔了redis,首要归因于它数据类型更拉长(不唯有援救key-value型的数码,同一时间还提供list,set,zset,hash等数据构造的存款和储蓄),能帮你兑现部分逻辑(幸免再度造轮子)。与Eclipse配置同理,首先得让计算机上的PHP能够和redis通信(借使你的微Computer已经设置了redis),那么首荐的是phpredis扩大,这里介绍一下自个儿在Debain服务器上的布署进程,试行的指令如下:

wget https://github.com/nicolasff/phpredis/archive/master.tar.gz  #下载扩展

tar xvf master.tar.gz      #解压目录

cd phpredis-master/     #进入解压后的目录

phpize

./configure --enable-redis

make && make install    #安装

#但是报错-bash: phpize: command not found(在使用apt-get install php5安装php时,默

#认是没有安装phpize的,我们安装phpredis时,需要用到phpize,因此,需要先安装#phpize。我们通过安装php开发者工具来获取phpize。执行如下命令即可: apt-get install #php5-dev)

ls  /usr/lib/php5/20100525/#根据安装提示的文件,结果:curl.so  gd.so  redis.so

vim /etc/php5/apache2/php.ini   #打开PHP配置文件

# Dynamic Extensions 后面添加extension=redis.so,因为上面命令结果显示有redis.so

/etc/init.d/apache2 restart       #重启Apache服务器

今后PHP就会和redis通信了,测验如下:

<?php

 $redis = new Redis();

 $redis->connect('127.0.0.1',6379);

 $redis->auth('你的密码');//为了安全,要给redis设置密码

 $redis->set('tom','hanks');

 echo ' tom:'.$redis->get('tom'). '</br>';// tom:hanks

echo 'will:'.$redis->get('will'); //will:

?>

好了,今后来到配置codeigniter使其可以采用redis的手续了。Codeigniter3.0.0本人持有redis扶持,可是它达成的法力过于单生机勃勃,不可以知道满意本人的作业须要,所以必定要改过。可是最佳不用一向在/system/libraries/Cache/drivers/Cache_redis.php
中期维改过,因为从此未来codeigniter晋级选取直接覆盖system文件夹的款型,会覆盖掉你的代码。所以最明智的做法还是友好创办一个库,具体步骤如下:

1、在application/config/redis.php 中参与配置音信:

<?php

defined ( 'BASEPATH' ) or exit ( 'No direct script access allowed' );

$config ['socket_type'] = 'tcp';

config ['host'] = '你的服务器域名或者IP';

$config ['password'] = '你的redis密码';

$config ['port'] = 6379;

$config ['timeout'] = 0;

2、在application/libraries中确立如下图的公文构造

图片 3

Rediscli.php 代码如下:

<?php

defined ( 'BASEPATH' ) or exit ( 'No direct script access allowed' );

class Rediscli extends CI_Driver_Library {

       public $valid_drivers;

       public $CI;

       function __construct() {

              $this->CI = & get_instance ();

              $this->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类中增加如下四个方式:

/**

       * 弹出链表头元素

       * @param unknown $key,链表名              

       */

       public function lpop($key) {

              return $this->_redis->lPop ( $key );

       }

       /**

       * 插入元素到表尾

       * @param unknown $key,链表名              

       * @param unknown $value,待插入值              

       */

       public function rpush($key, $value) {

              return $this->_redis->rPush ( $key, $value );

       }

有些类供给调用该库时只需在其布局函数中加多如下代码:

$this->load->driver ( 'rediscli' ); // 加载redis自定义库

$this->rediscli->default->is_supported ();//判断是否支持redis并打开连接

则该类的每种函数就都足以动用Rediscli_default类中的任一方法,示举例下:

$this->rediscli->default->lpop('delnews');//弹出名为delnews的链表头元素

$this->rediscli->default->rpush('delnews',$nid);//该链表加入尾元素$nid

application/config/config.php里面配备大家应用的缓存类型,默许是如此的:

总结

Codeigniter是本身最赏识的一个PHP框架(相比较于thinkPHP,Zend
Framework等等),首要在于其易安装,轻量,易自定制的长处。把握好这一个亮点,我们就会写出不逊于那么些重量级框架写出来的采纳,而且省时省力。

用作多少个上学的小孩子,在物色学习的途中还会有繁多标题亟待肃清,本文的意在和贵族享受,更要紧的是权族有如何提出照旧商酌请一定多多支持哈,笔者的和讯:邱康singasong。

// 自定义类,需要配置
$this->load->driver('rediscli');
if ($this->rediscli->default->is_supported())
{
 echo $this->rediscli->default->get('key2');
}

登入逻辑的达成

对于大家的APP来说,每一个央求都要认清顾客是还是不是已登入,对于登录的官方客户符合规律呈现恳求,对于未登入的客户提示“请先登入”。平时的web应用使用cookie-session机制,经常的session都是以文件情势保留在服务器上,思索到文件访谈慢于内部存款和储蓄器访谈,大家得以安顿codeigniter的session保存于redis中。作者那边模仿这种机制:客商日常login后回去二个一定的id和特定的token(你能够自定义爆发算法),服务器以id为key、token为value直接保存在redis中。今后的每趟访谈应用程式都不得不带上用appsecret(预约义)加密后的参数id和token,服务器端校验成功即健康重返数据,不然提醒“请先登陆”。

那就是说是不是各样类都急需写一次检查登录的代码呢?当然不可能如此干,大家得以自定义二个基类,在该基类的布局函数中反省登录状态(还足以在这里处加载常用的声援函数和库,譬喻下面的render_helper

rediscli)。然后别的的事体逻辑的类就持续该基类,并实现其自个儿逻辑就能够。

具体操作正是在 application/core
中新建文件 MY_Controller.php,该公文对应MY_Controller类(继承CI_Controller类)。该类只供给一个布局函数完结上述功用就能够。

下一场别的逻辑类只需三回九转MY_Controller类就不要再次校验登录状态,而只需成功自己逻辑。

② Rediscli.php

自定义协理函数和库

相近二个连串中会有不胜枚举等同的逻辑,会动用到均等的代码。假若每趟都去复制粘贴不仅仅辛勤並且不平价后续修改,想到须求校订二个逻辑就要到各类文件里修正代码就认为怕人(涉及到设计方式这一块了,值得我们学习)。所以你要善用运用那么些自定义辅助函数(helpers)和自定义的库(libraries)。把相近的逻辑封装成函数或然类,每一次碰着相像的逻辑之时只需调用现存的helper或许library就能够,改正也只须要在helper可能library中黄金年代处改造,无需外地找代码。

举叁个本人项目中的例子。API须求给应用程式发送的乞求再次来到json格式数据,那么在PHP中的生龙活虎种实现情势正是:

echo json_encode ( $data);//$data 是array类型的数据

但是倘诺$data中包涵普通话字符的话,输出的json数据会把汉语产生Unicode编码,为了幸免顾客端须求重新拍卖多少,供给参与二个参数,即:

echo json_encode ( $data , JSON_UNESCAPED_UNICODE);//$data 是array类型的数据

这么就可以出口原始的国语了。但是难题又来了,每一次都要写那样长生机勃勃段代码实乃劳动,所以封装成三个帮手函数。在application/helpers
文件夹中新建一个文件render_helper.php。在那之中代码如下:

<?php

defined ( 'BASEPATH' ) or exit ( 'No direct script access allowed' );

/**

 * 打印不转义中文的json

 * @param [array] $data

 */

function echo_json($data) {

       echo json_encode ( $data, JSON_UNESCAPED_UNICODE );

}

那正是说每一趟调用之时只需先在类中的布局函数载入该援助函数,如下:

$this->load->helper ( 'render' ); // 载入打印json的自定义辅助函数

就能够在本类的具备成员函数中使用该方法:

echo_json ( $data);

这样省时省力(加上Eclipse的代码提醒,你只须求输入echo,那个函数就足以出去了)。现在供给校勘成编码后中文,只怕调换来丹麦语等等(古怪的须求~)你都足以只改良生龙活虎行代码,功效进步不少。

② 安装

也正是在extension的配备区域的头顶,增添上这些redis的安排。安装即便完事了。

$this->cache->redis->save('key11','xx11',1000);

若是我们使用redis,那么要布局成相符那样:

④ 时间

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

③ 调用

2、安装phpredis

7、注意这种场所

正文实例呈报了php框架CodeIgniter使用redis的不二法门。分享给大家供大家参谋,具体如下:

③ 查看配置新闻

// 框架的redis库
$this->load->driver('cache');
$this->cache->redis->save('key11','xx11');//这里注意,第三个参数是时间,在自定义redis库会说明
echo $this->cache->redis->get('key11');

在myApplication/config下创办理文件件redis.php:

自定义redis类库能够从system/libraries/Cache/drivers/Cache_redis.php拷贝后生可畏份,改名叫Rediscli_default.php,类名也改为Rediscli_default,除此而外无需更动,能够再自个儿增多越来越多方式。将其放在myApplication/libraries/Rediscli/drivers/下

$config['sess_driver'] = 'redis';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 0;
$config['sess_save_path'] = 'tcp://127.0.0.1:xxxx';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 600;
$config['sess_regenerate_destroy'] = TRUE;

重启服务器或许重启计算机,index.php的路子下加多二个翻看页面:phpinfo.php,在中间增加:

// 文本存储
$this->load->driver('cache',array('adapter'=>'redis','backup'=>'file'));
$this->cache->save('key5','xx5',10000);
echo $this->cache->get('key5');//xx5

其生机勃勃自定义redis库和框架的库是如出黄金时代辙的,在此汇集说美素佳儿(Friso卡塔尔国下。

5、使用CI框架的redis库

本条代码的野趣是,首先应用redis来储存,若无找到的话,就选取文本存款和储蓄。会发觉在myApplication/cache贮存了文本文件,各种key会有一个文本。

这种还是少用吧,毕竟用redis是为着速度更加快。

下载7.1相应的版本。

接下来访谈

4、配置redis.php

那是保存值,第4个参数是光阴,那几个小时无法大概。通过查看函数能够看见,这几个参数暗中认可值是60秒,而非永远,所以这几个参数是不得不难的。

3、php原生的法子操作redis

对应的版本点进去:

① Rediscli_default.php

6、使用自定义的redis类库

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
 * Created by PhpStorm.
 * Date: 2017/2/9
 * Time: 13:32
 */
$config['socket_type'] = 'tcp';
$config['host'] = '127.0.0.1';
$config['password'] = NULL;
$config['port'] = 6379;
$config['timeout'] = 0;
?>

1、安装redis

品类地址:

说下自个儿度过的弯路,一早先从

// 原生redis类库,不需要config/redis.php
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
//$redis->set('key10','xx10',20);//第三个参数是存续时间,单位是秒,如果不填则为永久
echo $redis->get('key10');

在myApplication/libraries/Rediscli/下创造贰个Rediscli.php

率先计算机上必得已经装了redis服务(redis数据库)并运营,详见另大器晚成篇作品:

<?php
defined ( 'BASEPATH' ) or exit ( 'No direct script access allowed' );
/**
 * Created by PhpStorm.
 * Date: 2017/2/9
 * Time: 20:00
 */
class Rediscli extends CI_Driver_Library {
 public $valid_drivers;
 public $CI;
 function __construct() {
  $this->CI = & get_instance ();
  $this->valid_drivers = array (
   'default'
  );
 }
}
<?php
 echo phpinfo();
?>

因为从没报错,所以不平时也许不清楚这一个数量到底存在哪个地方。

除却配备redis.php之外,还非得在

任凭是选取框架的redis库依然上边包车型大巴自定义redis库都亟需以此构造文件。

发表评论

电子邮件地址不会被公开。 必填项已用*标注