ZPHP是一个极轻的的,定位于后置SOA服务的开发框架.提供高并发,高性能实时通信方案。

Related tags

Frameworks zphp
Overview

ZPHP

ZPHP是一个极轻的的,定位于后置SOA服务的框架,可开发独立高效的长驻服务,并能适应多端的变化。

发起人

维护者

特色

  1. 性能强悍 (大部分api可以在10ms内处理完)
  2. socket, http, rpc 完美融合,自由切换
  3. 通信协议自由扩展
  4. 可配置的自由的view层
  5. 丰富的kv持久存储支持 (ttserver, redis, redis-storage)
  6. 丰富的cache (apc, memcached, redis, xcache, yac)
  7. 队列支持 (beanstalk, redis)
  8. 实时排行榜支持 (redis)
  9. 多进程支持 (pcntl, 类ph-fpm的进程管理 (处理一定的请求之后自动kill,然后master会fork一个新进程))
  10. 多线程支持 (no swoole, need pthreads extension)
  11. composer 安装

demo

相关扩展

*生产环境推荐:

  1. https://github.com/matyhtf/swoole (高性能socket模块) 2)https://github.com/shenzhe/phpredis (redis,用于cache,conn等)

*使用react做socket,需要:

  1. 编译选项加上: --enable-pcntl --enable-sockets
  2. http://pecl.php.net/package/libevent (libevent库)
  3. https://github.com/krakjoe/pthreads (多线程支持,可选)

流程图

点击查看zphp流程图

约定

  • config/example/base.php 里的配置项目是必需的。
  • 当不同模块使用了相同的adapter(如:redis), 如用到不同的host或port,可配置_prefix进行隔离
  • cli模块执行 php 项目目录/webroot/main.php 配置目录名(如:default) 参数(格式:a=b&c=d&e=f)

环境要求

PHP >= 5.4

协议

MIT license

