您的位置:首页 > 编程语言 > PHP开发

PHP框架认识初步

2016-04-16 19:43 946 查看


PHP框架比较


CodeIgniter

Codeigniter 相当轻量级,下载下来就能用, CI 的最大特点就是可扩展性很强 你可以通过不修改源码的方式 优雅的扩展几乎所有的东西。


thinkphp

官方文档比较全

国产的


yii

英文好点的推荐yii


Laravel

Laravel是PHP 5.3之后开发的新框架,充分使用了PHP 5.3之后的新特性,不像很多老牌框架有一大堆历史包袱。

Codeigniter 的文档相当丰富,Laravel 4 的资料不多。

Laravel 4 需要用 composer 下载安装各种第三方依赖库,在国内下载网速很慢。

Codeigniter 兼容 PHP 5.2,Laravel 4 要求 PHP 5.3.7 以上。


总结

CI的设计比较老套,且还有历史包袱

Laravel因为是后来者,设计上更先进一些


CodeIgniter笔记


CodeIgniter

CodeIgniter 是一个简单快速的PHP MVC框架。

CodeIgniter 是一套给 PHP 网站开发者使用的应用程序开发框架和工具包。它提供一套丰富的标准库以及简单的接口和逻辑结构,其目的是使开发人员更快速地进行项目开发。使用 CodeIgniter可以减少代码的编写量,并将你的精力投入到项目的创造性开发上。

简单快速,这也是选择CI的原因。
以下内容细节可以从CI官方文档寻找


超级对象this

当前的控制器对象,this,提供了很多属性

加载方法
1

$this->load->

装载器类的实例system/core/Loader.php

提供的方法:

view() 装载视图
vars() 分配变量到视图
database() 装载数据库操作
model() 装载模型对象
helper()


var_dump

1

void var_dump ( mixed $expression [, mixed $... ] )

此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。


$this->input 输入类

作用:默认帮助进行安全处理

CI_Input类 system/cor/Input.php

$this->input->server('DOCUMENT_ROOT')
相当于
$_POST['DOCUMENT_ROOT']


$this->input->post('表单提交的name')


URL相关函数

site_url

在form表单中提交action不能把路径写死,使用
site_url (controller/action)

base_url 根目录

请求图片时,
<img src="<?php echo base_url()?>uploads/jh.jpg">

自动加载URL函数,autoload.php

$autoload[‘helper’] = array(‘url’);


路由

config/routes.php


默认的控制器
1

$route['default_controller']=

伪静态页面,不再显示
xxx.php
,在路由中写一个正则表达式
1

$route['show/([\d]+)\.html']='article/show/'


分页

使用分页类
pagination


加载类文件

1

$this->load->library('pagnination');


配置

1

$config['per_page']=10;//每页显示10条数据

其他配置见文档


初始化

1

$this->pagination->initialize($config)


创建链接

1

$this->pagination->create_links($config)


跳过多少条

sql语句
select from limit+跳过的条数


定制分页器

$config[‘first_link’]=”首页”

其他配置见文档


文件上传

表单

<form enctype="multipart/form-data"></form>


使用文件上传类

1

$this->load->library('')


配置

文档


上传

1

$this->upload->do_upload('pic')


返回信息

文件上传的一些数据
1

$his->upload->data()


session

CI中的session 默认不使用php的原生session,放在cookie中(限制大小4k),不太好使用
1

$this->session->set_userdata('user',$user) ; //使用键值对来存储数据

因为是存储在cookie中的,所以不能在当前的函数中获取到session中的数据,需要跳转的别的页面后才可以获取的到


加密

生成随机不重复的字符串作为加密用的key,保存到config.php
1

$['encryption_key']="key的值"

或者不使用CI的session,囧。。。


表单验证


使用表单验证类

$this->load->library(‘form_validation’);


验证

1

$this->form_validation->set_rules('','','');
$bool=$this->form_validation->run();

前台验证使用js,后台验证使用表单验证类


输出错误

form_error('name','<span>','</span>')


echo validation_error()
直接输出所有结果(推荐使用)


CodeIgniter笔记之数据库访问


修改配置文件

application/config/database.php


装载

将数据库访问对象,装载到超级对象属性中 $this->load->database();


