Skip to content

轻量级,高性能,高效率,安全的php开发框架

Notifications You must be signed in to change notification settings

lijinhuan/windphp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 

Repository files navigation

#框架说明文档:

###一、说明 windphp是一个轻量级的,高效的,安全的,组件化的php框架,它具有以下特性: (0)支持php7 (1)mvc模式,模型,视图,控制器分离 (2)分层设计,用户请求==》控制器==》service服务层==》dao数据访问层 , 控制器获取到数据后==》视图 (3)使用命名空间特性,框架可以自动加载组件,无需到处include (4)支持url rewrite,有利于seo (5)项目目录自动创建,减少手动创建目录文件烦恼,只需第一次访问加载框架即可自动创建 (6)支持多个数据库分别操作,多个缓存实例分别操作 (7)内置模板解析引擎,可以使用原生php语法也支持模板分离 (8)支持swoole的http,tcp,webSocket服务创建,同时可以方便使用windphp提供的框架服务 (9)debug,exception,日志,翻页,http请求等常用开发组件支持 (10)简单方便的魔法操作,使用该框架,你会发现各种操作真的很简单 (11)安全,对各种输入进行了处理,目录安全隔离等

###二、创建web应用

1、虚拟主机环境
   (1)下载Windphp,放到虚拟主机web目录
   (2)在web目录建立index.php,内容如下:
 	<?php
		use Windphp\Windphp;
		$root_path = __DIR__ . DIRECTORY_SEPARATOR;
		require  $root_path.'Windphp/Windphp.php';
		Windphp::createWebApplication($root_path);
?>
   (3)访问index.php ,框架会在web目录下生成项目所需的目录
   (4)这种方式就是框架和应用文件都放在了web目录,用户可以请求到web里面的文件,特别需要注意的是这种模式下线上环境不要
		开启sql日志存储,防止黑客请求利用,或者通过服务器配置禁止访问日志目录
   
   
2、服务器环境(云,虚拟主机,本机等)
   (1)下载Windphp,放到虚拟主机web目录
   (2)参考demo的helloWorld,把域名绑定到webroot目录
   (3)访问index.php ,框架会在web目录下生成项目所需的目录
   (4)这样做的好处是,用户只能访问webroot目录的文件,不能访问框架和其应用文件,提高安全性,其实就是做安全隔离
   
3、应用目录说明
  (1)components 第三方组件目录,例如短信通知,支付,七牛文件上传等
  (2)config 文件配置目录
  (3)controllers 控制器目录
  (4)daos 数据访问层目录
  (5)service 服务层目录
  (6)runtimes 程序运行时产生的数据,例如日志,模板缓存,文件缓存等
  (7)views 模板文件目录
   
2、url说明:
	(1)http://www.test.com/?index-index-name-lijinhuan.html
	(2)http://www.test.com/?controller=index&action=index&name=lijinhuan
	上面的请求是一样的,表示请求Index控制器下的Index方法,并且带上参数name
	控制器对应的文件是/controllers/IndexController.php

###三、创建控制台命令行执行应用 1、查看demo的cliApp 2、在命令行下执行,如/usr/local/php cli.php CliIndex Index lijinhuan 3、表示访问CliIndex控制器,Index方法,参数lijinhuan 4、控制器对应的文件是/controllers/CliIndexController.php,注意控制器继承的是CliController控制器, 5、具体可以参考demo/test/controllers/CliIndexController.php

###四、创建swoole应用 1、swoole的并发能力很强,具体可以到其官网查看。

2、查看demo的swoole

3、如果创建的是http服务,执行:/usr/local/php swoole.php  Http
   默认使用的端口是9501,可以在配置文件里面修改,然后访问http://www.test.com:9501/?controller=index&action=index&name=lijinhuan,
   表示访问SwooleHttpIndexController控制器,Index方法,参数name值为lijinhuan,
   控制器对应的文件是/controllers/SwooleHttpIndexController.php,注意控制器继承的是SwooleController控制器,
   具体可以参考demo/test/controllers/SwooleHttpIndexController.php

4、如果创建的是websocket服务,执行:/usr/local/php swoole.php  WebSocket
   默认使用的端口是9502,可以在配置文件里面修改,然后使用html5的websocket测试请求连接http://www.test.com:9502,
   默认表示访问SwooleWebSocketIndexController控制器,Index方法,WebSocket请求参数和其他不一一样,建立连接后,
   使用json格式,发送{"controller","test"},表示访问test控制器
   控制器对应的文件是/controllers/SwooleWebSocketIndexController.php,注意控制器继承的是SwooleController控制器,
   具体可以参考demo/test/controllers/SwooleWebSocketIndexController.php
   