Comments
  • 建议ZPHP\Socket\Callback\Swoole 回调方法中添加 Request:setFd($fd)

    建议ZPHP\Socket\Callback\Swoole 回调方法中添加 Request:setFd($fd)

    因为Request类是静态全局类,如果再swoole 实现类里面 没有显示的设置 Request:setFd ,会导致在实现类里面调用 Request:getFd() 可能取到 上次请求设置的值 ,建议在 接口类中的 回调方法 onConnect,onClose ,如同 onReceive 显示调用 Request:setFd($fd)

    另外根据我的测试,我发现 Request的生命周期是 同work 一致的,此处是否使用 request 对象 更好,不然有可能获取一些莫名的值

    opened by xufei100 3
  • view mode配置,但是会出现运行错误

    view mode配置,但是会出现运行错误

    错误所在文件: zphp / ZPHP / Protocol / Adapter / Http.php

    错误方法 display 源代码:

      public function display($model)
        {
            $viewMode = $this->_view_mode;
            if(is_array($model)) {
                if(!empty($model['_view_mode'])) {
                    $viewMode = $model['_view_mode'];
                    unset($model['_view_mode']);
                } else {
                    if (empty($this->_view_mode)) {
                        $viewMode = Config::getField('project', 'view_mode', '');
                    }
                }
            }
            $this->_view_mode = '';
    
            if(empty($viewMode)) {
                if (ZUtils::isAjax()) {
                    $viewMode = 'Json';
                } else {
                    $viewMode = 'Php';
                }
            }
    
            $view = View\Factory::getInstance($viewMode);
            if ('Php' === $viewMode) {
                if(is_array($model) && !empty($model['_tpl_file'])) {
                    $view->setTpl($model['_tpl_file']);
                    unset($model['_tpl_file']);
                } else if(!empty($this->_tpl_file)){
                    $view->setTpl($this->_tpl_file);
                    $this->_tpl_file = null;
                } else {
                    throw new \Exception("tpl file empty");
                }
            }
            $view->setModel($model);
            return $view->display();
    
        }
    

    如果display方法传入的参数$model不是array类型的话,即使在配置文件里设定了view_mode,也还是会使用php 模板的方式去显示

    opened by luxixing 2
  • 低版本Linux内核和Mac OSX不支持进程重命名

    低版本Linux内核和Mac OSX不支持进程重命名

    低版本Linux内核和Mac OSX不支持进程重命名 PHP Warning: cli_set_process_title(): cli_set_process_title had an error: Not initialized correctly in /data/server/swoole/zphpdemo/demo_composer/vendor/zphp/zphp/ZPHP/Socket/Callback/Swoole.php on line 83

    opened by cenchy 1
  • ZPHP在多线程下模式下运行抛出异常

    ZPHP在多线程下模式下运行抛出异常

    arning: swoole_server::__construct(): PHP can not running at multi-threading. Reset mode to SWOOLE_MODE_BASE in /usr/sr /myapp/vendor/keaixiaou/zphp/ZPHP/Socket/Adapter/Swoole.php on line 43

    opened by ndj888 1
  • HttpServer不能恰当处理数据量大的请求体

    HttpServer不能恰当处理数据量大的请求体

    Socket\Callback\HttpServer 1,YAC保存临时数据有64M限制 , 2,数据全部临时保存在内存不恰当

    public function onReceive() { $params = func_get_args(); $_data = $params[3]; $serv = $params[0]; $fd = $params[1]; $parser = new HttpParser(); $buffer = $this->cache->getBuff($fd); $nparsed = (int) $this->cache->getBuff($fd, 'nparsed'); $buffer .= $_data; $nparsed = $parser->execute($buffer, $nparsed); if($parser->hasError()) { $serv->close($fd, $params[2]); $this->_clearBuff($fd); } elseif ($parser->isFinished()) { $this->_clearBuff($fd); $this->onSend($fd, $this->_getData($parser->getEnvironment())); } else { $buffer = $this->cache->setBuff($fd, $buffer); $nparsed = (int) $this->cache->setBuff($fd, $nparsed, 'nparsed'); } }

    opened by hanyh2004 1
  • ZPHP\Client\Sync\Http的getByUrl()get方式请求bug

    ZPHP\Client\Sync\Http的getByUrl()get方式请求bug

    问题出现场景:SwooleHttp+php5.6 1.当POST方式调用getByUrl()后,再GET方式调用getByUrl(),95%以上概率会以POST方式发送请求,只有5%以GET方式发送,如果只GET方式调用则正确,没有任何问题。

    解决办法: 1.尝试过直接调用ZPHP\Client\Sync\Http::close() 每次再ZPHP\Client\Sync\Http::init(),这个没有解决 2.我查看了下源码,在GET方式请求时,给curl添加curl CURLOPT_HTTPGET 参数即可, 3.添加了reset()方法,其实通过重置curl参数的方法也可以解决。修改的代码见:https://github.com/caojiabin2012/zphp/commit/ecca1f1e91630e776be76af753cb26aa6098451c

    希望帮忙解答: 1.curl默认是GET方式请求,虽然源码里没有加CURLOPT_HTTPGET参数,$ch都是以静态变量定义的,当调用了POST后在调用GET有一定概率是以GET方式请求的,这个是怎么回事呢?

    opened by caojiabin2012 0
  • MessagePack方法一个小bug

    MessagePack方法一个小bug

    public function writeBinary($b, $len=null)
        {
            if(null === $len) {
                $len = strlen($s);
            }
            $this->writeInt($len);
            $this->data .= $b;
            //$this->data .= pack('H*', $b);
        }
    

    strlen($s) 那里应该是$b 吧

    opened by luxixing 0
  • ZPHP/Protocol/Adapter/Http.php 67行

    ZPHP/Protocol/Adapter/Http.php 67行

    display函数的参数,有可能是字符串,当为字符串的时候,unset函数报错? 运行demo的时候出现的 Fatal error: Cannot unset string offsets in /home/wwwroot/lib/ZPHP/Protocol/Adapter/Http.php on line 78

    opened by sandy1890 0
  • zphp的几个问题!

    zphp的几个问题!

    Warning: require(): Permission denied in /git/zphp/ZPHP/View/Adapter/String.php on line 15
    
    Fatal error: Cannot use 'String' as class name as it is reserved in /git/zphp/ZPHP/View/Adapter/String.php on line 15
    string(24) "ZPHP\View\Adapter\String"
    Warning: Unknown: Permission denied in Unknown on line 0
    
    Fatal error: Uncaught Exception: no class ZPHP\View\Adapter\String in /git/zphp/ZPHP/Core/Factory.php:23 Stack trace: #0 /git/zphp/ZPHP/View/Factory.php(20): ZPHP\Core\Factory::getInstance('ZPHP\\View\\Adapt...') #1 /git/zphp/ZPHP/Protocol/Response.php(44): ZPHP\View\Factory::getInstance('String') #2 /git/zphp/ZPHP/ZPHP.php(117): ZPHP\Protocol\Response::display(Array) #3 [internal function]: ZPHP\ZPHP::fatalHandler() #4 {main} thrown in /git/zphp/ZPHP/Core/Factory.php on line 23
    
    Warning: Unknown: failed to open stream: Permission denied in Unknown on line 0
    
    1. views中有Fatal error: Cannot use 'String' as class name as it is reserved in /git/zphp/ZPHP/View/Adapter/String.php on line 15

    2.zphp中require目录有直接权限不允许;我已经设置ZPHP chmod -R 777

    3.PHP7 ; MAC OSX

    opened by wanminny 2
Owner
半桶水
phper,swoole开发者,欢迎订阅公众号:php饭米粒
半桶水