高效稳定、安全易用、线上实时验证的全异步高性能网络库,通过PHP扩展方式使用。

Overview

有赞logo

zanphp logo

高效稳定、安全易用、线上实时验证的全异步高性能网络库,通过PHP扩展方式提供。

遵循Apache协议,基于Swoole 1.8.5版本分支重构研发。

在此特别鸣谢Swoole开发组为PHP开源社区付出的努力和汗水。

License Build Status

Zan做了哪些事儿

  1. 大量模块解耦拆分
  2. 修复大量Bug、逻辑缺陷(内存泄露、释放逻辑)
  3. 内置通用连接池
  4. 支持时间轮算法
  5. 异步接口支持超时
  6. 增强Mysql client安全性(预处理、事务)
  7. Nova协议支持(RPC协议)
  8. 支持平滑重启
  9. 接口单元测试覆盖率100%
  10. 实时、全面的API文档
  11. ...

编译安装步骤

master分支做了较大改动,还在内测阶段,不建议上生产环境,如果要求稳定,可以下载release版本

git clone https://github.com/youzan/zan.git
cd zan-extension
phpize
./configure
make 
make install

建议安装配置项

phpize 
./configure --enable-openssl
make 
make install

Zan编译安装常见问题

  1. 使用async-redis客户端及依赖sockets扩展默认打开,使用ssl功能默认不打开。
    1. 若不想使用async-redis客户端,可在configure时采用选项--disable-async-redis关闭。
    2. 使用async-redis客户端需要安装hiredis库,当前默认已提供x86下linux/mac的hiredis库。若需要支持arm等硬件平台,需要先安装hiredis库,然后在config.m4文件中添加PHP_ADD_LIBRARY(hiredis, 1, ZAN_SHARED_LIBADD)将其编译进ZAN扩展。
    3. 若想使用ssl功能,可在configure时采用选项--enable-openssl开启。
  2. 若执行phpize报xxx/sed: No such file,请重装php或将/usr/bin/sed拷贝到xxx目录下。
  3. 若执行phpize报Cannot find autoconf,请先安装autoconf工具。
  4. 若执行configure时报错libcurl not installed,请重新安转curl库,并保证库与头文件名称与路径正确。
    1. 如库名称与路径/usr/lib/libcurl.so(通常带版本号的libxxx.so.xxx会软连接到libXXX.so供链接器识别),对应头文件路径则为/usr/include/curl。
    2. 确认curl库正确安装后,请务必重新phpize && configure以保证新的配置生效。
    3. 若按1)、2)操作后仍然报错,则可修改config.m4中PHP_CURL的配置路径为你安装curl的路径。
  5. 若执行configure时报错enable sockets support, sockets extension installed incorrectly,请确认PHP版本及sockets扩展正确安装。
    1. PHP版本需要在5.6以上版本。
    2. 在PHP的include路径下应该包含头文件ext/sockets/php_sockets.h。
    3. sockets扩展在zan之前加载(php.ini中的引入加载顺序),以确保能引用符号表信息。
  6. 若执行configure时报错Enable openssl support, require openssl library,请重新安装openssl库并保证能链接正确。
    1. 重新安装openssl库。
    2. 添加openssl库路径供链接器找lib,如将-L/usr/local/opt/openssl/lib补充到config.m4中的LDFLAGS。
    3. 添加openssl库依赖头文件路径,如将-I/usr/local/opt/openssl/include添加到config.m4中的CPPFLAGS。
    4. 依然需要重新配置,按编译扩展步骤安装,见上方。

官方交流渠道

官网:点我进入

Zan 的文档仓库地址:zan-doc

在线查看文档:http://zandoc.zanphp.io

QQ群:115728122

常用链接

捐赠我们

捐赠通道

License

Zan 框架基于 Apache2.0 license 进行开源。