5、如果创建的是tcp服务,执行:/usr/local/php swoole.php  Tcp
   默认使用的端口是9503,可以在配置文件里面修改,然后使用telnet  测试连接服务器 9502端口,
   默认表示访问SwooleTcpIndexController控制器,Index方法,tpc请求参数和其他不一致,使用json格式,发送{"controller","test"},表示访问test控制器
   控制器对应的文件是/controllers/SwooleTcpIndexController.php,注意控制器继承的是SwooleController控制器,
   具体可以参考demo/test/controllers/SwooleTcpIndexController.php

###五、控制器说明 1、在controllers下,如 IndexController.class.php 表示Index控制器。 同理,TestController.class.php 表示Test控制器。

2、IndexController.class.php 定义方法 actionIndex() 表示Index方法。
   同理,actionTest 表示Test方法。
 	<?php
	namespace Controllers;
	use Windphp\Controller\CController;
	class IndexController extends CController {
			public function actionIndex(){
				echo '<h2>windphp framework hello world!</h2>';
			}
	}
	?>
3、注意不同应用例如swoole和cli继承的控制器不一样,这里以php-fpm+nginx为例  
4、参考demo/test

###六、服务层 1、在控制器我们可以这样子调用服务,非常方便; $this->userService->getUserInfo($uid); 表示访问services目录下的userService.php的userService类,所有服务类需要继承IService

2、参考demo/test

###七、dao层 1、在服务层中我们可以这样子调用dao: $this->userDao->fetchOne(array('where'=>array('uid'=>1))); 表示获取uid为1的用户数据 表示访问daos目录下的userDao.php的userDao类,所有dao类需要继承IDao类

2、userDao里面的初始化
<?php
/**
 * Copyright (C) windphp framework
 * @todo ShopDao
 */
namespace Daos;


use Windphp\Dao\IDao;
class UserDao extends IDao {
		
	
	public function init(){
		$this->database = 'user';
		$this->table = 'user';
	}
	
		
}
?>
3、其实$this->database = 'user';表示访问user这个数据库
4、其实$this->table = 'user';表示访问user数据库的user表
5、其中数据库配置,在配置文件内如下
	    'db' => array(
			'user' => array(
				'type' => 'mysqli',
 				'host'	=> 'localhost:3306',
 				'username'	=> 'root',
 				'password'	=> '123456',
 				'database'	=> 'user',
 				'_charset'	=> 'utf8',
			)
            ),
  那么user就取自这里的'user' => array('type'=>...)的user属性

###八、dao数据库操作 #####1、查询: (1)普通查询

        $this->userDao->fetchAll(array(
				'where' => array('uid'=>2),
				'select' => 'id',
				'order' => 'sort desc',
				'limit' => '1,30',
		 ));
	 $this->userDao->fetchOne(array('uid'=>2));
	 说明:fetchOne表示只获取一条,fetchAll表示获取所有结果集
	 
(2)in 条件查询,'where' => array('uid'=>array('in'=>array(3,4))) 查找uid为3,4的用户

(3)<  条件查询,'where' => array('uid'=>array('lte'=>3))
     查找uid小于等于3的用户,其中lte表示小于等于,gte大于等于,lt小于,gt大于,neq不等于
	

(4)like 条件查询,'where' => array('name'=>array('like'=>'a%')) 查询a开头的用户

#####2、删除:

	$this->userDao->delete(array('where' => array('uid'=>2),'limit'=>1)); 

#####3、修改: (1)普通更新

		$this->userDao->update(array(
				'where' => array('uid'=>2),
				'set' => array('name'=>'fourm2')
		 ));
(2)统计更新
		$this->userDao->update(array(
				'where' => array('fid'=>2),
				'set' => array('num'=>array('count'=>'+5'),'updatetime'=>12346,'dig'=>array('count'=>'-1'))
		 ));
	前缀+表示增加,-表示减去

#####4、增加: (1)添加主要使用insert

		$this->userDao->insert(array(
				'set' => array('name'=>'fourm2')
		 ));
(2)replace 同上$this->userDao->replace()

#####5、统计: 其实后台翻页经常需要统计条数,我们可以这样子来获取统计 $where = array('uid'=>1); $this->userDao->count($where); 表示获取uid为1的用户数量,返回一个数字

#####5、其他说明 (1)fetchOne,fetchAll 除了支持数组形式输入之外,还支持sql操作, 如 $this->userDao->fetchAll($sql)

(2)$this->userDao->query($sql) 执行查询操作

