MiniFramework 2.10 已经发布,超轻量级的国产 PHP 框架

MiniFramework 2.10 已经发布,超轻量级的国产 PHP 框架

此版本更新内容包括:

版本变化

  • 新增常量 ERROR_PAGE,默认值为空,用于声明自定义错误页面。
  • 新增支持输出自定义错误页的特性。
  • 新增自定义错误页的示例代码。
  • 新增 Mini\Base\Response 类的 charset() 方法,用于在响应头中自定义字符编码。
  • 新增 Mini\Base\Rest 类的 response() 和 type() 方法,对输出进行统一封装。
  • 调整错误信息输出方式,当启用 REST 模式对 API 接口请求遇到异常时,将以 JSON 格式输出错误信息。
  • 改进 Mini\Base\App 类的 dispatch() 方法,支持传入参数带入 Action 中。
  • 改进 Mini\Base\App 类,增加名为 isApi 属性,用于判断当前请求是否为 REST 接口。
  • 改进 Mini\Base\Action 类的 forward() 方法,支持跳转时传递参数。
  • 改进 Mini\Base\Rest 类,在构造阶段即将默认的 json 方式传递给 Response 对象。
  • 改进 Mini\Base\Exception 类,在 CLI 模式下运行时默认输出错误信息。
  • 改进 Mini\Base\Loader 类,在自动加载过程遇到文件不存在时不主动抛出错误。
  • 改进 Mini\Base\Layout 类的 setLayout() 方法,参数允许留空或传入 null 以清除历史布局设置。
  • 调整 Mini\Base\Layout 类,取消单例模式,改为常规的实例化对象方式。
  • 改进 Mini\Base\Action 类的 forward() 方法,跳转前默认清除历史的布局设置。
  • 改进 Mini\Base\View 类的属性声明方式,以兼容 PHP 7.2 和 7.3 版本。
  • 改进框架默认的报错输出格式,优化阅读体验。
  • 修复 Mini\Cache\File 类的 set() 和 del() 两个方法中写入和删除文件的Bug。
  • 修复配置自定义路由与 CLI 模式运行时出现的路由冲突问题。

升级说明

  • 兼容 PHP 最低版本为 7.2.0,PHP 8.3 已测试可正常运行。
  • 当前版本向前兼容至 2.4.0 版本,使用 2.4.0 及后续版本的开发者可直接升级至 2.10.0 版本。
  • 文档已同步更新,地址:http://www.miniframework.com/docv2/guide/

详情查看:https://gitee.com/jasonwei/miniframework/releases/2.10.0

解决使用 aws-sdk-php 向天翼云对象存储请求 STS 临时凭证报错的问题

本人近期在使用天翼云部署一个 PHP 开发的系统时,在使用 aws-sdk-php 向天翼云对象存储发起STS临时凭证请求时,遇到了如下报错:

Fatal error: Uncaught Aws\Api\Parser\Exception\ParserException: Invalid timestamp value passed to DateTimeResult::fromTimestamp in /data/htdocs/myapp/vendor/aws/aws-sdk-php/src/Api/DateTimeResult.php:100

经过对 aws-sdk-php 源代码进行分析后,决定自己动手进行一些改造,让 aws-sdk-php 兼容天翼云,具体方法如下:

阅读更多

详解用 MiniFramework 框架实现对 GET 或 POST 请求参数进行签名校验的方法

在一些特殊场景下,我们可能希望对于 GET 或 POST 进入到接口的数据进行签名和有效期的校验,例如 APP 请求后端接口的场景,我们通常需要考虑两个问题:

问题1:如何避免攻击者在捕获到接口请求后,自行构造请求参数,向接口发送请求,而不通过 APP 的正常界面进行操作。

问题2:在接口请求不可避免能被捕获的情况下,如何确保每一次请求能够过期,不被反复的利用,例如投票刷票的问题。

基于上面两个问题,我们在设计接口时,就需要通过给请求参数进行签名的方式来对数据来源和有效期进行校验。下面将以 MiniFramework 框架为例,演示如何通过 MiniFramework 框架来实现对请求参数进行签名和签名校验的方法。

阅读更多

MiniFramework 2.9.0 已经发布,超轻量级的 PHP 框架

MiniFramework 2.9.0 已经发布,超轻量级的 PHP 框架

此版本更新内容包括:

