Git Product home page Git Product logo

zphp's Introduction

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

zphp's People

Contributors

asdf20122012 avatar betashepherd avatar caojiabin2012 avatar evagle avatar godsoul avatar linkeddestiny avatar micln avatar myxiaoao avatar shenzhe avatar wudi avatar yongchuan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

zphp's Issues

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 吧

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

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

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

一点小问题

ZPHP\Protocol\Adapter\Json
23行判断$data 应该为 $_data

ZPHP\Log\Adapter\File
log方法也有点儿问题;$params未定义;参数$message, array $context = array()却没用上

zphp Zpack 协议改进

我看到在protocl里面的Zpack.php这个,有个对客户端发上来的数据进行组包的过程,然后swoole 1.7.3不是有了open_length_check 这个特性了吗,可以依赖这个特性来进行数据的收发,不用使用PHP自己去实现组包

Http协议解析问题

ZPHP/Protocol/Adapter/Http.php
35行:
$_SERVER['PATH_INFO'] 这儿应该是 swoole_http_request->$server

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

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

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参数的方法也可以解决。修改的代码见:caojiabin2012@ecca1f1

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

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 模板的方式去显示

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');
}
}

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

低版本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

希望zphp增加服务start、stop、restart、reload方法

现在启动服务是:php main.php socket_http
在原来的基础上加个参数,比如加了reload,根据$argv[3]来区分操作,这样就实现了。
希望桶哥个加上,这样我就不用每次都修改ZPHP.php的run方法了,希望采纳。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.