存档

‘Swoole扩展’ 分类的存档

在Swoole中调用mysql等函数是否会堵塞?

2013年7月30日 7 条评论

GitHub网友的疑问:

单一的性能 可能会有提高.但是web服务器处理的东西很多啊.
错误啦,日志啦,缓存啦,扩展性啦 这些用php实现有难度啊.
确认这个能运行在 windows 环境下么?
没有使用pcntl ? 试试在脚本里 sleep 5秒,然后再做压测.. 我觉得会崩

解答:

swoole是扩展层实现多进程的,不依赖pcntl。单个进程sleep或致命错误不会影响整个服务器的运行。
swoole不能在windows下运行,支持Linux,freebsd。

Swoole和Node.js不同,swoole是半同步半异步的,处理网络IO的部分是全异步非阻塞的。业务逻辑部分是同步阻塞执行的。所以不存在上述问题。在业务代码中可以按照现有的编码方式来进行开发。当然Swoole也赞成在代码中使用异步回调的方式来做。

分类: Swoole扩展, Swoole框架 标签:

Swoole扩展运行时遇到zend_mm_heap corrupted的问题

2013年6月29日 没有评论

今天在测试新代码时,突然报出一个zend_mm_heap corrupted。经过验证是因为 output_buffering=4096导致的。

关闭此选项或者在命令行执行export USE_ZEND_ALLOC=0后。不再出现。

PHP源代码中的坑还是挺多的。尤其是多线程模式下,有不少内存问题。

另外还遇到一个很奇怪的现象,在线程模式下Swoole C代码可稳定运行。Swoole PHP代码中运行多次后报一个内存错误,使用GDB定位,发现是函数指针错乱了。



#0  0x00000000006bfa8f in ?? ()
(gdb) bt
#0  0x00000000006bfa8f in ?? ()
#1  0x00000000006c1488 in zend_parse_parameters ()
#2  0x00007febb3feccb5 in zim_swoole_client_send (ht=<optimized out>, return_value=0xdfbee0 <executor_globals>,
    return_value_ptr=<optimized out>, this_ptr=0x7febbe3d4a08, return_value_used=<optimized out>)
    at /home/htf/workspace/ext_swoole/swoole.c:764
#3  0x0000000000000003 in ?? ()
#4  0x00007febbe39d290 in ?? ()
#5  0x000000000075ef52 in ?? ()
#6  0x0000000000718857 in execute ()
#7  0x00000000006a9da0 in zend_call_function ()
#8  0x00000000006aa0ee in call_user_function_ex ()
#9  0x00007febb3fed84f in zif_swoole_server_reload (ht=<optimized out>, return_value=0x7febbe3d3348,
    return_value_ptr=<optimized out>, this_ptr=<optimized out>, return_value_used=<optimized out>)
    at /home/htf/workspace/ext_swoole/swoole.c:452
#10 0x00007febbe3d3f70 in ?? ()
#11 0x00007febbe3d1b00 in ?? ()
#12 0x00007febbe3d3b30 in ?? ()
#13 0x00007febbe3d3348 in ?? ()
#14 0x0000000000000000 in ?? ()

目前还没找到原因。

分类: Swoole扩展 标签:

Swoole扩展的3种运行模式

2013年6月28日 没有评论

Swoole支持3种运行的模式

一、Base模式

这种模式就是传统的异步非阻塞Server了。在Reactor线程内直接回调PHP的函数。

这个模式适合业务逻辑简单,并且onReceive中没有读文件、读取数据库、请求网络以及其他阻塞操作的场景。

WebIM、Proxy、TimeServer、Memcached等就可以使用Base模式来运行,简单高效。

在Swoole里还可以开多个线程,实现Multi Reactor,以充分利用多核。

 

二、线程模式

这个就是多线程Worker模式,Reactor线程来处理网络事件轮询,读取数据。得到的请求交给Worker线程去处理。

Swoole提供了可配置的参数,以实现m/n的参数调整。在这种模式下onReceive可以有适度的阻塞操作。多线程模式比进程模式轻量一些,而且线程之间可以共享堆栈和资源。

访问共享内存时会有同步问题,需要使用Swoole提供的锁机制来保护数据。目前已经提供了Mutex、读写锁、文件锁、信号量、自旋锁一共5种锁的实现。

 

三、进程模式

多进程模式是最复杂的方式,用了大量的进程间通信、进程管理机制。适合业务逻辑非常复杂的场景。Swoole提供了完善的进程管理、内存保护机制。

在业务逻辑非常复杂的情况下,也可以长期稳定运行。

 

Swoole在Reactor线程中提供了Buffer的功能,可以应对大量慢速连接和逐字节的恶意客户端。另外也提供了CPU亲和设置选项,使程序运行的效率更好。

分类: Swoole扩展 标签: