PHP微服务框架即Micro Service Framework For PHP

Overview

Micro Service Framework For PHP

PHP微服务框架即“Micro Service Framework For PHP”,是Camera360社区服务器端团队基于Swoole自主研发现代化的PHP协程服务框架,简称msf或者php-msf,是Swoole的工程级企业应用框架,经受了Camera360亿级用户高并发大流量的考验。php-msf由Camera360服务器团队主导研发,会持续更新与维护,也希望有更多优秀的Swoole应用实践开发者加入。php-msf核心设计思想是采用协程、异步、并行的创新技术手段提高系统的单机吞吐能力,降低整体服务器成本。

主要特性

  • 精简版的MVC框架
  • IO密集性业务的单机处理能力提升5-10倍
  • 代码常驻内存
  • 支持对象池
  • 支持Redis连接池、MySQL连接池(异步与同步)
  • 内置Redis Proxy,支持分布式、master-slave集群(故障自动failover与recovery)
  • 内置MySQL Proxy,master-slave集群(读写分离、事务)
  • 支持异步、并行
  • 基于PHP Yield实现协程
  • 内建http/redis/mysql/mongodb/task等协程客户端
  • 纯异步的Http Server
  • RPC Server/Client
  • 支持命令行模式
  • 支持独立进程的定时器
  • 支持独立配置进程
  • 支持sendfile静态文件(需配置root目录)

环境要求

  • Linux,FreeBSD,MacOS(有兼容问题)
  • Linux内核版本2.3.32以上(支持epoll)
  • PHP-7.0及以上版本(生产环境建议使用PHP-7.1)
  • gcc-4.4以上版本
  • swoole-1.9.15及以上版本(暂不支持Swoole-2.0)
  • hiredis-0.13.3
  • yac
  • phpredis
  • composer

文档

框架手册(Gitbook): PHP-MSF开发手册

API Document(Rawgit): 类文档

示例DEMO项目: PHP-MSF DEMO

帮助完善文档: https://github.com/pinguo/php-msf-docs,请提交PR。

交流与反馈

PHP-MSF#1群(QQ): 614054288

快速起步

$>php -r "copy('https://raw.githubusercontent.com/pinguo/php-msf-docker/master/installer.php', 'installer.php');include('installer.php');" && source ~/.bashrc

installer.php会检查运行环境,根据你的自定义配置,自动创建项目模板,composer安装依赖,启动服务。如果cdn.rawgit.com无法访问,可以直接克隆或者下载php-msf-docker,提取installer.php,然后直接运行php installer.php

如果一切顺利,运行到最后你将看到如下的输出:

[2017-09-06 16:08:34] Run composer install success
[2017-09-06 16:08:34] Congratulations, all are installed successfully!
[2017-09-06 16:08:34] You can, visit http://127.0.0.1:8990/Welcome for test
      _______                               ____
