包含 vgotfaster 标签的文章

VGOTFASTER 更新数据库操作层

最近一直准备把公司的所有 PHP 环境统一升级到 5.5,目前使用的是 5.2 与 5.3,而现在 5.3 都已经 EOL 了,5.4 性能有较大的提升,5.5 对内存占用上也有很多优化,作为一个互联网公司目前我们在用的版本有点不够与时俱进了,所以升级成了必然。

升级除了 preg_replace() 中 e 修饰符开始弃用以外最主要就是数据库问题了,虽然编译进 mysql 模块仍然可以继续使用原来的 mysql 驱动,但原来的 mysql 驱动官方早就开始声明要废弃,并且在 5.5 中默认是不启用的。

目前有一个项目使用的是我的 vgotfaster 框架,所以就改了改把框架的数据库操作类改使用 mysqli 驱动,由于之前我已经做了一个由 pdo 驱动的类,所以干脆抽了些时间把 pdo 与 mysqli 驱动的数据库全部抽出来成为数据库操作层,并且可以由数据库配置中的 use_pdo_driver 来指定是否使用 PDO 驱动,把 ActiveRecord 类也抽出来统一为共用的类,再把两个驱动的数据库类方法统一。

唯一的问题是 pdo 驱动没有类似于 mysql*_ping() 的方法,在 pdo 中只能写一个不具任何功能的方法,不过除非在 CLI 计划任务中需要长时间运行并且用 mysql*_ping() 来实现保持 MySQL 不超时断开,其它情况都可正常使用。现在可自由通过配置切换驱动,而且用法也完全无需修改程序的其它地方。

这里是下载:[attach=256]

详细的更新日志可以见包内的 changelog.txt 文件

最近大 OSChina 上建了个 git 仓,地址是 http://git.oschina.net/pader/vgotfaster

其实我这个 vgotfaster 框架是借鉴 CI 框架的思路,目的是为了学习学习这种框架的实现并且用在自己的一些项目中,当然仅仅是借鉴了他的结构思想,除了在单例模式的实现上参考过它的代码外,其它的代码基本都是自己写的,个人网站许久不维护了,做的一些其它的东西都落在硬盘的角落里,搞了这么多年 PHP 也就剩下这点东西了

纵观前面的几篇文章,质量真低啊,一直琢磨着把 ideawind 做出来,然后把个人主页做成一个纯粹的博客,到底什么时候会实现?大约在冬季。。