版本变化

  • 新增 Mini\Base\Header 类,用于处理 Request 和 Response 的 Header 信息。
  • 新增 Mini\Base\Response 类,用于响应客户端,控制请求结果的输出。
  • 新增 Mini\Base\App::setAction () 方法,用于设置动作。
  • 新增 Mini\Base\App::setController () 方法,用于设置控制器。
  • 新增 Mini\Base\Action::forward () 替代原 _forward () 方法,旧方法暂时保留,新旧两个方法功能完全一致。
  • 新增 Mini\Security\Sign 类的 setEncryptType () 方法,用于指定加密方式。
  • 改进 Controller 和 Action 的设置由 Mini\Base\App 类负责处理。
  • 改进在部分核心类库中用 Mini\Base\Response 替代 Mini\Base\Http 以规范响应输出。
  • 改进并优化框架异常报错的特性。
  • 修复 Action 中使用 $this->_forward () 跳转相同的 Action 时出现死循环的 Bug。
  • 修复 Mini\Base\Http 在被继承的场景中可能出现的实例获取 Bug。
  • 修复全局函数 isTimestamp () 校验时间戳的 Bug。

升级说明

  • 兼容 PHP 最低版本为 7.2.0,PHP 8.0.0 已测试可正常运行。
  • 当前版本向前兼容至 2.4.0 版本,使用 2.4.0 及后续版本的开发者可直接升级至 2.9.0 版本。
  • 文档已同步更新,地址:http://www.miniframework.com/docv2/guide/

详情查看:https://gitee.com/jasonwei/miniframework/releases/2.9.0

PHP 开源框架 MiniFramework 入驻码云 Gitee

MiniFramework 是一款遵循 Apache2 开源协议发布的,支持 MVC 和 RESTful 的超轻量级 PHP 开发框架。MiniFramework 能够帮助开发者用最小的学习成本快速构建 Web 应用,在满足开发者最基础的分层开发、数据库和缓存访问等少量功能基础上,做到尽可能精简,以帮助您的应用基于框架高效运行。

近日,MiniFramework 已经入驻码云 Gitee,在未来的跟新迭代过程中,框架源代码将同时推送到 GitHub 和码云 Gitee 的代码仓库中,两个平台上代码保持同步。

GitHub地址:https://github.com/jasonweicn/miniframework
码云地址:https://gitee.com/jasonwei/miniframework

深入研究 PHP 的 SESSION 阻塞问题

最近在一个基于 Web 的 IM 项目中,我采用异步向服务器发起请求拉取最新的聊天内容,服务器端通过 PHP 处理拉取请求,拉取过程是用 10 次循环查询数据库是否有最新的聊天内容。如发现新内容,则立即向浏览器输出,并结束掉本次请求的进程。在这 10 次的循环中,每次查询数据库后,均通过 Sleep 函数让进程暂停 1 秒,那么这个 PHP 进程可能会在服务器端保持 10 秒。

在测试过程中,我发现当这个拉取请求运行期间,其他向服务器端 PHP 发起的请求,均受到影响,响应变的非常慢。

经过一系列的排查,问题始终得不到解决,但当把代码中涉及到 SESSION 的部分全部跳过时,情况发生了变化,所有 PHP 进程都恢复正常的响应速度了。由此,联想到问题可能出在了 SESSION 阻塞机制上了。

阅读更多

解决 PHP 设置 open_basedir 与 eAccelerator 冲突问题

为 PHP 设置了 open_basedir 后,发现使用 require 和 include 始终会报出下面这样的 Warning 信息:

Warning: require(): open_basedir restriction in effect. File() is not within the allowed path(s)

这个 Warning 信息中,require 和 File 的括号中都是空白没有内容的,经过反复检查代码,确认所引用的路径在 open_basedir 允许的范围内。

通过去国外网站搜索资料,发现是因为 open_basedir 与 eAccelerator 冲突造成的。

需要重新编译一次 eAccelerator,编译时需要带上 –without-eaccelerator-use-inode 参数。

编译完重新启动 php-fpm 并删除之前的 eAccelerator 缓存文件即可。

阳光部落原创,更多内容请访问http://www.sunbloger.com/

PHP 开源框架 MiniFramework 发布 1.1.0 版

MiniFramework 是一款遵循 Apache2 开源协议发布的,支持 MVC 和 RESTful 的超轻量级 PHP 开发框架。MiniFramework 能够帮助开发者用最小的学习成本快速构建 Web 应用,在满足开发者最基础的分层开发、数据库和缓存访问等少量功能基础上,做到尽可能精简,以帮助您的应用基于框架高效运行。

MiniFramework于2018年6月10日发布1.1.0版本,变化有:

