创制第三个调控器,轻易的Thinkphp快速入门教程

├─README.md       README文件,控制器接受用户的输入并调用模型和视图去完成用户的需求

图片 1

 

简单普及一下MVC [模型层M,控制层C,视图层V]

       
在平常的项目中我们总是会遇到需要将某个方法任务定时执行的问题,定时执行方法任务如果我们拥有服务器的权限,我们可以直接在服务器设置定时任务,例如在Windows的任务计划程序中进行设置,在Linux中编写脚本进行执行。如果我们没有服务器权限,我们该如何使用项目的程序代码来自动定时执行呢?接下来就为大家描述一个基于ThinkPHP框架定时执行任务的例子,具体的方法会在下面进行详细的描述。

        关于定时执行任务在这里需要提醒的是,
这里描述的方法是被动执行的,也就是说当系统网站产生访问的时候,程序会对比是否达到定时的要求或者说是否达到执行任务的时间来决定是否执行方法任务,如果达到则执行,否则不执行。另外,如果网站没有任何访问和请求则也是同样不执行,如果大家有发现或者知道了如何主动执行定时任务,烦请留言告知,我也学习一下。

ThinkPHP的目录结构

回顾上一篇的安装目录:

图片 1

视图

 

目录对应关系

F:\\PHP
├─index.php       入口文件
├─README.md       README文件
├─Application     应用目录
├─Public          资源文件目录
└─ThinkPHP        框架目录

 

 

thinkphp 的目录结构

ThinkPHP 的目录结构非常清晰和容易部署。大致的目录结构如下,以项目为基础进行部署。

┎━ThinkPHP 框架系统目录
┃ ┝ ThinkPHP.php 系统公共文件
┃ ┝ Common 公共文件目录
┃ ┝ Tpl 框架系统模版目录
┃ ┝ Lang 系统语言包目录
┃ ┝ PlugIns 公共插件目录
┃ ┗ Lib 系统基类库目录
┃ ┝ Think 系统运行库(必须)
┃ ┝ Com 扩展类库包(非必须)
┃ ┗ ORG 扩展类库包(非必须) 

┝━Application     应用目录、项目目录
┃ ┝ index.php 项目入口文件(可任意放置)
┃ ┝ Cache 模版缓存目录
┃ ┝ Common 公共文件目录(非必须)
┃ ┝ Conf 项目配置目录
┃ ┝ Data 项目数据目录
┃ ┝ Html 静态文件目录(非必须)
┃ ┝ PlugIns 插件目录(非必须)
┃ ┝ Tpl 模版文件目录
┃ ┝ Lang 语言包目录(非必须)
┃ ┝ Logs 日志文件目录
┃ ┝ Temp 数据缓存目录
┃ ┗ Lib 应用类库目录
┃ ┝ Action 控制器(模块)类目录
┃ ┝ Model Model 类文件目录
┃ … 下面的应用目录可根据需要选择和定义
┃ ┝ Exception 异常类库目录
┃ ┝ Common 公共应用类目录
┃ ┗ Help 助手类目录

┃…更多项目目录(和App 目录类似,每个项目采用独立目录,便于部署)

┝━Public 网站公共目录(多项目公用)
┃ ┝ Js JS 类库目录(建议)
┃ ┝ Images 公共图像目录(建议)
┃ ┗ Uploads 公共上传目录(建议)

 

我的“F:\PHP\Application”目录下有个“home”目录,这是ThinkPHP自动生成的一个控制器,

主要文件是“F:\PHP\Application\Home\Controller\IndexController.class.php”,文件内容如下:

 