VgotFaster文件上传类

  1. class SYS_Upload {  
  2.  
  3.     var $set = array();  
  4.     var $uploadInfo = array();  
  5.     var $errorCode;  
  6.  
  7.     function __construct($set=array())  
  8.     {  
  9.         $this->set = array(  
  10.             /*  
  11.                 上传文件的表单变量名称  
  12.                 您也可以在执行 doUpload() 方法时传递第一个字符串以临时更改此值,在 doUpload() 中更改不会在下次生效  
  13.             */ 
  14.             'fileVarName' => 'filedata',  
  15.             'uploadTargetPath' => '.',  //上传到的目标文件夹  
  16.             /*  
  17.                 允许上传的文件格式  
  18.                 “*” 或代表允许全部格式,多个格式使用 “|”分割  
  19.                 如: jpg|gif|doc|txt  
  20.             */ 
  21.             'allowExtensions' => '*',  
  22.             /*  
  23.                 遇到重名文件时是否覆盖  
  24.                 为 FALSE 时 VF 将自动在文件名后添加 “_1”的数字并依次类推  
  25.             */ 
  26.             'overwrite' => FALSE,  
  27.             /*  
  28.                 上传后重命名的新名称  
  29.                 选定的文件将被重命名为此设置的名称,为空时则不重命名,并且只有在 encryptName 为 FALSE 时才生效  
  30.             */ 
  31.             'rename' => '',  
  32.             /*  
  33.                 重命名时是否重命名整个文件名  
  34.                 为 FALSE 将保留原后缀,rename项设置了值时此项才有效  
  35.             */ 
  36.             'overwriteExtension' => TRUE,  
  37.             /*  
  38.                 是否自动重命名文件  
  39.                 为 TRUE 时,VF将将该文件重命名为一段随机的字符串并保留原格式,当 overwrite 为 FALSE 时才生效  
  40.             */ 
  41.             'encryptName' => FALSE,  
  42.             'removeSpace' => FALSE  //是否使用下划线替换文件名中的空格  
  43.         );  
  44.           
  45.         $VF =& getInstance();  
  46.           
  47.         if($VF->config->test('upload')) {  
  48.             $config = $VF->config->get('upload');  
  49.             $this->initialize($config);  
  50.         }  
  51.           
  52.         if(count($set) > 0) {  
  53.             $this->initialize($set);  
  54.         }  
  55.     }  
  56.  
  57.     /*  
  58.         初始化上传设置  
  59.         即为修改系统默认设置为上传做准备  
  60.     */ 
  61.     function initialize($set)  
  62.     {  
  63.         foreach($set as $key => $val) {  
  64.             if(isset($this->set[$key])) {  
  65.                 $this->set[$key] = $val;  
  66.             }  
  67.         }  
  68.         $this->set['uploadTargetPath'] = str_replace('\\','/',$this->set['uploadTargetPath']);  
  69.         $this->set['uploadTargetPath'] = rtrim($this->set['uploadTargetPath'],'/');  
  70.     }  
  71.  
  72.     /*  
  73.         执行上传动作  
  74.         [可选]可以传递给 $fileVarNameOrSet 一个字符串为上传文件变量键名,此处 fileVarName 设置不对下次生效  
  75.                     也可以传给 $fileVarNameOrSet 一个初始化的设置数组同等于 initialize() 方法  
  76.         [可选]也可以在传递了第一个 fileVarName 时向第二个参数 $set 传递初始化设置数组  
  77.     */ 
  78.     function doUpload($fileVarNameOrSet='',$set=array())  
  79.     {  
  80.         //得到上传文件变量键名 $fileVarName  
  81.         $fileVarName = $this->set['fileVarName'];  
  82.         if($fileVarNameOrSet) {  
  83.             if(is_array($fileVarNameOrSet)) {  
  84.                 $this->initialize($fileVarNameOrSet);  
  85.                 $fileVarName = $this->set['fileVarName'];  
  86.             } else {  
  87.                 $fileVarName = $fileVarNameOrSet;  
  88.             }  
  89.         }  
  90.           
  91.         if(count($set) > 0) {  
  92.             $this->initialize($set);  
  93.         }  
  94.           
  95.         if(!isset($_FILES[$fileVarName])) {  
  96.             $this->errorCode = 4;  
  97.             return FALSE;  
  98.         }  
  99.           
  100.         $this->uploadInfo = $this->progressUpload($_FILES[$fileVarName]);  
  101.           
  102.         return $this->uploadInfo;  
  103.     }  
  104.       
  105.     /*  
  106.         多文件上传  
  107.         此时第一个参数或配置中 fileVarName 应为上传表单中的变量名,不包括“[]”  
  108.     */ 
  109.     function doMultiUpload($fileVarNameOrSet='',$set=array())  
  110.     {  
  111.         //得到上传文件变量键名 $fileVarName  
  112.         $fileVarName = $this->set['fileVarName'];  
  113.         if($fileVarNameOrSet) {  
  114.             if(is_array($fileVarNameOrSet)) {  
  115.                 $this->initialize($fileVarNameOrSet);  
  116.                 $fileVarName = $this->set['fileVarName'];  
  117.             } else {  
  118.                 $fileVarName = $fileVarNameOrSet;  
  119.             }  
  120.         }  
  121.           
  122.         if(count($set) > 0) {  
  123.             $this->initialize($set);  
  124.         }  
  125.           
  126.         if(!isset($_FILES[$fileVarName])) {  
  127.             $this->errorCode = 4;  
  128.             return FALSE;  
  129.         }  
  130.         $uploads = $_FILES[$fileVarName];  
  131.         $upsInfo = array();  
  132.         $isNoFalse = FALSE;  
  133.         //循环处理上传过程  
  134.         foreach($uploads['name'as $key => $name) {  
  135.             $upload = array();  
  136.             foreach(array('name','type','tmp_name','error','size'as $r) {  
  137.                 $upload[$r] = $uploads[$r][$key];  
  138.             }  
  139.             $upsInfo[$key] = $this->progressUpload($upload,TRUE);  
  140.             if($upsInfo[$key] !== FALSE) $isNoFalse = TRUE;  
  141.         }  
  142.           
  143.         if($isNoFalse) {  
  144.             $this->uploadInfo = $upsInfo;  
  145.             return $this->uploadInfo;  
  146.         } else {  
  147.             $this->errorCode = 4;  
  148.             return FALSE;  
  149.         }  
  150.     }  
  151.       
  152.     /*  
  153.         处理上传的文件,由单文件上传 doUpload() 和多文件上传 doMultiUpload() 调用  
  154.         也可以在控制器中调用等,但并不推荐  
  155.         $mutiple 为预留参数,目前并没有使用  
  156.     */ 
  157.     function progressUpload($upload,$multiple=FALSE)  
  158.     {  
  159.         $upInfo = array();  
  160.       
  161.         $uploadSource = str_replace('\\\\','\\',$upload['tmp_name']);  
  162.  
  163.         if(!is_uploaded_file($uploadSource)) return FALSE;  
  164.           
  165.          if($upload['error'] != 0) {  
  166.             $this->errorCode = $upload['error'];  
  167.             return FALSE;  
  168.         }  
  169.           
  170.         $upInfo['fileType'] = $upload['type'];  
  171.         $upInfo['origName'] = $upload['name'];  
  172.           
  173.         $extension = pathinfo($upload['name'],PATHINFO_EXTENSION);  
  174.         //allowExtensions 选项  
  175.         if(!$this->checkExtension($extension)) {  
  176.             $this->errorCode = 8;  //文件格式不允许  
  177.             return FALSE;  
  178.         }  
  179.         //rename 选项,只对单文件上传有效  
  180.         if(!emptyempty($this->set['rename']) and $this->set['encryptName'] == FALSE) {  
  181.             if($this->set['overwriteExtension']) {  //overwriteExtension  
  182.                 $upload['name'] = $this->set['rename'];  
  183.             } else {  
  184.                 $upload['name'] .= emptyempty($extension) ? '' : '.'.$extension;  
  185.             }  
  186.         }  
  187.         //overwrite 选项  
  188.         $fileUpTarget = $this->set['uploadTargetPath'].'/'.$upload['name'];  
  189.         if($this->set['overwrite'] == FALSE) {  
  190.             $fileUpTarget = $this->getOverwritePath($fileUpTarget);  
  191.         }  
  192.         //removeSpace 选项  
  193.         if($this->set['removeSpace']) {  
  194.             $fileUpTarget = str_replace(' ','_',$fileUpTarget);  
  195.         }  
  196.           
  197.         if(!@move_uploaded_file($uploadSource,$fileUpTarget)) {  
  198.             if($this->errorCode == 0) {  
  199.                 $this->errorCode = 7;  
  200.             }  
  201.             return FALSE;  
  202.         }  
  203.  
  204.         $pathinfo = pathinfo($fileUpTarget);  
  205.           
  206.         $upInfo['fullPath'] = realpath($fileUpTarget);  
  207.         $upInfo['fileName'] = $pathinfo['basename'];  
  208.         $upInfo['fileExt'] = isset($pathinfo['extension']) ? $pathinfo['extension'] : '';  
  209.         $upInfo['fileSize'] = $upload['size'];  
  210.           
  211.         return $upInfo;  
  212.     }  
  213.  
  214.     /*  
  215.         检查文件格式是否允许上传  
  216.     */ 
  217.     private function checkExtension($extension)  
  218.     {  
  219.         if($this->set['allowExtensions'] != '*' and !emptyempty($extension)) {  
  220.             $allowExtensions = explode('|',$this->set['allowExtensions']);  
  221.             $allowExtensions = array_map('trim',$allowExtensions);  
  222.             $extension = strtolower($extension);  
  223.             return in_array($extension,$allowExtensions);  
  224.         }  
  225.         return TRUE;  
  226.     }  
  227.  
  228.     /*  
  229.         在 overwrite 为 FALSE 并且文件有重名时,获取可以使用的文件名  
  230.         自动在后面加数字  
  231.     */ 
  232.     private function getOverwritePath($fileUpTarget)  
  233.     {  
  234.         if(!file_exists($fileUpTargetand !$this->set['encryptName']) {  
  235.             return $fileUpTarget;  
  236.         }  
  237.         $pathinfo = pathinfo($fileUpTarget);  
  238.         $ext = isset($pathinfo['extension']) ? '.'.$pathinfo['extension'] : '';  
  239.         //$fileOrigName = substr($pathinfo['basename'],0,strlen($pathinfo['basename']) - strlen($ext));  
  240.           
  241.         for($i=0;;$i++) {  
  242.             //encryptName 选项  
  243.             $fileName = $this->set['encryptName'] == TRUE ? md5($pathinfo['filename']."_$i") : $pathinfo['filename']."_$i";  
  244.             $fileUpTarget = $pathinfo['dirname'].'/'.$fileName.$ext;  
  245.             if(!file_exists($fileUpTarget)) {  
  246.                 return $fileUpTarget;  
  247.             }  
  248.         }  
  249.     }  
  250.       
  251.     /*  
  252.         显示错误  
  253.     */ 
  254.     function error()  
  255.     {  
  256.         /*  
  257.         UPLOAD_ERR_OK  
  258.         0,没有错误发生,文件上传成功。   
  259.  
  260.         UPLOAD_ERR_INI_SIZE  
  261.         1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。   
  262.  
  263.         UPLOAD_ERR_FORM_SIZE  
  264.         2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。   
  265.  
  266.         UPLOAD_ERR_PARTIAL  
  267.         3,文件只有部分被上传。   
  268.  
  269.         UPLOAD_ERR_NO_FILE  
  270.         4,没有文件被上传。   
  271.  
  272.         UPLOAD_ERR_NO_TMP_DIR  
  273.         6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。   
  274.  
  275.         UPLOAD_ERR_CANT_WRITE  
  276.         7,文件写入失败。PHP 5.1.0 引进。   
  277.         */ 
  278.         switch($this->errorCode)  
  279.         {  
  280.             case 0: return '没有错误发生,文件上传成功。 'break;  
  281.             case 1: return '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。'break;  
  282.             case 2: return '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。'break;  
  283.             case 3: return '文件只有部分被上传。'break;  
  284.             case 4: return '没有文件被上传。'break;  
  285.             case 6: return '找不到临时文件夹。'break;  
  286.             case 7: return '文件写入失败。'break;  
  287.             case 8: return '不允许上传的文件格式。'break;  //custom  
  288.             defaultreturn '未知错误';  
  289.         }  
  290.     }  
  291.  
  292. }  

 

发现一个PHP框架 symfony

今天在浏览合肥一门户网站时发现此站不是生成静态的,一开始以为是用 DedeCMS 之类做的,不过看地址像是某种程序框架,我试在后面随便输了个相对地址,结果出现的no found页面告诉我了这是用一款叫作 symfony 的框架开发的站。Google了下这个框架,貌似不错,值的研究。

PS: 下载下来研究了下,官方只有英文文档,看起来有些困难,感觉有点像国内的 FleaPHP 和 QeePHP,有些数据库间的通信和表格输出不知道怎么的就默名其妙生成了。。看来,以后我还必须得学会这些莫名其妙的东西。我的 VgotFaster 也不能只过于精简,一款飞沫斯的框架还是得莫名其妙的。

VgotFaster 路由转换功能

今天给我的 VgotFaster 框架增加了路由转换功能,特记录一下,写下方法中的核心部分。

下面是路由中的配置:

  1. $routes = array(  
  2.     'readid/(\d+).html' => 'test/route/readid/$1' 
  3. ); 

路由类中转换方法核心部分:

  1. preg_match_all("|^$exp$|",$uri,$export,PREG_SET_ORDER);  
  2.  
  3. if(isset($export[0]) and count($export[0]) > 1) {  
  4.     unset($export[0][0]);  //卸载解释出的原值,preg_match_all [0][0] 为匹配的原值,之后为匹配出的值  
  5.       
  6.     $replace = $replaceTo = array();  
  7.     foreach($export[0] as $key => $replaceVal) {  
  8.         $replace[] = '$'.$key;  //$1  
  9.         $replaceTo[] = $replaceVal;  
  10.     }  
  11.     return $route = str_replace($replace,$replaceTo,$route);  
  12.       

最主要是依靠 preg_match_all 进行正则匹配并且解出其中的值,然后使用 str_replace 对 $1、$2.. 进行替换。

就是这么简单。

VgotFaster 开发,解决所有类库,模型相互间的继承问题

前些日子说到开发的 VgotFaster PHP 框架已经因继承问题拖下N天了,最近仔细研究了 CodeIgniter 的源码,我在想是不是我使用 CI 框架导致思想受 CI 的制约了,为啥非得参考 CI 呢。通过研究 CI 得出了其对于类库和属性在控制器和模型之间的继承方法,然后再经过一翻改进 VgotFaster 在类库,模型,视图,模板引擎和配置里的自动载入完全解决了,现在可以说框架已经成形了,剩下就是各种功能类库和辅助函数的增加以及相关提示的增强啦,这次是真的了。
演示:http://www.vgot.net/new_vgot/
这是用 VgotFaster 制作的站,虽然只用到了模板引擎啦。这个界面也将会是我的新首页,不过有时候我总是会很懒r。。。