________  / /_  ____        ____ ___  _____/ __/
___/ __ \/ __ \/ __ \______/ __ `__ \/ ___/ /_
__/ /_/ / / / / /_/ /_____/ / / / / (__  ) __/
_/ .___/_/ /_/ .___/     /_/ /_/ /_/____/_/
/_/         /_/         Camera360 Open Source TM
[2017-09-06 16:08:34] Swoole  Version: 1.9.18
[2017-09-06 16:08:34] PHP     Version: 7.1.8
[2017-09-06 16:08:34] Application ENV: docker
[2017-09-06 16:08:34] Listen     Addr: 0.0.0.0
[2017-09-06 16:08:34] Listen     Port: 8990

访问测试:

$>curl http://127.0.0.1:8990/Welcome
hello world!

注意端口,如果你不是8990,你需要修改,然后访问测试。

标准应用结构

├── app // PHP业务代码
│   ├── AppServer.php // 应用server类,可根据需求自定义
│   ├── Controllers // 控制器类目录
│   ├── Lib // 特殊逻辑处理类目录
│   ├── Models // Model类目录
│   ├── Route // 特殊路由规则类目录
│   ├── Tasks // Task类目录
│   └── Views // 视图文件目录
├── build.sh // 构建脚本(拉取docker镜像,启动容器)
├── checkstyle.sh // 代码检查脚本
├── composer.json // composer包依赖配置文件
├── config // 配置目录
├── server.php // server启动脚本
├── console.php // 命令行脚本
├── test // 单元测试目录

上述为基于php-msf的标准应用结构,一键安装程序installer.php会自动生成目录,用户可以根据需求创建一些自定义目录,只要符合psr4标准即可自动加载。

服务启动

调试模式

$>./server.php start

Daemon模式

$>./server.php start -d

停止服务

$>./server.php stop

重启服务

$>./server.php restart

Docker

我们制作了Docker镜像,方便Docker用户快速的安装环境,运行PHP-MSF DEMO工程。另外期望在开发环境修改代码实时预览效果,建议使用Docker for Mac/Windows桌面版。

如果是升级Docker,它会自动迁移原有的镜像和容器,请耐心等待,千万不能中途kill掉Docker进程,否则再想迁移就难了。

Docker Registry(阿里云):

  • 公网地址: docker pull registry.cn-hangzhou.aliyuncs.com/pinguo-ops/php-msf-docker:latest
  • 经典内网: docker pull registry-internal.cn-hangzhou.aliyuncs.com/pinguo-ops/php-msf-docker:latest
  • VPC网络: docker pull registry-vpc.cn-hangzhou.aliyuncs.com/pinguo-ops/php-msf-docker:latest
  • DockerHub(国外): docker pull pinguoops/php-msf-docker

框架定位

我们专注打造稳定高性能纯异步基于HTTP的微服务框架,作为nginx+php-fpm的替代技术栈实现架构的微服务化;而Tcp/WebSocket Server将作为插件的形势支持,或者作为其他独立的开源项目。

对于小型团队或者业务系统我们建议还是采用传统的nginx+php-fpm技术栈,对于成本和性能来说没有瓶颈,也就完全没有必要引入全新的技术栈。

对于大中型团队或者业务系统,处在服务治理或者服务化演进的重要阶段,php-msf是可选方案之一。

对于庞大的PHP应用集群,想要大幅节约服务器成本,提升服务性能,php-msf是可选方案之一。

对于聚合服务,比如大型的网站首页,想要通过服务器端聚合内容整合数据,php-msf是可选方案之一。

手工安装

推荐安装方式,通过编辑项目composer.json加入依赖pinguo/php-msf

=3.0.0" }, "minimum-stability": "dev" }">
{
    "require": {
        "pinguo/php-msf": ">=3.0.0"
    },
    "minimum-stability": "dev"
}

"minimum-stability": "dev"这个配置选项必须加上,因为日志组件依赖"monolog/monolog": "2.0.x-dev",并且monolog/monolog无2.0的release包,不过我们在生产环境已经验证其稳定性。

项目原则

稳定

php-msf经受了Camera360社区服务大流量、高并发的洗礼,稳定性得到充分验证。稳定性是我们花了大量时间、精力去解决的最重要问题,是三大原则的最重要原则。

高性能

IO密集性业务的单机处理能力提升5-10倍,这是生产环境中得出的真实数据,如Camera360社区某聚合服务在流量高峰需要40台服务器抗住流量,而采用php-msf重构之后只需要4台相同配置的服务器就可以抗住所有流量。

简单

由于Swoole复杂的进程模型,并且有同步阻塞和异步非阻塞之分,所以在运行相同代码逻辑时,可能在调用方式、传递参数都不一致,从而直线拉高了学习成本,我们为了屏蔽低层的差异,做了大量的工作,实现和传统MVC框架的唯一区别在于添加“yield”关键字。我们参考了Yii2框架的部分代码实践,我们期望无缝的从Yii2开发切换过来。

上述三大原则,是我们在新增特性、功能实现时,投票或者合并代码的依据,任何影响这些原则的PR也将会被拒绝。

关于协程

目前社区有几个PHP开源项目支持协程,它们大多采用Generator+Yield来实现,但是实现的细微差别会导致性能相差甚远,我们应该认识到协程能够以同步的代码书写方式而运行异步逻辑,故协程调度器的性能一定要足够的高,php-msf的协程调度性能是原生异步回调方式的80%,也就是说某个API采用原生异步回调写法QPS为10000,通过php-msf协程调度器调度QPS为8000。

为什么是微服务框架?

目前php-msf还在起步阶段,我们花了大量的时间和精力解决稳定性、高性能、内存问题,因为我们认为“基石”是“万丈高楼”的最基本的保障,只有基础打得牢,才能将“大楼”建设得“更高”。3.0版本是我们开源的起始版本,是我们迈出的重要一步,接下来我们重点会是分布式微服务框架的打磨。

另外,由于基于PHP常驻进程,并直接解析HTTP或者TCP请求,这是服务化最重要的支撑,基于此我们可以做很多原来不敢去实现的想法,总之想像空间很大。

感谢

php-msf最开始基于SwooleDistributed-1.7.x开发,而此次开源版本中,连接池主要采用了SD的实现。由于我们框架定位、解决的业务场景、稳定性的要求、代码风格等差异太大,因此我们决定自主研发微服务框架,每个框架都有自己的特色和优点,选择合适自己公司和业务场景的框架最重要,同时在此也感谢白猫;另外,在研发php-msf框架及生产环境应用过程中,遇到很多底层问题,不过都一一解决,而这些问题能够解决最重要就是Swoole开源项目创始人韩天峰-Rango的大力支持,在此深表感谢。

License

GNU General Public License, version 2 see https://www.gnu.org/licenses/gpl-2.0.html

Comments
  • 要实现在启动时自动加载数据表结构。

    要实现在启动时自动加载数据表结构。

    onWorkerStart
            $poolName = 'master';
            $instnce = getInstance();
            $activePoolName = $poolName;
            $poolName       = MysqlAsynPool::ASYN_NAME . $poolName;
            $pool = $instnce->getAsynPool($poolName);
            if (!$pool) {
                $pool = new MysqlAsynPool($instnce->config, $activePoolName);
                getInstance()->addAsynPool($poolName, $pool, true);
            }
            $tables = yield $pool->go(null, 'show create table config_channel');
            print_r($tables);
    

    没有打印print_r($tables);

    opened by wuchuguang 6
  • 关于对象的生命周期问题?

    关于对象的生命周期问题?

    class Test extens Controller{
         private $server;
         public function __construct($controllerName, $methodName){
                parent::__construct($controllerName, $methodName);
                $this->server = $this->server ?? $this->getObject(Server::class);
         }
    }
    class Server extens Core{
        private $mode;
        public function __construct(){
              $this->model = $this->getObject(MyModel::class);
        }
       public function destroy()
        {
            parent::destroy(); // TODO: Change the autogenerated stub
            $this->model = null;
            echo "destory\n";
        }
        public function __destruct()
        {
            echo "__destruct\n";
        }
    }
    

    多worker时=4, 前4次请求会Test 调用:?? $this->getObject(Server::class);//因为每个worker都会初始一次server 这4次请求是很正常的。 第5次请求时,?? $this->getObject(Server::class);不会调用了。因为private $server被前4次设值了。

    导至Server的__construct不会调用到。 那么为什么前4次明明private $server是非public的,而它的Server实例下的destroy会被调用到。 而且__destruct析构函数也调用了。

    第五次没有?? $this->getObject(Server::class);,那$server中的$model就不会this->getObject(MyModel::class);//那这时的$model一直是null了。。。

    opened by wuchuguang 4
  • 有个小提议。怎么调试db sql语句?

    有个小提议。怎么调试db sql语句?

    Minner.php
    public $debug = false;
    public function debug($debug = true){
        $this->debug = $debug;
        return $this;
    }
    
    public function go($bindId = null, $sql = null)
        {
            if ($sql == null) {
                $sql = $this->getStatement(false);
            }
            if($this->debug){
                writeln($sql);//打印sql
            }
           ..................
    }
    
    opened by wuchuguang 4
  • worker Reload时增加自定义回调机制

    worker Reload时增加自定义回调机制

    swoole_event_add($this->inotifyFd, function ($inotifyFd) use (&$monitorFiles) {
                $events = inotify_read($inotifyFd);
                $flag = true;
                foreach ($events as $ev) {
                    if (pathinfo($ev['name'], PATHINFO_EXTENSION) != 'php') {
                        //创建目录添加监听
                        if ($ev['mask'] == 1073742080) {
                            $path = $monitorFiles[$ev['wd']] .'/'. $ev['name'];
    
                            $wd = inotify_add_watch($inotifyFd, $path, IN_MODIFY | IN_CREATE | IN_IGNORED | IN_DELETE);
                            $monitorFiles[$wd] = $path;
                        }
                        $flag = false;
                        continue;
                    }
                    writeln('RELOAD ' . $monitorFiles[$ev['wd']] .'/'. $ev['name'] . ' update');
                }
                if ($flag == true) {
                    $this->MSFServer->server->reload();
                }
            }, null, SWOOLE_EVENT_READ);
    
    

    改为

    swoole_event_add($this->inotifyFd, function ($inotifyFd) use (&$monitorFiles) {
                $events = inotify_read($inotifyFd);
                $flag = true;
                $changes = [];//record change
                foreach ($events as $ev) {
                    if (pathinfo($ev['name'], PATHINFO_EXTENSION) != 'php') {
                        //创建目录添加监听
                        if ($ev['mask'] == 1073742080) {
                            $path = $monitorFiles[$ev['wd']] .'/'. $ev['name'];
    
                            $wd = inotify_add_watch($inotifyFd, $path, IN_MODIFY | IN_CREATE | IN_IGNORED | IN_DELETE);
                            $monitorFiles[$wd] = $path;
                        }
                        $flag = false;
                        continue;
                    }
                    writeln('RELOAD ' . $monitorFiles[$ev['wd']] .'/'. $ev['name'] . ' update');
                    $changes[$monitorFiles[$ev['wd']] .'/'. $ev['name']] = 'update';
                }
                if ($flag == true) {
                    $callback = $this->config->get('reload.callback');//reload callback
                    if($callback && is_callable($callback)){
                        $callback($changes);//call back
                    }
                    $this->MSFServer->server->reload();
                }
            }, null, SWOOLE_EVENT_READ);
    
    wontfix 
    opened by wuchuguang 2
  • 同步任务返回值错乱 BUG

    同步任务返回值错乱 BUG

    情景:两个同步任务,Demo1阻塞1秒,Demo2阻塞2秒。

    <?php
    /**
     * Demo1
     */
    namespace App\Tasks;
    
    use \PG\MSF\Tasks\Task;
    
    class Demo1 extends Task
    {
        public function test()
        {
            sleep(1);
            return 'Demo1 test';
        }
    }
    
    <?php
    /**
     * DEMO2
     */
    namespace App\Tasks;
    
    use \PG\MSF\Tasks\Task;
    
    class Demo2 extends Task
    {
        public function test()
        {
            sleep(2);
            return 'Demo2 test';
        }
    }
    
    <?php
    /**
     * 控制器调用
     */
    
    namespace App\Controllers;
    
    use PG\MSF\Controllers\Controller;
    
    class Welcome extends Controller
    {
        public function actionDemo1()
        {
            // Demo1任务使用break
            $this->getObject(\App\Tasks\Demo1::class)->test()->break();
            $this->output('demo1 run');
        }
    
        public function actionDemo2()
        {
            // Demo2任务使用yield
            $result = yield $this->getObject(\App\Tasks\Demo2::class)->test();
            $this->output('demo2 run,result:'.$result);
        }
    }
    
    <?php
    // 测试
    $a = file_get_contents("http://192.168.53.10/welcome/demo1");
    $b = file_get_contents("http://192.168.53.10/welcome/demo2");
    echo "demo1:".$a."<br >"."demo2:".$b;
    

    结果: demo1:demo1 run demo2:demo2 run,result:Demo1 test

    demo2任务返回值为Demo1的返回值。

    opened by gvzhang 2
  • 启动服务报错了,server.php中的require_once报错

    启动服务报错了,server.php中的require_once报错

    PHP Fatal error: require_once(): Failed opening required '/usr/local/src/msf/vendor/autoload.php' (include_path='.:/www/server/php/71/lib/php') in /usr/local/src/msf/server.php on line 19

    Fatal error: require_once(): Failed opening required '/usr/local/src/msf/vendor/autoload.php' (include_path='.:/www/server/php/71/lib/php') in /usr/local/src/msf/server.php on line 19

    安装完项目中并没有vendor文件夹啊,需要怎么处理,忘大神们指点~~

    wontfix 
    opened by lvjing0920 1
  • yield 使用临时表时出现问题

    yield 使用临时表时出现问题

    当我使用 yield 创建临时表时,返回结果应该创建成功并且有记录的,但是查询临时表时报错,提示 临时表不存在!

    以下示例代码:

        {
            // 删除临时表
            $db =  yield $this->getMysqlPool('master');
            $tableName = 'tmp_user_info';
    
            $dropSql = 'DROP TABLE IF EXISTS ' . $tableName .';';
    
            yield $db->go(null,$dropSql);
    
            $querySql = "SELECT * FROM user_info WHERE create_at = '1514691308'";
    
            $createTmpTblSql = "CREATE TEMPORARY TABLE  {$tableName}  ({$querySql}) ;";
    
            $res1 = yield $db->go(null,$createTmpTblSql);
    
            dump($res1);
            /* 输出结果
             [
                'client_id' => 0
                'result' => true
                'affected_rows' => 8
                'insert_id' => 0
             ]
             */
    
            $res2 = yield $db->select('*')->from($tableName)->limit(1)->go();
            dump($res2);
            /*
             * [mysql]:Table 'demo_user.tmp_user_info' doesn't exist[sql]:SELECT * FROM tmp_user_info LIMIT 1
             */
            return $res2;
        }`
    opened by nekic 1
  • Call to undefined method swoole_http_response::gzip()

    Call to undefined method swoole_http_response::gzip()

    /Base/Output.php;296:Call to undefined method swoole_http_response::gzip()

    php --ri swoole :报以上错误 swoole

    swoole support => enabled Version => 1.9.23 Author => tianfeng.han[email: [email protected]] epoll => enabled eventfd => enabled timerfd => enabled signalfd => enabled cpu affinity => enabled spinlock => enabled rwlock => enabled async redis client => enabled async http/websocket client => enabled Linux Native AIO => enabled pcre => enabled mutex_timedlock => enabled pthread_barrier => enabled futex => enabled

    Directive => Local Value => Master Value swoole.aio_thread_num => 2 => 2 swoole.display_errors => On => On swoole.use_namespace => Off => Off swoole.fast_serialize => Off => Off swoole.unixsock_buffer_size => 8388608 => 8388608 [root@localhost etc]#

    opened by wuchuguang 1
  • layout加载完文件不继续执行代码的问题

    layout加载完文件不继续执行代码的问题

    views目录结构如下: public ----Header.php ----- Footer.php index ---- Index.php

    Header.php具体内容如下:

    KoolTubeeew666666666 this is a test

    Index.php具体内容如下:

    layout('Public/Header') ?>

    重启server.php后,在浏览器上显示结果如下:

    <title>KoolTubeeew666666666 this is a test</title> 
    

    Index.php中layout下面的内容没执行。

    opened by zhangxuanru 1
  • miner.php bug

    miner.php bug

    $pool = this->getMysqlPool(); $pool->where('name', 100); $pool->from($table); $pool->go();

    必现name = 100问题。因为 name改为group,(group为table表的字段)也会报错。

    opened by wuchuguang 1
  • 类加载重复。

    类加载重复。

    app/Controllers/Lists.php
       use \App\Server\Goods.php
         actionIndex(){
                 this->getObject(Goods.php);//这里会报Goods.php已重复加载。
         }
    
    app/Models/Goods.php
    app/Server/Goods.php
    
    

    default

    opened by wuchuguang 1
  • sendfile一个大文件,会不会导致这个request请求被一直占用着?

    sendfile一个大文件,会不会导致这个request请求被一直占用着?

    protected function outputFile($filename, $headers = [])
        {
            $output = $this->getContext()->getOutput();
            foreach ($headers as $header=>$value){
                $output->setHeader($header, $value);
            }
            $output->response->sendfile($filename);
            $output->__isEnd = true;
        }
    

    $filename有30m,要传1分钟,这一分钟里,会一直占用这条请求资源吗? 如果worker只有4(4个请求资源),那不就没法正常走其它业务了吗?疑问~~

    opened by wuchuguang 1
