>  기사  >  백엔드 개발  >  PHP 프레임워크 Codeigniter의 몇 가지 우수 사례

PHP 프레임워크 Codeigniter의 몇 가지 우수 사례

伊谢尔伦
伊谢尔伦원래의
2016-11-26 14:23:57911검색

최근에는 Codeigniter를 사용하여 다른 사람이 작성한 프로젝트를 인수하고 개선할 계획입니다. 이전에 CI를 사용해 본 적이 있지만 완전히 내 뜻대로 작성했으며 일부 CI 루틴을 따르지 않았습니다. 대중이 사용하는 프로젝트의 경우 프레임워크 사양을 따르는 것이 가장 좋으므로 나중에 다른 사람이 인수할 때 웃기지 않도록 요약하는 것이 좋습니다.

1. 첫 번째는 MVC입니다

아직 MVC를 모른다면 빨리 배워야 합니다. 컨트롤러 및 뷰에 HTML 코드를 작성하는 값입니다. 이전에 이 모델을 사용하여 프로그래밍한 적이 없다면 이마에 주름이 생길 수 있지만 직접 시도해 볼 기회를 주어야 합니다.

경험상 규칙은 컨트롤러에 더 적은 양의 항목을 넣고 DRY 원칙을 기억하는 것입니다. 즉, 바퀴를 재발명하지 마십시오. 여러 곳에서 동일한 코드를 작성하는 경우 해당 유형에 따라 라이브러리, 도우미 또는 모델을 작성해야 합니다. 예를 들어 데이터베이스 연결 클래스는 자주 사용되므로 이를 모델로 만든다(시스템에서 제공).

MVC의 본질을 이해하고 나면 이것이 습관이 될 것이며 MVC의 간결한 코드로부터 많은 이점을 얻을 수 있을 것입니다.

한 가지 원칙은 복잡한 작업을 모델에 맡기는 것입니다. 컨트롤러는 건축가와 비슷합니다. 모델은 열심히 일합니다. 보기는 화가이다. 컨트롤러는 모델에 항목을 던지기만 하면 되며 데이터가 비정상인지 여부는 신경 쓸 필요가 없으며 플래그와 해당 데이터를 반환합니다. 이러한 방식으로 MVC 아키텍처가 반영됩니다.

모델은 사실 전자레인지 같은 가전제품 같아요. 사용이 간편할수록 좋아하시는데요. (음식 넣기 - 시작 누르시면 밥이 다 익어요.) 인터페이스 수가 적다는 장점은 모델을 업그레이드할 수 있다는 것입니다. 코드를 최적화할 때 외부 세계와의 결합도가 높지 않습니다. 내부적으로 서툴게 작성하더라도 인터페이스가 깔끔하고 사용하기 쉽습니다.

2. 애플리케이션 및 시스템 경로

index.php가 FTP 서버의 /public_html/ 경로에 있는 경우 시스템 및 애플리케이션 폴더를 웹루트 외부에 배치하는 것이 가장 좋습니다. 루트 디렉토리인 /system에 시스템을 배치해야 합니다. 이 경우 PHP 파일은 index.php를 통해서만 액세스할 수 있습니다.

index.php 파일에서 $system_folder 및 $application_folder 값을 수정하는 것을 잊지 마세요. $system_folder 값은 index.php 파일에 상대적이어야 하며, $application_folder 값은 수정해야 합니다. 시스템 디렉토리에 상대적이어야 합니다.

3. 오류 보고 및 디버깅

PHP 오류 및 데이터베이스 오류 보고를 끄는 것을 잊어버리는 것은 위험합니다. 모든 공개 사이트에서는 error_reporting을 0으로 설정해야 하며, 최대 E_ERROR로만 설정할 수 있습니다. 데이터베이스 설정 db_debug는 기타 보안 고려 사항에 따라 오류 정보가 표시되지 않도록 설정해야 합니다. ini_set('display_errors' , 'Off');

코딩하고 디버그할 때 error_reporting을 E_ALL로 설정하고 애플리케이션을 출시하기 전에 모든 참고 사항과 경고를 해결해야 합니다.

간단한 방법은 application/config/database.php 파일에서 db_debug 값을 MP_DB_DEBUG로 설정하는 것입니다. 웹사이트가 실행 중일 때 다음과 같이 설정하세요.

ini_set('display_errors', 'Off');
error_reporting(0);
define('MP_DB_DEBUG', false);

코딩에서 다음으로 설정:

ini_set('display_errors', 'On');
error_reporting(E_ALL);
define('MP_DB_DEBUG', true);

4. 보안 문제는 매우 중요합니다.

POST 데이터, COOKIE 데이터, URI 데이터 등 프로그램에 데이터를 수신하기 전에 양식, XML-RPC 데이터 또는 SERVER 배열의 데이터별로 다음 세 단계를 연습하는 것이 좋습니다.

