Git Product home page Git Product logo

zan's Introduction

有赞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 进行开源。

zan's People

Contributors

bcdevhz avatar goghcrow avatar imaben avatar robberphex avatar springleng avatar xieshren avatar yunnian avatar zhangcunli avatar zxcvdavid 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

zan's Issues

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 扩展编译参数则没发生段错误.

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

swoole_server::stats改进

move to https://github.com/youzan/zan/wiki/swoole_server::stats%E6%94%B9%E8%BF%9B

swoole_server::stats改进

背景

现在的swoole_server::stats提供的数据其实很少,例如worker数量分配不合理时,很难从现有stats提供的数据中分析出原因,实际业务中worker_num或reactor_num很多都是粗略得估算出来的,没有一个有说服力的数据可供参考。所以考虑在当前的stats中做一些扩展,可以直观得看到当前server的运行情况。

现状

现在的stats提供的参数如下:

start_time: server启动时间
connection_num: 当前连接数,在accept时+1,close时-1
accept_count: accept总数
close_count: close总数
tasking_num: 当前正在处理的task总数
request_count: worker已处理请求总数

改进

对stats增加如下数据:

total_worker: 总worker数量
active_worker: 当前活跃的worker数量
idle_worker: 当前空闲的worker数量
max_active_worker: 最大活跃worker数量
total_task_worker: 总task worker数量
active_task_worker: 当前活跃的task worker数量
idle_task_worker: 当前空闲的task worker数量
max_active_task_worker: 最大活跃task worker数量
worker_normal_exit: worker正常退出的次数
worker_abnormal_exit: worker异常退出的次数
task_worker_normal_exit: task worker正常退出的次数
task_worker_abnormal_exit: task worker异常退出的次数
last_reload: 上次reload时间
workers_detail {
	worker_id: {
		start_time: 1500516248, // 启动时间
		total_request_count:10, // 从server启动开始已接受请求总量
		request_count:10, // 从worker启动开始已接受请求总量
		status: "IDLE|BUSY", // worker当前状态,
		type: "worker|task_worker" // worker类型
	},
	worker_id: {
		start_time: 1500516248, // 启动时间
		total_request_count:10, // 从server启动开始已接受请求总量
		request_count:10, // 从worker启动开始已接受请求总量
		status: "IDLE|BUSY", // worker当前状态,
		type: "worker|task_worker" // worker类型
	},
	...
}

从增加的这些数据上就对明确看出当前服务的压力如何,以及是否要调整worker、task_worker的数量。

实现


  • total_worker: 取swServer->worker_num
  • total_task_worker: 取swServerG->task_worker_num

  • active_worker
  • idle_workers
  • max_active_workers
  • active_task_worker
  • idle_task_worker
  • max_active_task_worker

以上值在swProcessPool_worker_loop中处理。


  • worker_normal_exit
  • worker_abnormal_exit
  • task_worker_normal_exit
  • task_worker_abnormal_exit
  • last_reload

以上值在Manager进程中的swManager_loop_sync中处理。


worker_detail:

  • start_time:在manager进程fork worker进程时埋一个点,wait子进程状态改变时再做一次修改
  • request_count:在swServerStats结构体中增加一个workers数组,单独记录.
  • status:swProcessPool_worker_loop中处理
  • type: 直接取swServer->workers中的属性

install zan via pecl/yum/apt-get?

It's inconvenient to compile zan extention in production environment. Of course docker is a selection.
But is zan stable enough to submit to pecl?

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

提供官方二进制包

提供官方二进制包

背景

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

现状

不存在二进制包

改进

可考虑分成几步走

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

实现

暂缺

编译出来的扩展,含有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),加载时不会查找所有的符号,但是这个符号仍然是未定义的。加载扩展时不报错,但是在运行时有可能使用这个函数,可能会导致奔溃。

代码建议

  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

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;

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

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

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(), 不经过 连接池 可以连接服务器.

websocket

有没有 websocket 的功能呀?好像,我看了文档,没找到呀

执行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

当某个worker进程处理了maxRquest个http请求后平滑reload的问题

我们知道swoole/zan有个参数可以控制当http请求次数达到某个值之后,重启该worker以防止内存泄露

今天参加了swoole的线下交流发现这个问题挺严重的,有的厂不敢设置这个maxRequest,因为在协程中达到了maxRequest立即重启的话可能有的

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.