* 新增Captcha类,用于生成和校验图片验证码
* 新增Registry类的unset方法,用于删除已注册的变量
* 新增全局函数browserDownload(),用于让浏览器下载文件
* 在App目录中,新增名为Example的控制器,其中包含部分功能的示例代码

MiniFramework 1.1.0 版本下载地址
zip格式:https://github.com/jasonweicn/MiniFramework/archive/1.1.0.zip
tar.gz格式:https://github.com/jasonweicn/MiniFramework/archive/1.1.0.tar.gz

MiniFramework 快速入门文档
地址:http://www.miniframework.com/docv1/guide/

近期版本更新主要变化回顾:

1.0.13

* 改进Db_Mysql中的execTrans方法
* 改进渲染特性
* 新增全局函数isImage(),用于判断文件是否为图像格式
* 新增全局函数getStringLen(),用于获取字符串长度(支持UTF8编码的汉字)

1.0.12

* 新增Session类,用于读写会话数据

1.0.11

* 改进转换伪静态地址分隔符的机制
* 优化路由处理伪静态时的性能
* 优化部分核心类的属性
* 优化框架内存占用

在XAMPP中为PHP安装YAML扩展

YAML 简介

YAML(是 YAML Ain’t Markup Language 的缩写,尾音的发音类似 Camel)是一种序列化数据的语言(类似 JSON 和 XML ),使用轻量高可读性的语法描述 list 和 dict 等数据结构。

在 XAMPP 中安装 YAML 扩展

首先,根据你本地的 PHP 版本,去 http://pecl.php.net/package/yaml/ 下载 dll。

将下载的压缩包解开后,把其中的 php_yaml.dll 拷贝到你的 php 扩展目录下(例如:C:\xampp\php\ext)。并将压缩包中的 yaml.dll 拷贝到你的 XAMPP 根目录下。然后重启 apache,通过 phpinfo() 查看是否安装成功。

阳光部落原创,更多内容请访问http://www.sunbloger.com/

汇总PHP最常见的四种排序算法

PHP最常见的四种排序算法分别是:冒泡排序法,选择排序法、插入排序法和快速排序法。下面我们就分别给出四种排序算法的实现代码,供大家参考。

1.冒泡排序法

<?php
function bubble_sort($array)
{
    $count = count($array);
    if ($count == 0) {
        return false;
    }
    for ($i=0; $i<$count; $i++) {
        for ($k=$count-1; $k>$i; $k--) {
            if ($array[$k] < $array[$k-1]) {
                $tmp = $array[$k];
                $array[$k] = $array[$k-1];
                $array[$k-1] = $tmp;
            }
        }
    }
    return $array;
}

$a = array(2, 5, 1, 3, 4);
$a = bubble_sort($a);
var_dump($a);
?>

 

2.选择排序法

<?php
function select_sort($array)
{
    $len = count($array);
    for($i=0; $i<$len-1; $i++) {
        $p = $i;
        for($j=$i+1; $j<$len; $j++) {
            if($array[$p] > $array[$j]) {
                $p = $j;
            }
        }
        if($p != $i) {
            $tmp = $array[$p];
            $array[$p] = $array[$i];
            $array[$i] = $tmp;
        }
    }
    
    return $array;
}

$a = array(2, 5, 1, 3, 4);
$a = select_sort($a);
var_dump($a);
?>

 

3.插入排序法

<?php
function insert_sort($array)
{
    $len = count($array);
    for($i=1; $i<$len; $i++) {
        $tmp = $array[$i];
        for($j=$i-1; $j>=0; $j--) {
            if($tmp < $array[$j]) {
                $array[$j+1] = $array[$j];
                $array[$j] = $tmp;
            } else {
                break;
            }
        }
    }
    
    return $array;
}

$a = array(2, 5, 1, 3, 4);
$a = insert_sort($a);
var_dump($a);
?>

 

4.快速排序法

<?php
function quick_sort($array)
{
    $len = count($array);
    if ($len <= 1) {
        return $array;
    }
    
    $base = $array[0];
    
    $left = array();
    $right = array();
    for ($i=1; $i<$len; $i++) {
        if($base > $array[$i]) {
            $left[] = $array[$i];
        } else {
            $right[] = $array[$i];
        }
    }
    $left = quick_sort($left);
    $right = quick_sort($right);
    
    return array_merge($left, array($base), $right);
}

$a = array(2, 5, 1, 3, 4);
$a = quick_sort($a);
var_dump($a);
?>

 

阳光部落原创,更多内容请访问http://www.sunbloger.com/