잘못된 데이터를 필터링합니다.

데이터가 올바른지 확인합니다. 유형, 길이, 크기 등(때때로 이 단계가 첫 번째 단계를 대체할 수도 있음)

데이터베이스에 제출하기 전에 데이터를 변환하세요.

SQL 주입, XSS 및 CSRF와 관련하여 이를 방지하기 위한 조치를 취할지 여부를 결정하기 전에 이를 이해해야 합니다. CI 매뉴얼의 보안 지침과 입력 및 보안 항목을 참고하실 수 있습니다. 아마도 가장 중요한 원칙은 데이터베이스나 파일 시스템에 데이터를 제출하기 전에 모든 사용자 입력을 확인하는 것입니다.

SQL 인젝션. CI와 함께 제공되는 Active Record를 사용하면 이 문제를 해결할 수 있습니다.

XSS(교차 사이트 스크립팅). POST 및 COOKIE에서 크로스 사이트 스크립팅 공격의 자동 필터링을 활성화하려면 $config['global_xss_filtering'] = TRUE;를 설정하면 일부 리소스가 소모됩니다. POST 및 COOKIE가 처리될 때마다 별도로 사용할 수도 있으며 두 번째 매개변수는 $this->input->post('some_data', TRUE)와 같이 TRUE로 설정됩니다. 양식 유효성 검사 클래스도 XSS를 제공합니다. $this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean');

과 같은 필터링 옵션

CSRF (跨站请求伪造)。CI 2.0 将内置 CSRF 检查,在 Google 上搜索 "CSRF tokens" 学习更多关于在保护表单提交和 URL 链接的知识,在 Ajax 应用方面可以搜索 "double cookie submission" 或 "双提交 cookie"。

SPAM (垃圾留言和恶意注册)。通过保护你的邮件表单,评论表单,以及其他各种免费用户提交的数据来防止垃圾信息,一个简单的方法是只允许一个IP/User客户端在一分钟之内只能提交一次,一个比较好的方式是使用 Captcha ,CI2中内置了一个CAPTCHA的辅助函数。

5. 数据库 和 ORM

CodeIgniter 有一个自带的库 Active Record 能够帮助你在不使用 SQL 语句的情况下写查询语句。这在你不太精通 SQL 语句或不知道怎样防止SQL注入的情况下是一个很好的方法。

当你需要更强大的工具时,你可以考虑使用 Object Relational Mapper ,就是鼎鼎大名的 ORM 了,遗憾的是,CodeIgniter 没有自带 ORM 库,不过也有一些其他很好的选择。

6. 代码实践

编写简洁的代码,并且理解你的代码,不要只是复制粘贴别人的代码,并且不断提高编码能力。手册上的开发规范是一个能学习怎样更好编写代码的地方。

1. DRY。不要总是重复造轮子,把能重用的代码放在它应该在的地方,比如libraries, helpers 或者是 models,而不是controllers,一个经验准则:当你复制代码的时候,也许你已经第二次把它放在了错误的地方。

2. Caching (缓存)。缓存是一个提高性能的很好的方式,尤其是减少数据库的访问。可以参考网页缓存和数据库缓存,或者在论坛上搜索其他的可选方案,比如 MP_Cache 是作者自己的作品。

3. HTTP headers (HTTP头部)。在客户端你能够通过单独发送HTTP头部使浏览器缓存页面来提高性能,当你使用 AJAX 的时候你也需要了解它来禁止浏览器缓存。

一个禁止缓存的例子:

$this->output->set_header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
$this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate");
$this->output->set_header("Cache-Control: post-check=0, pre-check=0", false);
$this->output->set_header("Pragma: no-cache");

一个长时间保持缓存的例子(比如 css, javascript):

$this->output->set_header('Cache-Control: private, pre-check=0, post-check=0, max-age=2592000');
$this->output->set_header('Expires: ' . gmstrftime("%a, %d %b %Y %H:%M:%S GMT", time() + 2592000));
$this->output->set_header('Last-Modified: ' . gmstrftime("%a, %d %b %Y %H:%M:%S GMT", time() - 20));

7. 模板渲染不必每次都调用 header 与 footer

在 MY_Controller 头部和 __construct 函数中添加以下内容,用于设定默认的模版信息,其中 SITE_NAME 需要自己在 application/config/constants.php 里面自己定义:

class MY_Cont roller extends CI_Controller {
    protected $_data;    // 模版传值数组
    protected $_tplext;  // 默认模版后缀
    protected $_header;  // 默认头部模版
    protected $_footer;  // 默认底部模版
    public function __construct () {
        parent::__construct();
        $this->_data['title'] = SITE_NAME;
        $this->_tplext = '.php';
        $this->_header = 'templates/header';
        $this->_footer = 'templates/footer';
        // 开发模式下开启性能分析
        if (ENVIRONMENT === 'development') {
            $this->output->enable_profiler(TRUE);
        }
    }
}