查询

1

$res->$this->db->query($sql) //返回查询结果对象对象
$res->result() ;// 返回数组,数组中是一个个对象
$res->result_array(); // 返回二维数组,里面是关联数组
$res->row(); // 返回第一条数据


参数绑定

1

$sql="select * from blog_user where name=?";
$this->db->query($sql,$name); // 如果有多个参数(问号),需要使用索引数组


db的自动加载

配置自动加载db
application/config/autoload.php


1

$autoload['libaraied'] = array('database'); // 就不需要$this->load->database();


CI的AR模型 Active Record


配置

applicaion/config/database.php
设置
$active_record
= TRUE


操作

1

$res=$this->db->get('表名'); // 返回结果对象
$res->result();
$bool = $this->db->insert('表名',关联数组);
$bool=$this->db->update('表名',关联数组,条件);
$bool=$this->db->delete('表名',条件)


连贯操作

模拟sql语句
1

$res=$this->db->select('id,name')->from('user')->where('id>=3');

使用where
1

$res=$this->db->where('name','mary')->get('user');


复杂的查询使用参数绑定

$this->db->query($sql,$data)


数据库查询结果


result()

方法执行成功返回一个对象数组,失败则返回一个空数组。

例:
1

$query = $this->db->query("要执行的 SQL");

foreach ($query->result() as $row)
{
echo $row->title;
echo $row->name;
echo $row->body;
}


判断结果集的条目数

1

if ($query->num_rows() > 0)


result_array()

该方法执行成功时将记录集作为关联数组返回。失败时返回空数组。
1

$query = $this->db->query("要执行的 SQL");

foreach ($query->result_array() as $row)
{
echo $row['title'];
echo $row['name'];
echo $row['body'];
}


row()

该函数将当前请求的第一行数据作为 object 返回。


总结,CI中的增删改查




得到一个表

1

$this->db->get('表名')

单个表条件查询

1

$this->db->get_where('表名','关联数组条件')

单表查询多个限定条件,链式查询
1

$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);
$query  = $this->db->get();

多表查询

1

$this ->db->query($sql,$data)
$sql   = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$query = $this->admin->query($sql, array($id, $status, $author));



可以向函数传递 数组 或一个 对象。

$bool = $this->db->insert('表名',关联数组);
$data = array(
'title' => 'My title' ,
'name' => 'My Name' ,
'date' => 'My date'
);
$this->db->insert('mytable', $data);
// Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')



1

$bool=$this->db->update('表名',关联数组,条件);

$data = array(
'title' => $title,
'name' => $name,
'date' => $date
);

$this->db->where('id', $id);
$this->db->update('mytable', $data);


1

$this->db->update('mytable', $data, array('id' => $id));



1

$bool =$this->db->delete('表名',条件)


初探PHP框架(一)


前言

完成了一个小项目,使用Apache+MySql+PHP。PHP中使用的框架是CodeIgniter,这是一个轻量易扩展的PHP MVC框架,适用于轻量级的网站搭建。CodeIgniter手册清晰丰富,覆盖了一般网站的所有需求。
为了更好地理解PHP里面框架的设计,目标是自己写一个简单的PHP MVC框架,一方面可以更深入地学习PHP,一方面也能够更深入地理解框架设计里面的思想。


Apache的工作流程

Apache是一个Web服务器,也可以叫做http服务器,因为Apache只能处理http请求。常见的web服务器还有Nginx
Apache的工作流程如下:

浏览器向服务器发出HTTP请求(Request)。
服务器收到浏览器的请求数据,经过分析处理,向浏览器输出响应数据(Response)。
浏览器收到服务器的响应数据,经过分析处理,将最终结果显示在浏览器中。

Apache和Nginx都属于Web服务器,两者都实现了HTTP 1.1协议。
所以如果有人问FTP协议可以在Apache上工作吗?答案是用Apache FTP Server可以,Apache web服务器不可以。
Apache是用C语言写的,服务器当然要追求高效率。


PHP原理

PHP的核心解释器是用C语言写的,相当于我们写了PHP代码,会有一个C语言写好的解释工具一边解释,一边执行。实际上在写PHP的时候就是在使用一个C语言写好的工具,我们的PHP代码就是指挥这个工具的命令。
PHP包括四层体系:

