zoukankan      html  css  js  c++  java
  • PHP框架认识初步

    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是一个Webserver。也能够叫做httpserver,由于Apache仅仅能处理http请求。

    常见的webserver还有Nginx

    Apache的工作流程例如以下:

    1. 浏览器向server发出HTTP请求(Request)。

    2. server收到浏览器的请求数据,经过分析处理。向浏览器输出响应数据(Response)。

    3. 浏览器收到server的响应数据,经过分析处理,将终于结果显示在浏览器中。

    Apache和Nginx都属于Webserver,两者都实现了HTTP 1.1协议。

    所以假设有人问FTP协议能够在Apache上工作吗?答案是用Apache FTP Server能够,Apache webserver不能够。

    Apache是用C语言写的,server当然要追求高效率。

    PHP原理

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

    PHP包含四层体系:

    1. Zend引擎:Zend总体用纯C实现。是PHP的内核部分。负责翻译PHP代码。是一切的核心。

    2. Extensions:环绕Zend引擎,通过组件方式提供基础服务。

      常见内置函数如array是由extension实现的。

    3. Sapi通过一系列的钩子函数,使得PHP能够和外围交互数据。如Apache
    4. 上层应用:平时写的PHP程序

    假设PHP是一辆车,那么车的框架就是PHP本身。Zend是车的引擎(发动机)。Ext以下的各种组件就是车的轮子。Sapi能够看做是公路, 车能够跑在不同类型的公路上,而一次PHP程序的运行就是汽车跑在公路上。

    因此,我们须要:性能优异的引擎+合适的车轮+正确的跑道。

    PHP的运行的核心是翻译出来的一条一条指令,也即opcode。

    hashtable是PHP的核心数据结构,数组就是典型的应用。Zend hash table实现了典型的hash表散列结构,同一时候通过附加一个双向链表(解决冲突),提供了正向、反向遍历数组的功能。

    更具体的内容參考这里

    PHP在Apache上执行

    以模块载入的方式执行

    这样的方式使用了Apache的Hook机制。所谓Hook机制,就是在自己的程序执行的时候同意别的模块插上一腿。

    当我们配置Apacheserver的http.config文件时,写入mod_php5.so/php5apache2.dll就是将自己定义的函数注入到Apache的请求处理循环其中。在模块化的执行方式中。PHP与Webserver一起启动而且执行。通过Apache自身的进程线程管理来处理并发的请求。

    以CGI,FastCGI方式执行

    CGI英文叫做公共网关接口,CGI是外部应用程序(CGI程序)与Webserver之间的接口标准,是在CGI程序和Webserver之间传递信息的规程。

    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’]


  • 相关阅读:
    课后作业-阅读任务-阅读提问-1
    Android:XML简介 & 解析方式对比(DOM、SAX、PULL)
    Android Handler
    Android BroadcastReceiver解析
    Android:(本地、可通信的、前台、远程)Service使用全面介绍
    android 服务解析
    android 解决子线程进行UI操作
    android 基础题
    java中的synchronized(同步代码块和同步方法的区别)
    Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7263353.html
Copyright © 2011-2022 走看看