8. 不必所有的类都继承 CI_Controller

新增的控制器不再继承 CI_Controller,而改继承 MY_Controller:

class Index extends MY_Controller {
    public function __construct () {
        parent::__construct();
    }
    /**
     * 前台首页
     */
    public function index () {
        $this->_data['title'] = '首页';  // 不指定则使用默认标题 SITE_NAME
        $this->_view('index/index');
    }
}

末了,再补充两个:

9. CodeIgniter的文件结构

cache用以存储缓存文件,codeigniter文件夹包含了CI的基类CI_Base,为了兼容php4和php5,CI_Base有两个版本,其中php4版本的CI_Base继承于CI_Loader。libraries里存放了大部分常用的类库,最主要的三个类:Model,View和Cotronller,自己写的任何mvc都要继承于已有的mvc类;helpers里是一些函数(方法)集合,用以辅助其他模块的方便工作。language是一个语言包,用以支持多语言。

application文件夹用以存储您的应用程序,CI已经在内部为您增加了一些子文件,包括models、views、controllers、config、errors、hooks和libraries。其中前三个文件夹是用以创建模型、视图和控制器的。您的大部分工作都应该是创建属于自己的MVC,并可在config里加入配置文件,libraries里加入一些对象和方法,用来辅助您的模型和控制器工作。而hooks也是对CI_Hooks的扩展,具体内容见下面的章节。

10. CodeIgniter的工作过程

当有一个http请求时,如http://www.google.com/blog/,首先进入CI的引导文件index.php。接下来我们看看index.php里做了哪些事情。

index首先设置了应用程序的文件夹名称为application,系统的文件夹名称为system,然后做了一系列严格的判断并转换为unix风格的服务器绝对文件路径,具体说来定义了两个比较重要的常量,APPPATH,应用程序的文件夹路径,根据分析可知,该路径可以和system同级:htdocs/application/,也可以放到system文件夹里面,作为其子文件夹:htdocs/system/application/,但推荐采用第二种方式,这样显得比较整齐;BASEPATH,网站文档的基本文件路径,写出来大概是htdoc/system/;到最后,index引导文件引入了codeigniter/codeigniter.php里。接下来我们看看codeigniter里做了什么事情。

codeigniter.php一上来就引入了三个文件:Common.php,Compat.php和config/constants.php,其中Common里包含了一些函数,用于载入类库的load_class,记录日志的log_message,和引入错误页面的show_404是几个重要的函数;Compat主要解决了php4和php5中的函数不兼容问题,而constants则定义了一些读写文件权限的常量。

그런 다음 codeigniter는 첫 번째 클래스 라이브러리인 Benchmark를 로드합니다. 이 클래스 라이브러리의 가장 간단한 응용 프로그램 중 하나는 웹 페이지 컴파일의 시작부터 끝까지 걸리는 시간을 계산하는 것이므로 시작 부분에 표시를 합니다. 렌더링이 완료되고 마크가 추가된 후 소요된 시간을 계산할 수 있습니다.

그런 다음 두 번째 클래스 라이브러리인 Hooks가 로드됩니다. Benchmark와 마찬가지로 이 클래스 라이브러리는 시스템 라이브러리 아래에 있습니다. 이 클래스 라이브러리의 기능은 프로그램 컴파일을 시작하기 전에 다른 작업을 수행할 수 있는 기회를 제공하는 것입니다. , Hooks는 다른 작업을 수행할 수 있는 약 8가지 기회를 제공합니다. 자세한 내용은 사용자 가이드를 참조하세요. 여기에서는 첫 번째 후크를 가져옵니다.

그 후 계속해서 입력 및 언어를 로드합니다. 이전에 로드된 클래스 라이브러리는 참조이며 CI_Base 개체 로드라는 또 다른 중요한 로드가 있습니다. php4 버전인 경우 Base4의 CI_Base는 CI_Loader를 상속하지만 Base5에서는 CI_Base와 CI_Loader가 상속 관계가 없기 때문에 Loader가 먼저 로드되고 Base4가 로드됩니다.

다음 단계도 매우 중요한 단계입니다. 이 단계는 컨트롤러 클래스를 로드하는 것으로 시작됩니다. 이는 참조가 아니라 라우터를 통해 http 주소를 구문 분석하여 컨트롤러 이름을 가져옵니다. 그런 다음 응용 프로그램 컨트롤러에 해당 컨트롤러와 메서드가 있는지 확인하고, 없으면 오류가 보고되고 판단이 시작됩니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.