Zend引擎:Zend整体用纯C实现,是PHP的内核部分。负责翻译PHP代码,是一切的核心。
Extensions:围绕Zend引擎,通过组件方式提供基础服务。常见内置函数如array是由extension实现的。
Sapi通过一系列的钩子函数,使得PHP可以和外围交互数据。如Apache
上层应用:平时写的PHP程序

如果PHP是一辆车,那么车的框架就是PHP本身,Zend是车的引擎(发动机),Ext下面的各种组件就是车的轮子,Sapi可以看做是公路, 车可以跑在不同类型的公路上,而一次PHP程序的执行就是汽车跑在公路上。因此,我们需要:性能优异的引擎+合适的车轮+正确的跑道。

PHP的执行的核心是翻译出来的一条一条指令,也即opcode。
hashtable是PHP的核心数据结构,数组就是典型的应用。Zend hash table实现了典型的hash表散列结构,同时通过附加一个双向链表(解决冲突),提供了正向、反向遍历数组的功能。
更详细的内容参考这里


PHP在Apache上运行


以模块加载的方式运行

这种方式使用了Apache的Hook机制。所谓Hook机制,就是在自己的程序运行的时候允许别的模块插上一腿。当我们配置Apache服务器的
http.config
文件时,写入
mod_php5.so/php5apache2.dll
就是将自定义的函数注入到Apache的请求处理循环当中。在模块化的运行方式中,PHP与Web服务器一起启动并且运行,通过Apache自身的进程线程管理来处理并发的请求。


以CGI,FastCGI方式运行

CGI英文叫做公共网关接口,CGI是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规程。Apache在Http请求的时候会将请求提交给CGI应用程序(php-cgi.exe)解释,解释之后的结果返回给Apache,然后再返回给相应的请求用户。
CGI VS FastCGI
FastCGI是CGI的加强版本,CGI是单进程,多线程的运行方式,程序执行完成之后就会销毁。FastCGI是常驻(long-live)型的CGI.有自身的进程管理器,不必每一次都fork一个进程(CGI解释器)去执行。常见的PHP-FPM是一个PHP FastCGI管理器。
关于更多的对比可以看这里

目前在HTTPServer这块基本可以看到有三种stack比较流行:
(1)Apache+mod_php5
(2)lighttp+spawn-fcgi
(3)nginx+PHP-FPM
三者后两者性能可能稍优,但是Apache由于有丰富的模块和功能,目前来说仍旧是老大。有人测试nginx+PHP-FPM在高并发情况下可能会达到Apache+mod_php5的5~10倍,现在nginx+PHP-FPM使用的人越来越多。


初探PHP框架(二)

在写第一个PHP框架的时候参考这位大哥,的内容和Codeigniter框架的源码。


程序框架的搭建

前提:已经搭建好了一个apache+PHP的开发环境,我使用的是Apache+mod_php5的方式。
在根目录
simplemvc
下新建以下文件夹

config
用来存放配置文件
controller
用来存放控制器
lib
用来存放引入的库文件
model
用来存放模型
system
用来存放系统文件

core
核心文件,包括核心controller控制器等,所有的controller都要继承于他
lib
存放核心的库文件,包括route等
app.php
应用程序驱动类

view
用来存放视图
index.php
项目的入口文件,程序是从这里开始执行的。


定义系统路径

1

//预定义
define('SYSTEM_PATH', dirname(__FILE__).'/system');
define('ROOT_PATH',  substr(SYSTEM_PATH, 0,-7));
define('SYS_LIB_PATH', SYSTEM_PATH.'/lib');
define('APP_LIB_PATH', ROOT_PATH.'/lib');
define('SYS_CORE_PATH', SYSTEM_PATH.'/core');
define('CONTROLLER_PATH', ROOT_PATH.'/controller');
define('MODEL_PATH', ROOT_PATH.'/model');
define('VIEW_PATH', ROOT_PATH.'/view');

预定义一些常量,在之后的程序中我们会使用这些路径。


加载配置文件,和应用程序驱动类


配置文件

在config文件夹下的
config.php


··

$CONFIG[‘system’][‘db’]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: