Git Product home page Git Product logo

warriorman's Introduction

序言

WarriorMan是一款php的协程高性能socket扩展,适合对 Workerman 或者 swoole 有一定的了解的同学使用。

WarriorMan是什么

WarriorMan是一个完全用c语言编写的php扩展,仿照 Workerman 制作,解决Workerman的一些短板,为Workerman插上协程的翅膀。

WarriorMan与WorkerMan的不同

缺点

1 WarriorMan没有WorkerMan稳定。
2 WarriorMan扩展是用纯C编写,阅读调试有一定难度。

优点

1 WarriorMan提供协程调度方法,默认的事件回调也是通过协程调度实现,可以在IO操作方面节省大量时间。 2 WarriorMan因为HOOK了PHP TCP Socket 类型的 stream,所以常见的RedisPDOMysqli以及用 PHP 的streams系列函数操作 TCP 连接的操作,都默认支持协程调度,减少了编程复杂度。

3 会逐步提供更多底层方法,为开发者提供更多的灵活度。

WarriorMan适合什么样的人

如果你初次接触socket长连接编程,建议使用 Workerman 框架开发。
如果你的项目业务逻辑很清晰,没有频繁的IO操作,建议使用 Workerman 框架开发。
如果你的项目IO操作很频繁,可以考虑使用WarriorMan
如果你对C语言感兴趣,对协程原理感兴趣,可以考虑使用WarriorMan
如果你是一个热于折腾的人,并且可以主导自己的项目,可以考虑使用WarriorMan
如果你对php扩展开发有经验,请一定尝试使用WarriorMan

压力测试

压力测试
压力测试-数据库

作者希望

作者在这里希望大家可以尝试使用WarriorMan,尝试学习WarriorMan源码,源码中有大量中文注释,这对提升自己编程水平以及更好的理解Workerman和Swoole很有帮助。

环境

PHP7 or Higher

安装

1 首先修改make.sh,将里面路径修改为自己php的路径
2 执行./make.sh
3 最后别忘了将workerman.so添加到php.ini

A tcp server

use Warriorman\Worker;
use Warriorman\Runtime;

Worker::rename(); // 为了防止命名空间冲突
Runtime::enableCoroutine(); // hook相关函数

$worker = new Worker("tcp://0.0.0.0:8080");


$worker->onMessage = function ($connection, $data) {
	$responseStr = "hello world";
	$connection->send($responseStr);
};

Worker::runAll();

文档

WarriorMan:https://www.kancloud.cn/wwwoooshizha/warriorman/content
文档是直接用了WorkerMan和Swoole的部分文档

交流

:>

特别鸣谢

Workerman
Swoole
Study

warriorman's People

Contributors

zyfei avatar

Stargazers

popy32 avatar CallOrRet avatar hello avatar  avatar  avatar  avatar  avatar  avatar  avatar f2h2h1 avatar Charles Shu avatar anhoder avatar Sweeper avatar 大林 avatar  avatar 三石寰宇 avatar Pader avatar dotdotdot avatar 宋洋 avatar  avatar KingsleyJin avatar  avatar Derek avatar  avatar  avatar  avatar sasezaki avatar anyforever avatar  avatar 白云飞 avatar Ben avatar 对影 avatar  avatar  avatar  avatar Jaafar avatar sitfon avatar Yasar Luo avatar  avatar blogdaren avatar  avatar never avatar lionXu avatar storm avatar GHome avatar  avatar jay avatar guanguans avatar elarity avatar wilbur.yu avatar 不为人民服务 avatar zhangboss avatar 零之小落 avatar  avatar  avatar shark99 avatar xiusin avatar ping-xiong avatar  avatar 她和她的猫 avatar chnyang avatar Bostin.wang avatar Sion avatar 老魏 avatar 小阳光 avatar 微醺 avatar  avatar wtf10029 avatar  avatar 拉丁和魔灯 avatar zxin avatar 哈哈 avatar feilong avatar  avatar  avatar singleZhang avatar HUP avatar dmls avatar  avatar lijunlin avatar yangliuan avatar  avatar Tao avatar  avatar walkor avatar mpusher avatar  avatar Borey avatar hkui avatar codinghuang avatar  avatar

Watchers

haoyou xu avatar C John avatar  avatar never avatar  avatar codinghuang avatar  avatar mpusher avatar

warriorman's Issues

未正确维护closures object引用计数导致core dumped

问题描述
协程创建传入的闭包op_array分配在closures object成员属性,当yield后会被以参数释减少引用计数,
resume后closures object已被释放,将高概率性触发core dumped。
协程execute_data分配阶段应该手动对closures增加一次引用计数。

错误bt
Starting program: /usr/local/php7.3/bin/php -dextension=/usr/local/php7.3/lib/php/extensions/debug-non-zts-20180731/workerman.so -f /vagrant/www/tests/coroutine/bug2.php [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". int(0) int(1) int(0) int(1) string(9) "cid_a_end" Program received signal SIGSEGV, Segmentation fault. 0x00000000009cb10c in zend_gc_delref (p=0x40) at /vagrant/www/php-src-win/Zend/zend_types.h:996 996 return --(p->refcount); (gdb) bt #0 0x00000000009cb10c in zend_gc_delref (p=0x40) at /vagrant/www/php-src-win/Zend/zend_types.h:996 #1 0x00000000009d310b in i_free_compiled_variables (execute_data=0x7ffff3e7b030) at /vagrant/www/php-src-win/Zend/zend_execute.c:2361 #2 0x00000000009d6260 in zend_leave_helper_SPEC () at /vagrant/www/php-src-win/Zend/zend_vm_execute.h:641

复现代码
`<php?

use Warriorman\Coroutine;

$cid_a =work(function () {
$b = function () {
$arr = debug_backtrace();
};
for($i=0;$i<=2;$i++){
Coroutine::yield();
$arr =range(1,100002);
$b();
}
var_dump("cid_a_end");
});

$cid_b = work(function () {
$b = function (){
$arr = debug_backtrace();
};
for($i=0;$i<=2;$i++){
Coroutine::yield();
$arr =range(1,100001);
$b();
}
var_dump("cid_b_end");
});

$count = 0 ;
$i= 0;
while ($count<=4){
if($i>1){
$i=0;
}
Coroutine::resume($i==0?$cid_a:$cid_b);
var_dump($i);
$i++;
$count++;
}

if (! defined("RUN_TEST")) {
worker_event_wait();
}`

Channel 类的 isEmpty 方法逻辑错误

//php_channel.c#L148
/**
 * 通道是否为空
 */
PHP_METHOD(workerman_channel, isEmpty) {
	wmChannelObject *chan_t;
	wmChannel *chan;
	chan_t = (wmChannelObject*) wmChannel_fetch_object(Z_OBJ_P(getThis()));
	chan = chan_t->chan;
	int num = wmChannel_num(chan);
	bool is_exist = (num > 0);                 //实际判断的是 channel 非空
	RETURN_BOOL(is_exist);
}

该方法实际逻辑和名字完全相反。

由于 _statisticsFile 处理错误导致使用 status 命令时 coredump

默认状态下 _statisticsFile 路径为 /tmp 加上当前启动文件路径,但是下面代码将启动文件路径开头的 / 修改成了 _,导致状态文件内容写到了 / 目录下:

// src/worker.c line 715
_statisticsFile = wmString_dup("/tmp", 4);
wmString_append(_statisticsFile, _startFile);
for (int i = 4; i < _statisticsFile->length; i++) {     // eg: /tmp/www/worker.php -> /tmp_www_worker.php
	if (_statisticsFile->str[i] == '/') {
		_statisticsFile->str[i] = '_';
	}
}

修改替换字符的起始值后可以正常运行。

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.