Comments
  • zan compile problem

    zan compile problem

    root1@ubuntu:~/Desktop/zanphp/zan/zan-extension$ php -v PHP 7.0.18-0ubuntu0.16.04.1 (cli) ( NTS ) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies with Zend OPcache v7.0.18-0ubuntu0.16.04.1, Copyright (c) 1999-2017, by Zend Technologies

    root1@ubuntu:~/Desktop/zanphp/zan/zan-extension$ php -m | grep sockets sockets

    root1@ubuntu:~/Desktop/zanphp/zan/zan-extension$ make /bin/bash /home/root1/Desktop/zanphp/zan/zan-extension/libtool --mode=compile cc -I. -I/home/root1/Desktop/zanphp/zan/zan-extension -DPHP_ATOM_INC -I/home/root1/Desktop/zanphp/zan/zan-extension/include -I/home/root1/Desktop/zanphp/zan/zan-extension/main -I/home/root1/Desktop/zanphp/zan/zan-extension -I/usr/include/php/20151012 -I/usr/include/php/20151012/main -I/usr/include/php/20151012/TSRM -I/usr/include/php/20151012/Zend -I/usr/include/php/20151012/ext -I/usr/include/php/20151012/ext/date/lib -I/home/root1/Desktop/zanphp/zan/zan-extension/include -DHAVE_CONFIG_H -std=gnu99 -Wall -pthread -g -O2 -fbounds-check -fstack-check -fstack-protector -fstack-protector-all -fno-strict-aliasing -c /home/root1/Desktop/zanphp/zan/zan-extension/swoole.c -o swoole.lo libtool: compile: cc -I. -I/home/root1/Desktop/zanphp/zan/zan-extension -DPHP_ATOM_INC -I/home/root1/Desktop/zanphp/zan/zan-extension/include -I/home/root1/Desktop/zanphp/zan/zan-extension/main -I/home/root1/Desktop/zanphp/zan/zan-extension -I/usr/include/php/20151012 -I/usr/include/php/20151012/main -I/usr/include/php/20151012/TSRM -I/usr/include/php/20151012/Zend -I/usr/include/php/20151012/ext -I/usr/include/php/20151012/ext/date/lib -I/home/root1/Desktop/zanphp/zan/zan-extension/include -DHAVE_CONFIG_H -std=gnu99 -Wall -pthread -g -O2 -fbounds-check -fstack-check -fstack-protector -fstack-protector-all -fno-strict-aliasing -c /home/root1/Desktop/zanphp/zan/zan-extension/swoole.c -fPIC -DPIC -o .libs/swoole.o In file included from /home/root1/Desktop/zanphp/zan/zan-extension/swoole.c:20:0: /home/root1/Desktop/zanphp/zan/zan-extension/php_swoole.h:140:2: error: #error "Enable sockets support, require sockets extension." #error "Enable sockets support, require sockets extension." ^ Makefile:194: recipe for target 'swoole.lo' failed make: *** [swoole.lo] Error 1

    opened by gouchaoer 8
  • Connpool连接远程mysql主机僵死

    Connpool连接远程mysql主机僵死

    表现

    配置好mysql连接信息(远程公网IP),无论系统发起多个连接状态始终保持全部繁忙,空闲0个

    [2017-07-27 14:00:17 #0] pool_ex info [type=mysql.base_write, all=5, free=0]
    

    已排除服务器访问权限,防火墙问题。 通过测试脚本直接启动 swoole_mysql(), 不经过 连接池 可以连接服务器.

    opened by sukui 5
  • swoole_client自动解包错误.

    swoole_client自动解包错误.

    <?php
              $client = new \swoole_client(SWOOLE_SOCK_TCP,SWOOLE_SOCK_ASYNC);
                $client->set([
                    'open_length_check' => 1,
                    'package_length_type' => 'N',
                    'package_length_offset' => 0,
                    'package_body_offset' => 4,
                ]);
    
    <?php
    //协议
    $str = "test";
    $len = 4+strlen($str);
    $buffer = pack("N",$len).$len;
    

    实际会解包失败。 不知道是否使用方法的问题?

    opened by sukui 3
  • error: unknown type name ‘php_socket’

    error: unknown type name ‘php_socket’

    在编译zan extension 的时候,执行到make这一步的时候出现下面的错误。排查了sockets和openssl都有正确安装。求解答下面大概是什么情况下会造成这种错误。 In file included from /root/temp/zan/zan-extension/swoole.c:20:0: /root/temp/zan/zan-extension/php_swoole.h:452:1: error: unknown type name ‘php_socket’ php_socket *swoole_convert_to_socket(int sock); ^ Makefile:194: recipe for target 'swoole.lo' failed make: *** [swoole.lo] Error 1

    opened by xiaobopang 3
  • 执行make,报错

    执行make,报错

    ubuntu 14.04lts lnmp一键安装包1.3正式版本 php5.4 在执行make,报如下错误 /usr/bin/ld: skipping incompatible /usr/zan/lib/libhiredis_linux.a when searching for -lhiredis_linux /usr/bin/ld: cannot find -lhiredis_linux collect2: error: ld returned 1 exit status make: *** [zan.la] 错误 1

    opened by xiyang2011 3
  • 编译出来的扩展,含有undefined symbol

    编译出来的扩展,含有undefined symbol

    使用master版本4191daf

    编译后的zan.so文件:

    # nm modules/zan.so | grep pack
    00000000002b6a20 d arginfo_is_nova_packet
    00000000002b8de0 d arginfo_swoole_websocket_server_pack
    00000000002b8da0 d arginfo_swoole_websocket_server_unpack
    0000000000045090 T php_swoole_websocket_unpack
    00000000000715e0 T swMqtt_get_package_length
    0000000000071580 T swMqtt_print_package
    0000000000071f30 T swNova_pack
    0000000000071800 T swNova_unpack
    0000000000074f40 T swoole_unpack
    00000000000701b0 T swProtocol_get_package_length
                     U swTaskWorker_large_pack
    0000000000073980 T swWebSocket_get_package_length
    0000000000088330 T zanTaskWorker_largepack
    0000000000056600 T zif_is_nova_packet
    0000000000043750 t zim_swoole_websocket_server_pack
    0000000000045180 t zim_swoole_websocket_server_unpack
    

    里面有一个未定义的符号swTaskWorker_large_pack

    在有的平台下,比如 docker ,加载扩展时会报错:

    PHP Warning:  PHP Startup: Unable to load dynamic library 'modules/zan.so' - Error relocating modules/zan.so: swTaskWorker_large_pack: symbol not found in Unknown on line 0
    

    在有的平台下(Ubuntu 14.04),加载时不会查找所有的符号,但是这个符号仍然是未定义的。加载扩展时不报错,但是在运行时有可能使用这个函数,可能会导致奔溃。

    opened by robberphex 2
  • fix warning: incompatible pointer types passing 'sw_atomic_t *' (aka 'volatile unsigned int *') to parameter of type 'sw_atomic_long_t *' (aka 'volatile unsigned long long *') [-Wincompatible-pointer-types]

    fix warning: incompatible pointer types passing 'sw_atomic_t *' (aka 'volatile unsigned int *') to parameter of type 'sw_atomic_long_t *' (aka 'volatile unsigned long long *') [-Wincompatible-pointer-types]

    warning: incompatible pointer types passing 'sw_atomic_t *' (aka 'volatile unsigned int *') to parameter of type 'sw_atomic_long_t *' (aka 'volatile unsigned long long *') [-Wincompatible-pointer-types]

    opened by springleng 2
  • 代码建议

    代码建议

    1. 文件格式统一用unix,编码统一用utf-8,有些文件是doc格式的;
    2. 缩进使用空格,移除行尾空白,现在空格和tab混用,同一个文件有好几种方式;
    3. 删除没有用的文件,例如:cleanclean.sh重复;
    4. src/core目录下的文件名改成驼峰方式:
    array.c          Array.c
    hashmap.c        HashMap.c
    heap.c           Heap.c
    list.c           List.c
    log.c            Log.c
    rbtree.c         Rbtree.c
    string.c         String.c
    
    opened by kimkit 2
  • macos 10.11.6 PHP Warning:  PHP Startup: Unable to load dynamic library

    macos 10.11.6 PHP Warning: PHP Startup: Unable to load dynamic library

    PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/Cellar/php71/7.1.6_18/lib/php/extensions/no-debug-non-zts-20160303/zan.so' - dlopen(/usr/local/Cellar/php71/7.1.6_18/lib/php/extensions/no-debug-non-zts-20160303/zan.so, 9): Symbol not found: _program_invocation_name Referenced from: /usr/local/Cellar/php71/7.1.6_18/lib/php/extensions/no-debug-non-zts-20160303/zan.so Expected in: flat namespace in /usr/local/Cellar/php71/7.1.6_18/lib/php/extensions/no-debug-non-zts-20160303/zan.so in Unknown on line 0


    gcc -v Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 8.0.0 (clang-800.0.42.1) Target: x86_64-apple-darwin15.6.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin

    opened by nbzx 1
  • use swSignalHander instead of __sighandler_t

    use swSignalHander instead of __sighandler_t

    failed at php:7.0-cli-alpine.

    Dockerfile:

    FROM php:7.0-cli-alpine
    
    RUN apk --no-cache add curl-dev
    RUN docker-php-ext-install sockets
    
    RUN curl -fsSL https://github.com/youzan/zan/archive/master.tar.gz -o zan.tar.gz && \
        mkdir /tmp/zan -p && tar -xf zan.tar.gz -C /tmp/zan --strip-components=1 && rm zan.tar.gz && \
        /usr/local/bin/docker-php-ext-configure /tmp/zan/zan-extension/ --enable-openssl && \
        docker-php-ext-install /tmp/zan/zan-extension/ && \
        rm -rf /tmp/zan/
    

    build log:

    ...
    cc -I. -I/tmp/zan/zan-extension -DPHP_ATOM_INC -I/tmp/zan/zan-extension/include -I/tmp/zan/zan-extension/main -I/tmp/zan/zan-extension -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -I/usr/local/include/php/ext/date/lib -I/tmp/zan/zan-extension/include -fstack-protector-strong -fpic -fpie -O2 -DHAVE_CONFIG_H -Wall -fstack-protector-strong -fpic -fpie -O2 -std=gnu99 -fbounds-check -pthread -fstack-check -fstack-protector -fstack-protector-all -fno-strict-aliasing -c /tmp/zan/zan-extension/src/dns/DNS.c  -fPIC -DPIC -o src/dns/.libs/DNS.o
    /bin/sh /tmp/zan/zan-extension/libtool --mode=compile cc  -I. -I/tmp/zan/zan-extension -DPHP_ATOM_INC -I/tmp/zan/zan-extension/include -I/tmp/zan/zan-extension/main -I/tmp/zan/zan-extension -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -I/usr/local/include/php/ext/date/lib -I/tmp/zan/zan-extension/include  -fstack-protector-strong -fpic -fpie -O2 -DHAVE_CONFIG_H  -Wall -fstack-protector-strong -fpic -fpie -O2 -std=gnu99 -fbounds-check -pthread -fstack-check -fstack-protector -fstack-protector-all -fno-strict-aliasing   -c /tmp/zan/zan-extension/src/signal/Signal.c -o src/signal/Signal.lo 
    mkdir src/signal/.libs
     cc -I. -I/tmp/zan/zan-extension -DPHP_ATOM_INC -I/tmp/zan/zan-extension/include -I/tmp/zan/zan-extension/main -I/tmp/zan/zan-extension -I/usr/local/include/php -I/usr/local/include/php/main -I/usr/local/include/php/TSRM -I/usr/local/include/php/Zend -I/usr/local/include/php/ext -I/usr/local/include/php/ext/date/lib -I/tmp/zan/zan-extension/include -fstack-protector-strong -fpic -fpie -O2 -DHAVE_CONFIG_H -Wall -fstack-protector-strong -fpic -fpie -O2 -std=gnu99 -fbounds-check -pthread -fstack-check -fstack-protector -fstack-protector-all -fno-strict-aliasing -c /tmp/zan/zan-extension/src/signal/Signal.c  -fPIC -DPIC -o src/signal/.libs/Signal.o
    /tmp/zan/zan-extension/src/signal/Signal.c:28:39: error: unknown type name '__sighandler_t'
     static void swSignalfd_set(int signo, __sighandler_t callback);
                                           ^
    /tmp/zan/zan-extension/src/signal/Signal.c: In function 'swSignal_add':
    /tmp/zan/zan-extension/src/signal/Signal.c:104:9: warning: implicit declaration of function 'swSignalfd_set' [-Wimplicit-function-declaration]
             swSignalfd_set(signo, func);
             ^
    /tmp/zan/zan-extension/src/signal/Signal.c: At top level:
    /tmp/zan/zan-extension/src/signal/Signal.c:175:39: error: unknown type name '__sighandler_t'
     static void swSignalfd_set(int signo, __sighandler_t callback)
                                           ^
    Makefile:324: recipe for target 'src/signal/Signal.lo' failed
    make: *** [src/signal/Signal.lo] Error 1
    The command '/bin/sh -c curl -fsSL https://github.com/youzan/zan/archive/master.tar.gz -o zan.tar.gz &&     mkdir /tmp/zan -p && tar -xf zan.tar.gz -C /tmp/zan --strip-components=1 && rm zan.tar.gz &&     /usr/local/bin/docker-php-ext-configure /tmp/zan/zan-extension/ --enable-openssl &&     docker-php-ext-install /tmp/zan/zan-extension/ &&     rm -rf /tmp/zan/' returned a non-zero code: 2
    ...
    

    ref: https://gist.github.com/RobberPhex/26f92750c855e3ec2a39033821894611

    opened by robberphex 0
  • php7.1进程自动重启的时候段错误

    php7.1进程自动重启的时候段错误

    服务器:

    unbuntu 16.04 64
    

    php环境

    PHP 7.1.11 (cli) (built: Oct 30 2017 13:48:02) ( NTS )
    Copyright (c) 1997-2017 The PHP Group
    Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    
    root@iZbp1b4vjfjpq0y9gxwc7nZ:~/zanhttpdemo# php -m
    [PHP Modules]
    bcmath
    Core
    ctype
    curl
    date
    dom
    filter
    ftp
    gd
    gettext
    hash
    iconv
    intl
    json
    libxml
    mbstring
    mcrypt
    mysqli
    mysqlnd
    openssl
    pcntl
    pcre
    PDO
    pdo_mysql
    pdo_sqlite
    Phar
    posix
    Reflection
    session
    shmop
    SimpleXML
    soap
    sockets
    SPL
    sqlite3
    standard
    sysvsem
    tokenizer
    xml
    xmlreader
    xmlrpc
    xmlwriter
    xsl
    zan
    zip
    zlib
    
    [Zend Modules]
    
    

    在官方httpserver Demo 中设置了 进程5秒自动重启到时候.发生段错误

    [2017-10-30 16:51:35 #0] close:workerId->0
    [2017-10-30 16:51:35 #0] worker *0 stopping .....
    [2017-10-30 16:51:35 #0] worker *0 still has 0 requests in progress...
    [2017-10-30 16:51:35 #1] tcp client error [host=127.0.0.1, port=2280]
    [2017-10-30 16:51:35 #1] redis client close [host=127.0.0.1, port=6379]
    [2017-10-30 16:51:35 $2072.0]	ERROR	swManager_check_exit_status: worker#0[pid#2075] abnormal exit, exited=0, status=0, wifsignaled=1, signal=11
    [2017-10-30 16:51:35 #] worker error happening [workerId=0, workerPid=2075, exitCode=0, signalNo=11]...
    [2017-10-30 16:51:35 #] worker *0 still has 0 requests in progress...
    [2017-10-30 16:51:35 #1] mysql connect fail [errno=1045, errmsg=#28000Access denied for user 'root'@'localhost' (using password: YES)] [host=127.0.0.1, port=3306]
    [2017-10-30 16:51:35 #1] mysql connect fail [errno=1045, errmsg=#28000Access denied for user 'root'@'localhost' (using password: YES)] [host=127.0.0.1, port=3306]
    [2017-10-30 16:51:35 #1] mysql client close (0) [host=127.0.0.1, port=3306]
    [2017-10-30 16:51:35 #1] mysql client close (0) [host=127.0.0.1, port=3306]
    [2017-10-30 16:51:35 #0] worker *0 starting .....
    

    后经过重新编译php参数测试发现如果移除了curl 扩展编译参数则没发生段错误.

    opened by sukui 1
  • 提供官方二进制包

    提供官方二进制包

    提供官方二进制包

    背景

    现在在各个系统上都需要进行复杂的编译安装, 相对麻烦, 并且容易打击初学者热情.

    现状

    不存在二进制包

    改进

    可考虑分成几步走

    1. 对于最流行的发行版, Redhat和Debian系的系统, 分别提供 rpm 和 deb 包方便安装.
    2. 对于拥有大量开发者的 macOS 提供 homebrew tap 方便安装
    3. 在1的基础上提供 yum repo 和 apt repo
    4. 在其它潜在系统上接入包管理工具, 例如 ArchLinux 的 AUR 等

    实现

    暂缺

    enhancement 
    opened by vimac 3
Releases(v3.1.0)