PHP 开发框架扩展

来源:互联网 发布:克鲁斯卡尔算法 详解 编辑:程序博客网 时间:2024/05/22 06:37

PHP 开发框架扩展

作者:Wucl(1223261610)

时间:2015-03-30

章节内容:基础背景、主要内容、个人心得(这个人非常没品德,想到什么就写什么)。

1. 基础背景:

了解自己专长,总结知识。

2. 主要内容:

1) url伪静态:

目标:做seo(Search Engine Optimization)、统一项目访问入口。

方式:Apachenginx服务里做url重定向。

实现:

第一步:加载Apache(nginx)url重定向模块,去掉LoadModule rewrite_module modules/mod_rewrite.so的注释。

第二步:允许Apache(nginx)进行url重定向,AllowOverride All

第三步:增加Apache(nginx)url重定向规则。

例子:

<IFMODULE mod_rewrite.c>

RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^extract\/[\w\/]*(.html|.htm|.php)?$ extract/index.php [QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^daily\/\w*(.html|.htm|.php)?$ daily/index.php [QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^[\w\/]*(.html|.htm|.php)?$ index.php [QSA,L]

</IFMODULE>

2) 前期定义常量和init设置:

目标:减少冗余,初始化项目特性。

方式:definedini_set

实现:

常量设置:

defined('DS') ? null : define('DS',DIRECTORY_SEPARATOR);

defined('PS') ? null : define('PS',PATH_SEPARATOR);

define("WEB_ROOT",dirname(__FILE__));

define("APP_PATH",WEB_ROOT.DS.'app');

define("LIB_PATH",WEB_ROOT.DS.'vendor');

时区设置:ini_set('date.timezone','PRC')

错误日志:

ini_set('error_reporting', E_ALL);

ini_set('display_errors', 'Off');

ini_set("log_errors", "On");

ini_set('error_log', '/var/log/portal.log');

3) 添加自动装载类:

目标:自动require_once  "PHP文件"

方式:spl_autoload_register

实现:

第一步:建立自动转载类函数

第二步:把函数注册到_autoload栈列

例子:

spl_autoload_register(array($this, 'loadClass'));

public function loadClass($className){

$fileName = '';

$namespace = '';

if (false !== ($lastNsPos = strripos($className, $this->_namespaceSeparator))) {

$namespace = substr($className, 0, $lastNsPos);

$className = substr($className, $lastNsPos + 1);

$fileName = str_replace($this->_namespaceSeparator, DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;

}

$fileName = strtolower($fileName);

$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . $this->_fileExtension;

$file= ($this->_includePath !== null ? $this->_includePath . DIRECTORY_SEPARATOR : '') . $fileName;

$paths = explode(PATH_SEPARATOR,get_include_path());

foreach ($paths as $path) {

$classpath = $path.DS.$file;

if(\is_file($classpath)){

require_once $file;

return ;

}

}

}

4) 开启memcachesession支持:

目标:支持多台服务器和一级域名下多个站点的session共享

方式:使用memcachesession支持

实现:

第一步:设置session id的保存方式以及安全措施

第二步:设置session的作用域为一级域名“**.com

第三步:设置session管理为memcache,设置session值的存取路径

例子:

ini_set('session.name', 'sid');

ini_set('session.use_trans_sid', 0); 

ini_set('session.use_cookies', 1); 

ini_set('session.cookie_path', '/');

$domain = static::getDomainBySub();

ini_set('session.cookie_domain', '.' . $domain); 

ini_set('session.save_handler', 'memcache');

ini_set('session.save_path', '192.168.0.2:11210');

session_start();

5) 建立db链接:

目标:操作数据库,并提高代码重用性

方式:使用pdo

实现:

第一步:建立持久化连接,并保存于静态变量(可使用异常机制解决主从数据库链接问题)。

第二步:封装操作函数,这里需注意预处理操作。

第三步:调用。

例子:由于代码过多,暂时不列出来。

6) 路由匹配和转换:

目标:通过配置来控制url对应执行的代码

方式:正则匹配然后转换,获得对应的PHP文件的目录、PHP文件名称、须执行的方法。

实现:

第一步:获得uri,然后通过正则匹配获取配置数据。

第二步:经过路由核心类转换为执行代码的url

第三步:分解转换后的url获得对应的PHP文件的目录、PHP文件名称、须执行的方法。

第四步:执行程序。

例子:列出路由属性

$routerEntity = new RouterEntity();