###五、缓存操作 (1)confing/conf.inc.php 配置

		'memd'=> array(
        			'user' => array(
        					'servers'=>array(
        							'host'=>'127.0.0.1',
        							'port'=>11211,
        							'height'=>75,
        							'auth' => array(
        									//'user' => 'test',
        									//'password'=>'test',
        							),
        					)
        			),
        	 		'other' => array(
        	 				'servers'=>array(
        	 						'host'=>'127.0.0.1',
        	 						'port'=>11213,
        	 						'height'=>75,
        	 						'auth' => array(
        	 								//'user' => 'test',
        	 								//'password'=>'test',
        	 						),
        	 				)
        	 		),
        	 ),	
        	 'redis' => array(
        	 		'user' => array(
        	 				'servers'=>array(
        	 						'host'=>'127.0.0.1',
        	 						'port'=>6379,
        	 						'timeout'=>5,
        	 						'auth' => array(
        	 								//'user' => 'test',
        	 								//'password'=>'test',
        	 						),
        	 				)
        	 		),
        	 		'other' => array(
        	 				'servers'=>array(
        	 						'host'=>'127.0.0.1',
        	 						'port'=>6381,
        	 						'timeout'=>5,
        	 						'auth' => array(
        	 								//'user' => 'test',
        	 								//'password'=>'test',
        	 						),
        	 				)
        	 		),
        	 ),
(2)在控制或者模型中使用缓存实例
	$this->userMemcache->get('name'); 获取key为name的缓存。‘userMemcache’,
	memcache表示使用memcache缓存,user表示使用user这个memcache实例,同理,使用redis
	$this->userRedis->get('name');
	默认缓存:$this->cache->get('name'),cache_type配置哪种类型,就使用哪种,redis会默认使用第一个实例,memcache支持分布式
	

(3)缓存操作
	1、添加缓存数据,$this->cache->set('name','lijinhuan',3600);
	2、获取缓存数据,$this->cache->get('name');
	3、更新缓存数据,$this->cache->update('name','lijinhuan',3600);
	4、删除缓存数据,$this->cache->delete('name');
	5、其实redis支持更多的数据操作,具体可以看Windphp/Cache/RedisCache.php源码

###五、视图操作 1、在Index控制器的Index的方法中添加代码 $this->tpl->show() ; 表示加载views下的default主题(在conf.inc.php中配置)下的Index目录的tpl.Index.php的文件

2、把控制器获取到的数据传到模板中使用,如 $this->tpl->assign('a',$a);
   表示把$a表示渲染到模板中,在模板中可以{$a}这样子调用
 
3、支持原生模式,include $this->tpl->getFile();
   则表示直接加载文件到控制器,在文件中可以 <?php echo $a;?>这样子使用,
   而不需要做$this->tpl->assign('a',$a);渲染。

4、模板语法:在模板文件中,如tpl.Index.php,如果我们是通过 $this->tpl->show() ;这种方式进渲染的,
   那么使用控制器传过来的变量,就需要使用到模板语法进行调用了。
   (1)默认使用{}大括号来进行标明是模板语句,如{$a}表示输出$a变量。这个符号可以在
        confing/conf.inc.php文件中进行配置,添加'tpl_tag' => array('left'=>"\<\!\-\-\{",'right'=>"\}\-\-\>"),
        则表示使用<!--{}-->来标明模板语句,<!--{$a}--> 表示输出$a变量,推荐使用这种方式(也是默认使用的),避免与javascript的冲突
      
   (2)遍历数组
   	<!--{loop $user $k $v}-->
   		<li>第<!--{$k}-->个用户,名字叫<!--{$v['name']}--></li>
   	<!--{/loop}-->
   	
   (3)判断语句
   	<!--{if $a==1}-->
   	    我等于1
   	<!--{elseif $a==2}-->
   	    我等于2
   	<!--{else}-->
   	    我什么都不是
   	<!--{if}-->
	
  (4)加载模板文件
  	<!--{template 'Header','Common'}-->
  	表示加载 /views/default/Common/tpl.Header.php 文件
  	
  (5)执行php代码
  	<!--{php echo $a;}-->
  	
  (6)执行一个函数
  	<!--{func phpinfo()}-->
  	
  (7)输出一个函数的返回值
  	<!--{funcecho date('Y-m-d')}-->
  	
  (8)循环
  	<!--{for $i=0;$i<10;$i++}-->
  		<!--{$i}-->
	<!--{/for}-->

  (9)读取配置文件中的参数
  	<!--{$system_conf['app_url']}-->

###六、配置文件调用 1、在控制或者模型中可以使用Conf::getSystem('autokey') 这样子调用参数 2、又或者Conf::$systemConfig['autokey']这样子调用

###七、第三方组件 1、自己写的或者第三方的扩展组件,需要放在components目录下,命名格式为MyComponet.php,My是扩展组件的类名称 继承 IComponent 类 如

namespace Components;


use Windphp\Component\IComponent;
class MyComponet extends IComponent  {
		
		public function test(){
			echo 'aa';
		}
		
}

About

轻量级,高性能,高效率,安全的php开发框架

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published