Releases(3.0.6)
  • 3.0.6(Jun 13, 2018)

  • 3.0.5(Feb 26, 2018)

    • 修复break()方法,协程调度返回值错乱的问题
    • 修复协程异常捕获逻辑漏洞
    • redis cluster random模式不支持eval的bug修复
    • add setnx in redis proxy
    • 异步协程shell_exec
    • 修复yield $cor场景,当$cor抛出异常未能正常捕获的问题
    • 支持Not Found Controller To Default Controller/Action, Http/Client Support All HTTP METHOD
    • 关闭服务onShutdown事件支持
    • 修复Timer进程内存泄露的问题
    • 修复事务sql出错时的bug
    • 移出tidPidTable
    • session support,but only support file adapter now
    • 添加Redis Session支持
    • 修复默认路由的bug(Cannot declare class App\Controllers\Index, because the
    • 支持beanstalkd
    • 日志时间精度提升
    • timer支持多进程模式
    • task日志的写入比例可控
    • 通过配置自定义Input类和Output类
    • 重构GET参数兼容逻辑
    • 修复goConcurrent Get请求的查询参数为string的报错
    • 优化连接池,提供max_conn,max_time,min_conn选项
    • fixed dump array value null
    Source code(tar.gz)
    Source code(zip)
  • 3.0.4(Nov 2, 2017)

    • 增加队列支持,目前支持redis、rabbitMQ、kafka
    • http client 支持keep-alive缓存
    • http client 支持gzip
    • 增加对MySQL字段和表名的转义
    • 路由路径问题修复
    • 修复打印数组的bug,同时去掉只打印100个元素的限制
    • 调整获取ip的顺序,修复负载器后获取ip的bug
    • 模版渲染引擎调整为使用官方
    • 修复RPC重复unpack参数bug
    • 优化协程异常捕获逻辑
    • 修复两处redis的bug
    • 修复 task 构造函数传参问题和mysql删除操作的bug
    • checkRedisProxy新增redis密码授权
    • 修复Post传递Query参数的问题
    • 支持直接在url之后带参数形式的GET请求
    • 修改input:getAllPostGet返回get+post的参数
    Source code(tar.gz)
    Source code(zip)
  • 3.0.3(Sep 25, 2017)

    • 调整processType标识
    • 异步redis set过期时间增加EX标识
    • Timer进程支持多个定时器
    • Timer进程支持协程调度
    • 重构Request ID
    Source code(tar.gz)
    Source code(zip)
  • 3.0.2(Sep 16, 2017)

    • 修复请求链log_id的问题
    • 异常规范、HTTP Access日志
    • Fix Restful bug
    • 规范Task异常时的日志
    • 优化inotify,完美支持文件或者目录的修改、删除、新增
    • 优化MySQL连接池,更简单,更容易使用
    • MySQL Proxy(主从结构、读写分离、支持事务)
    • HTTP SEND FILE 静态文件(支持域名绑定)
    • 完善和优化MySQL同步模式,和异步模式接口一致
    • 新增异步协程毫秒级sleep,功能同php的sleep函数
    Source code(tar.gz)
    Source code(zip)
  • 3.0.1(Sep 8, 2017)

  • 3.0.0(Sep 7, 2017)

    • 调整controller::destroy策略
    • 修复监控端口的问题
    • 修复MSFCli模式的报错
    • 添加Macro::PROCESS_WORKER,Macro::PROCESS_TASKER,Macro::PROCESS_USER进程标识宏
    • TaskProxy兼容用户自定义进程
    • worker exit统计
    • monitor writeln
    • 修复TaskProxy的类名问题
    • 控制台日志优化
    • 调整RestRoute类位置
    • 控制器销毁逻辑策略调整
    • 控制台日志标准优化及修复CLI模式进程无法退出的问题
    • HttpServer dump输出到控制台
    • 调整协程调度器命名
    • uni console output
    • 修复TaskProxy的支持问题
    • 修复HTTP协程请求失败时日志记录失败的问题
    • 调整协程调度器命名
    • 修复Pool::setCurrentObjParent bug
    • 完善RPC
    • 重构RPC
    • 内置Pack打包器
    • 文件头统一
    • add license md
    • 连接池前缀,删除独立进程连接池的支持
    • add CREDITS
    • Server运行状态监控重构
    • 对象池构造方法传参方式修改为数组
    • 销毁对象支持自定义级别(DS_PUBLIC,DS_PROTECTED,DS_PRIVATE)
    • 修复Http协程类型判断的问题
    • 完善连接池
    • MySQL协程实现
    • 统一Tasker进程内的对象加载方式
    • 文件头统一
    • 所有类方法或者函数的参数注释
    • 去掉TCP(专注HTTP)
    • 任何内建对象都可以采用通用对象池创建
    • 所有协程方法使用go关键字作为前缀
    • Controller使用通用对象池加载
    • 统一普通对象、Model、Task的加载
    • 对象池支持构造方法
    • 调用Task方法简化为两步
    • 所有框架内核依赖的成员变量及方法以__打头
    Source code(tar.gz)
    Source code(zip)
Owner
Camera360
Chengdu PinGuo Technology Co., Ltd.
Camera360
[DEPRECATED -- Use Symfony instead] The PHP micro-framework based on the Symfony Components

Silex, a simple Web Framework WARNING: Silex is in maintenance mode only. Ends of life is set to June 2018. Read more on Symfony's blog. Silex is a PH

Silex 3.6k Dec 22, 2022
A resource-oriented micro PHP framework

Bullet Bullet is a resource-oriented micro PHP framework built around HTTP URIs. Bullet takes a unique functional-style approach to URL routing by par

Vance Lucas 415 Dec 27, 2022
Lemon is php micro framework built for simple applications.

Lemon is simple micro framework that provides routing, etc.

Lemon 20 Dec 16, 2022
TidyPHP is a micro php framework to build web applications

TidyPHP is a micro MVC PHP Framework made to understand how PHP Frameworks work behind the scense and build fast and tidy php web applications.

Amin 15 Jul 28, 2022
StackSync is a simple, lightweight and native fullstack PHP mini-framework.

StackSync is a fullstack PHP mini framework, with an MVC structure, custom API system with a Middleware and JWT authentication, components based views, flexible routing, PSR4 autoloading. Essential files generation (migrations, seeders, controllers and models) and other operations can be executed through custom commands.

Khomsi Adam 3 Jul 24, 2022
Frankie - A frankenstein micro-framework for PHP

Frankie - A frankenstein micro-framework for PHP Features Frankie is a micro-framework focused on annotation. The goal is to use annotation in order t

null 19 Dec 10, 2020
ExEngine is an ultra lightweight micro-services framework for PHP 5.6+

ExEngine is an ultra lightweight micro-services framework for PHP 5.6+. Documentation Checkout the Wiki. Examples Click here to browse examples, also

linkfast.io 1 Nov 23, 2020
REST-like PHP micro-framework.

Phprest Description REST-like PHP micro-framework. It's based on the Proton (StackPhp compatible) micro-framework. Phprest gives you only the very bas

Phprest 312 Dec 30, 2022
The Laravel Lumen Framework.

Lumen PHP Framework Laravel Lumen is a stunningly fast PHP micro-framework for building web applications with expressive, elegant syntax. We believe d

The Laravel Framework 7.6k Jan 7, 2023
Slim Framework 4 Skeleton Application

Slim Framework 4 Skeleton Application Use this skeleton application to quickly setup and start working on a new Slim Framework 4 application. This app

Slim Framework 1.5k Dec 29, 2022
🐺 Lightweight and easy to use framework for building web apps.

Wolff Web development made just right. Wolff is a ridiculously small and lightweight PHP framework, intended for those who want to build web applicati

Alejandro 216 Dec 8, 2022
Silly CLI micro-framework based on Symfony Console

currentMenu home Silly CLI micro-framework based on Symfony Console. Professional support for Silly is available via Tidelift Video introduction in fr

Matthieu Napoli 862 Dec 23, 2022
Blink is a micro web framework for building long-running and high performance services

Blink is a micro web framework for building long-running and high performance services, the design heavily inspired by Yii2 and Laravel. Blink aims to provide the most expressive and elegant API and try to make the experience of web development as pleasant as possible.

Jin Hu 837 Dec 18, 2022
Larasymf - mini framework for medium sized projects based on laravel and symfony packages

Larasymf, PHP Framework Larasymf, as its says is a mini framework for medium sized projects based on laravel and symfony packages We have not yet writ

Claude Fassinou 6 Jul 3, 2022
⚡ Flat-files and plain-old PHP functions rockin'on as a set of general purpose high-level abstractions.

Siler is a set of general purpose high-level abstractions aiming an API for declarative programming in PHP. ?? Files and functions as first-class citi

Leo Cavalcante 1.1k Dec 30, 2022
VELOX - The fastest way to build simple websites using PHP!

VELOX The fastest way to build simple websites using PHP! Table of Contents Installation About VELOX Architecture Config Classes Functions Themes Chan

Marwan Al-Soltany 53 Sep 13, 2022
Yet another PHP Microframework.

ρ Yet another PHP Microframework. The premise of this framework is to be backwards-compatible (PHP <= 5.6) with powerful utilities (Like caching and l

null 0 Apr 6, 2022
Tars is a high-performance RPC framework based on name service and Tars protocol, also integrated administration platform, and implemented hosting-service via flexible schedule.

TARS - A Linux Foundation Project TARS Foundation Official Website TARS Project Official Website WeChat Group: TARS01 WeChat Offical Account: TarsClou

THE TARS FOUNDATION PROJECTS 9.6k Jan 1, 2023
A laravel service provider for the netsuite-php library service

netsuite-laravel A PHP supplemental package to the ryanwinchester/netsuite-php package to add the NetSuite service client to the service container of

NetsuitePHP 6 Nov 9, 2022
Damn Vulnerable Web Services is an insecure web application with multiple vulnerable web service components that can be used to learn real world web service vulnerabilities.

Damn Vulnerable Web Services is an insecure web application with multiple vulnerable web service components that can be used to learn real world web service vulnerabilities.

Sam Sanoop 416 Dec 17, 2022