$routerEntity->setPath($path);

$routerEntity->setMethod($method);

$routerEntity->setVariables($variables);

$routerEntity->setStaticPrefix($staticPrefix);

$routerEntity->setRegex($regex);

$routerEntity->setTokens($tokens);

$routerEntity->setPathVariables($pathVariables);

$routerEntity->setHostRegex($hostRegex);

$routerEntity->setHostTokens($hostTokens);

$routerEntity->setHostVariables($hostVariables);

return $routerEntity;

7) 获取接口数据:

目标:接收中间件接口数据并解析

方式:curl

实现:

第一步:建立curl链接,预设urlparams参数。

第二步:获取接口数据,解析数据。

第三步:数据传输。

例子:建立连接

$this->_curl = curl_init();

curl_setopt($this->_curl, CURLOPT_HEADER, true);

curl_setopt($this->_curl, CURLOPT_RETURNTRANSFER, '');

curl_setopt($this->_curl, CURLOPT_USERAGENT, '');

curl_setopt($this->_curl, CURLOPT_CONNECTTIMEOUT, '');

curl_setopt($this->_curl, CURLOPT_TIMEOUT, '');

curl_setopt($this->_curl, CURLOPT_HTTPHEADER, ''); 

curl_setopt($this->_curl, CURLOPT_REFERER, '');

curl_setopt($this->_curl, CURLOPT_SSL_VERIFYPEER, '');

if($this->_option['CUSTOMREQUEST']){

curl_setopt($this->_curl, CURLOPT_CUSTOMREQUEST, '';

}

if(strtolower($this->_option['TYPE']) == 'post'){

curl_setopt($this->_curl, CURLOPT_POST, '');

curl_setopt($this->_curl, CURLOPT_URL, '');

curl_setopt($this->_curl, CURLOPT_POSTFIELDS, '');

}else{

curl_setopt($this->_curl, CURLOPT_URL, '');

}

$this->setCurlResult($this->_curl); //未列出

curl_close($this->_curl);

8) 数据redis缓存:

目标:缓存某些数据,加快页面渲染效率,增加用户体验。

方式:使用PHPredis扩展

实现:

第一步:建立redis持久化链接,并存放于当前类的静态变量

第二步:设置redis特性

第三步:操作redis缓存数据,并关闭链接

例子:仅建立连接

private function redisConn(){

$cacheConn = null;

$tryI = 0;

while ( $cacheConn == null && $tryI < 10 ) {

try {

$cacheConn = new Redis ();

$serverSetting = Config::$redis;

if (! $cacheConn->pconnect ( $serverSetting[$this->_serverType]['ip'],  $serverSetting[$this->_serverType]['port'])) {

$this->_serverType = "default";

$cacheConn->pconnect (  $serverSetting[$this->_serverType]['ip'],  $serverSetting[$this->_serverType]['port']);

}

$cacheConn->setOption ( Redis::OPT_SERIALIZER, Redis::SERIALIZER_NONE );

// 选择DB

$redisDB = $serverSetting[$this->_serverType]['redisDb'];

if ($redisDB > 0 && $redisDB <= 16) {

$cacheConn->select ( $redisDB );

} else {

$cacheConn->select ( 0 );

}

} catch ( \Exception $e ) {

sleep ( $tryI * 0.3 );

$tryI ++;

$cacheConn = null;

}

}

return $cacheConn;

}

9) 页面渲染:

目标:快速的渲染页面

方式:使用Blitz

实现:

第一步:确认布局文件和模板文件

第二步:获取布局文件和模板文件的内容,

第三步:解析include字典,然后把注释的内容替代为空

第四步:解析Blitz的字典

第五步:页面渲染

例子:

public function execute(){

$this->getContent();

if (!empty($this->_preBody)) {

try {

$this->_blitz->load($this->_preBody);

} catch (\Exception $e) {

echo $e->getMessage();

}

} else {

echo '加载的文件不存在或为空';

}

if (!empty($this->_option['DATA'])) {

$this->_blitz->set($this->_option['DATA']);

}

if (!empty($this->_option['GLOBALS'])) {

$this->_blitz->setGlobals($this->_option['GLOBALS']);

}

$result = $this->getResult($this->_option['PREFIX']);

$blitzError = $this->_blitz->getError();

$this->_parseBody = $result;

return $this;

}

3. 个人心得:

理解了以上9点内容基本就理解了PHP网站框架的思路。

0 0
原创粉丝点击