[php] view
plaincopy图片 2图片 3

 

  1. <?php  
  2. // 本类由系统自动生成,仅供测试用途  
  3. namespace Home\Controller;  
  4. use Think\Controller;  
  5. class IndexController extends Controller {  
  6.     public function Index(){  
  7.         $this->show(‘<style type=”text/css”>*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: “微软雅黑”; color: #333;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px }</style><div  > <h1>:)</h1><p>欢迎使用 <b>ThinkPHP</b>!</p></div><script type=”text/javascript” src=”” charset=”UTF-8″></script>’,’utf-8′);  
  8.     }  
  9. }  

 

在地址栏输入“

 

视图是用户看到并与之交互的界面。

1、方法一:v3.2.1

访问规则

就“home”目录下的控制器举例,您可以通过以下URL地址访问:

模型

①、ThinkPHP/Library/Behavior/CronRunBehavior.class.php文件

创建第一个控制器 

在“F:\PHP\Application”目录下新建一个目录“Index”,偷个赖,把“F:\PHP\Application\Home”目录下的内容都复制

到“F:\PHP\Application\Index”目录下,打开“F:\PHP\Application\Index\Controller\IndexController.class.php”文件,

为了确定访问的确实是我们新加的内容,在“Index”函数中添加点东西,代码如下:

 

[php] view
plaincopy图片 4图片 5

 

  1. <?php  
  2. namespace Index\Controller;  
  3. use Think\Controller;  
  4. class IndexController extends Controller {  
  5.     public function index(){  
  6.         $this->show(‘//phpinfo();<br>’);  
  7.         $this->show(‘<style type=”text/css”>*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: “微软雅黑”; color: #333;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px }</style><div  > <h1>:)</h1><p>欢迎使用 <b>ThinkPHP aaaa</b>!</p></div><script type=”text/javascript” src=”” charset=”UTF-8″></script>’,’utf-8′);  
  8.         $this->show(‘function index()<br>’);  
  9.     }  
  10. }  

试试通过以下URL地址访问吧:

 

模型表示企业数据和业务规则。

 

修改惯例配置

ThinkPHP的默认模块名称是“Home”,也就是说如果你在浏览器地址栏中输入“

修改方法:用文本编辑工具打开“F:\PHP\ThinkPHP\Conf\convention.php”文件,

修改第44行为:’DEFAULT_MODULE’        =>  ‘Index’,  // 默认模块

注意:应用的目录只能是首字母大写后面全部小写,使用“WorkOvertime”结果就出现无法加载控制器的情况!改为“Workovertime”之后,还需要关闭之前的窗口,重新打开一个浏览器窗口访问才能正常!

下一篇:ThinkPhp学习(三)配置PHP5支持MySQL,连接MySQL数据库


控制器

       
在这里首先要说的就是这个自动执行任务文件,官方所给的这个文件存在BUG,我是用的是v3.2.1版本,后面的版本是否有改正大家可以尝试一下。

 

[php] view
plain class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″> copy

 

class=”tracking-ad” data-mod=”popu_169″>  data-mod=”popu_167″>图片 6 class=”tracking-ad”
data-mod=”popu_170″>图片 7

  1. <?php  
  2. /** 
  3. class=”comment”> * ======================================= 
  4.  * Created by WeiBang Technology. 
  5.  * Author: ZhiHua_W 
  6.  * Date: 2016/9/22 0005 
  7.  * Time: 上午 11:12 
  8. class=”comment”> * Project: ThinkPHP实现定时执行任务 
  9.  * Power: 自动执行任务 
  10. class=”comment”> * ======================================= 
  11.  */  
  12. namespace Behavior;  
  13.   
  14. class CronRunBehavior  
  15. {  
  16.     public  class=”keyword”>function run(& class=”vars”>$params)  
  17.     {  
  18.         if (C( class=”string”>’CRON_CONFIG_ON’)) {  
  19.             $this->checkTime();  
  20.         }  
  21.     }  
  22.   
  23.     private  class=”keyword”>function checkTime()  
  24.     {  
  25.         if (F( class=”string”>’CRON_CONFIG’)) {  
  26.             $crons = F( class=”string”>’CRON_CONFIG’);  
  27.         } else  class=”keyword”>if (C( class=”string”>’CRON_CONFIG’)) {  
  28.             $crons = C( class=”string”>’CRON_CONFIG’);  
  29.         }  
  30.   
  31.         if (!empty( class=”vars”>$crons) && is_array( class=”vars”>$crons)) {  
  32.             $update = false;  
  33.             $log =  class=”keyword”>array();  
  34.             foreach ( class=”vars”>$crons as  class=”vars”>$key =>  class=”vars”>$cron) {  
  35.                 if ( class=”func”>empty($cron[2]) ||  class=”vars”>$_SERVER[ class=”string”>’REQUEST_TIME’] >  class=”vars”>$cron[2]) {  
  36.                     G(‘cronStart’);  
  37.                     R($cron[0]);  
  38.                     G(‘cronEnd’);  
  39.                     $_useTime = G( class=”string”>’cronStart’,  class=”string”>’cronEnd’, 6);  
  40.                     $cron[2] =  class=”vars”>$_SERVER[ class=”string”>’REQUEST_TIME’] +  class=”vars”>$cron[1];  
  41.                     $crons[ class=”vars”>$key] =  class=”vars”>$cron;  
  42.                     $log[] =  class=”string”>’Cron:’ . $key .  class=”string”>’ Runat ‘ . date( class=”string”>’Y-m-d H:i:s’) .  class=”string”>’ Use ‘ . $_useTime .  class=”string”>’ s ‘ .  class=”string”>”\r\n”;  
  43.                     $update = true;  
  44.                 }  
  45.             }  
  46.             if ( class=”vars”>$update) {  
  47.                 \Think\Log::write(implode( class=”string”>”, $log));  
  48.                 F(‘CRON_CONFIG’,  class=”vars”>$crons);  
  49.             }  
  50.         }  
  51.     }  
  52. }  

        此段代码已经将bug修复,大家可以将其复制到
“ ThinkPHP/Library/Behavior/CronRunBehavior.class.php ”
文件中进行保存。

 

②、tgs.php

       
在Application/Common/Conf文件夹中新建tags.php文件,进行标签设置。

 

[php] view
plain class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″> copy

 

class=”tracking-ad” data-mod=”popu_169″>  data-mod=”popu_167″>图片 8 class=”tracking-ad”
data-mod=”popu_170″>图片 9

  1. <?php  
  2.   
  3. return  class=”keyword”>array(  
  4.     //’配置项’=>’配置值’  
  5.     ‘app_begin’ => class=”keyword”>array( class=”string”>’Behavior\CronRunBehavior’),  
  6. );   

控制器接受用户的输入并调用模型和视图去完成用户的需求

 

第一个小修改

 

Application\Home\Controller (Controller 字面理解我们也知道这个是控制层
MVC 的C)

③、config.php

     
  在Application/Common/Conf文件夹中的config.php文件进行自动运行配置。

 

[php] view
plain class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″> copy

 

class=”tracking-ad” data-mod=”popu_169″>  data-mod=”popu_167″>图片 10 class=”tracking-ad”
data-mod=”popu_170″>图片 11

  1. <?php  
  2. return  class=”keyword”>array(  
  3.     /* 自动运行配置 */   
  4.     ‘CRON_CONFIG_ON’ => true,  class=”comment”>// 是否开启自动运行   
  5.     ‘CRON_CONFIG’ =>  class=”keyword”>array(   
  6.         ‘测试执行定时任务’ =>  class=”keyword”>array( class=”string”>’Home/Index/crons’, ‘5’,  class=”string”>”),  class=”comment”>//路径(格式同R)、间隔秒(0为一直运行)、指定一个开始时间   
  7.     ),  
  8. );  

 

④、IndexController.class.php

       
在Application/Home/Controller/IndexController.class.php文件中进行定时执行任务的编写。

 

[php] view
plain class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″> copy

 

class=”tracking-ad” data-mod=”popu_169″>  data-mod=”popu_167″>图片 12 class=”tracking-ad”
data-mod=”popu_170″>图片 13

  1. <?php  
  2. /** 
  3. class=”comment”> * ======================================= 
  4.  * Created by WeiBang Technology. 
  5.  * Author: ZhiHua_W 
  6.  * Date: 2016/9/22 0005 
  7.  * Time: 上午 11:20 
  8. class=”comment”> * Project: ThinkPHP实现定时执行任务 
  9.  * Power: 自动执行任务方法控制器 
  10. class=”comment”> * ======================================= 
  11.  */  
  12. namespace Home\Controller;  
  13.   
  14. use Think\Controller;  
  15.   
  16. class IndexController  class=”keyword”>extends Controller  
  17. {  
  18.     /* 
  19.     public function index(){ 
  20. class=”comment”>    $this->show(‘<style type=”text/css”>*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: “微软雅黑”; color: #333;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px }</style><div style=”padding: 24px 48px;”> <h1>:)</h1><p>欢迎使用 <b>ThinkPHP</b>!</p></div><script type=”text/javascript” src=”” charset=”UTF-8″></script>’,’utf-8′); 
  21.     } 
  22.     */  
  23.     public  class=”keyword”>function index()  
  24.     {  
  25.         $contents =  class=”func”>file_get_contents( class=”string”>”test.txt”);  
  26.          class=”comment”>//每次访问此路径将内容输出,查看内容的差别  
  27.         var_dump($contents);  
  28.         exit;  
  29.         $this->assign( class=”string”>”contents”,  class=”vars”>$contents);  
  30.         $this->display();  
  31.     }  
  32.   
  33.     //定时执行的方法  
  34.     public  class=”keyword”>function crons()  
  35.     {  
  36.         //在文件中写入内容  
  37.         file_put_contents( class=”string”>”test.txt”, date( class=”string”>”Y-m-d H:i:s”) .  class=”string”>”执行定时任务!” .  class=”string”>”\r\n<br>”, FILE_APPEND);  
  38.     }  
  39. }  

           
     这样定时执行任务我们就写好了,每隔5秒我们访问任何项目的url,然后查看根目录下的test.txt文件就会发现里面的内容变化。

 

       
 注意:当你修改间隔时间时会发现没有生效,这是你需要将Runtime/Data文件夹下的缓存文件删除,间隔时间缓存存放在CRON_CONFIG.php文件中。

       
 纯净的项目文件下载地址: 欢迎大家下载指正。

IndexController.class.php

 

修改$this->show();里的内容

2、方法2:v3.2.2

还是这个文件

 

public function hello(){
echo ‘hello,thinkphp!’;
}

        此方法和方法一没有多大的区别。

①、tags.php

       
在/Application/Common/Conf目录下新建tags.php文件。(此和方法一处一样)

 

[php] view
plain class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″> copy

 

class=”tracking-ad” data-mod=”popu_169″>  data-mod=”popu_167″>图片 14 class=”tracking-ad”
data-mod=”popu_170″>图片 15

  1. <?php  
  2.   
  3. return  class=”keyword”>array(  
  4.     //’配置项’=>’配置值’  
  5.     ‘app_begin’ => class=”keyword”>array( class=”string”>’Behavior\CronRunBehavior’),  
  6. );  

 

②、crons.php

     
 在/Application/Common/Conf目录下新建crons.php文件。(此处和方法一有区别,注意区分。)

 

[php] view
plain class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″> copy

 

class=”tracking-ad” data-mod=”popu_169″>  data-mod=”popu_167″>图片 16 class=”tracking-ad”
data-mod=”popu_170″>图片 17

  1. <?php  
  2.   
  3. return  class=”keyword”>array(  
  4.      class=”comment”>//myplan为我们计划定时执行的方法文件,2是间隔时间,nextruntime下次执行时间  
  5.      class=”comment”>//此文件位于/Application/Cron/目录下  
  6.     ‘cron’ =>  class=”keyword”>array( class=”string”>’myplan’, 2, nextruntime),  
  7. );  

 

③、myplan.php

        在/Application/Common/目录下新建
Cron文件夹,里面新建文件myplan.php文件。

 

[php] view
plain class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″> copy

 

class=”tracking-ad” data-mod=”popu_169″>  data-mod=”popu_167″>图片 18 class=”tracking-ad”
data-mod=”popu_170″>图片 19

  1. <?php  
  2.   
  3. echo date( class=”string”>”Y-m-d H:i:s”). class=”string”>”执行定时任务!” .  class=”string”>”\r\n<br>”;  

 

       
此时我们就可以访问项目的url,然后我们会发现在Application/Runtime/目录下生成了~crons.php文件,文件内容如下:

[php] view
plain class=”tracking-ad” data-mod=”popu_168″> data-mod=”popu_168″> copy

 

class=”tracking-ad” data-mod=”popu_169″>  data-mod=”popu_167″>图片 20 class=”tracking-ad”
data-mod=”popu_170″>图片 21

  1. <?php  
  2.   
  3.     return  class=”keyword”>array (  
  4.         ‘cron’ =>  
  5.             array (  
  6.                 0 => ‘myplan’,  
  7.                 1 => 60,  
  8.                 2 => 1398160322,  
  9.             ),  
  10.     );  
  11.   
  12. ?>  

访问

就出现了hello….

后置策略,就是在文件输出以后,继续执行。
前置对应的就是_before_hello()

public function _after_hello(){
        echo ‘after<br/>’;
    }
 
hello,thinkphp!after

新建业务模块

/thinkphp/目录下直接建立一个文件叫admin.php

// 检测PHP环境
if(version_compare(PHP_VERSION,’5.3.0′,'<‘))  die(‘require PHP >
5.3.0 !’);
 
define(‘THINK_PATH’,’./ThinkPHP/’);
 
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define(‘APP_DEBUG’,True);
 
// 定义应用目录
define(‘APP_PATH’,’./admin/’);
define(‘APP_NAME’,’admin’);
 
 
// 引入ThinkPHP入口文件
require ‘./ThinkPHP/ThinkPHP.php’;
// 亲^_^ 后面不需要任何代码了 就是如此简单

程序将自动创建admin文件夹,并存放所有需要的文件目录

进入admin的控制模块找到文件 IndexController.class.php

admin\Home\Controller

 $this->show(‘<style
type=”text/css”>*{ padding:
0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff;
font-family: “微软雅黑”; color: #333;font-size:24px} h1{ font-size:
100px; font-weight: normal; margin-bottom: 12px; } p{ line-height:
1.8em; font-size: 36px }</style><div style=”padding: 24px
48px;”> <h1>:)</h1><p>欢迎使用
<b>ThinkPHP</b>!</p><br/>[
您现在访问的是Home模块的Index控制器 ]</div><script
type=”text/javascript”
src=””
charset=”UTF-8″></script>’,’utf-8′);
屏蔽以上信息
加上一句

$this->display();

\thinkphp\admin\Home\View\Index (View 视图层)
这里目录下 搞一个index.html

随便写点

就好了。

模板赋值

IndexController.class.php里

$this->assign(‘name’,’月小升’);
$this->display();
\thinkphp\admin\Home\View\Index\index.html

我是:{$name}

就能显示了。

学一点数据库的配置

thinkphp\Application\Home\Conf
下的文件config.php

<?php
return array(
 //’配置项’=>’配置值’
 // 添加数据库配置信息
 ‘DB_TYPE’   => ‘mysql’, // 数据库类型
 ‘DB_HOST’   => ‘localhost’, // 服务器地址
 ‘DB_NAME’   => ‘thinkphp’, // 数据库名
 ‘DB_USER’   => ‘root’, // 用户名
 ‘DB_PWD’    => ”, // 密码
 ‘DB_PORT’   => 3306, // 端口
 ‘DB_PREFIX’ => ‘think_’, // 数据库表前缀
);
 
 
 public function hello(){
        echo ‘hello,thinkphp!’;
    }
 
    改成
 public function hello(){
 
  echo ‘hello,thinkphp!’;
  $Data = M(‘User’); // 实例化Data数据模型
        $this->data =
$Data->select();
        //$this->display();
  print_r($this->data);
 }
数据库建立一个表think_user

执行

hello,thinkphp!Array ( [0] => Array ( [id] => 1 [name] =>
ghj [pwd] => 123456 ) ) after

读取原生SQL

echo  M(“User”)->getLastSql();

执行原生SQL

使用原生SQL很简单,我们甚至不需要实例化任何的模型,例如:
$Model = new Model(); // 实例化一个空模型

下面的方法是等效的

$Model = D(); 或者 $Model = M();
// 下面执行原生SQL操作
$Model->query(‘select * from think_user where status=1’);
$Model->execute(‘update think_user set status=1 where id=1’);
如果你实例化了某个模型,仍然可以执行原生SQL操作,不受影响,例如:

$User = D(‘User’);
$User->query(‘select * from think_user where status=1’);
$User->execute(‘update think_user set status=1 where id=1’);