存档

2013年6月 的存档

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扩展 标签:

PHP进程信号处理

2013年6月6日 1 条评论

PHP的pcntl扩展提供了信号处理的功能,利用它可以让PHP来接管信号的处理,在开发服务器端守护进程方面,信号处理至关重要。pcntl这个扩展仅在cli/cgi模式下可用。mod_php和php-fpm中不可以使用。PHP在编译的过程中,并没有把pcntl连接到php-cli可执行文件中。

函数原型:

bool pcntl_signal(int $signo ,callback $handler [,bool $restart_syscalls=true])

第一个参数是信号ID,具体可以参见这里http://swoole.sinaapp.com/archives/124

第二个参数是信号发生时回调的PHP函数。

第三个参数是是否restart,是否重新注册此信号。这个参数如果为false,那此信号只注册处理一次。


<?php
//信号处理需要注册ticks才能生效,这里务必注意
//PHP5.4以上版本就不再依赖ticks了
declare(ticks = 1);

function sig_handler($signo)
{
switch ($signo) {
case SIGUSR1:
echo "SIGUSR1\n";
break;
case SIGUSR2:
echo "SIGUSR2\n";
break;
default:
echo "unknow";
break;
}

}

pcntl_signal(SIGUSR1, "sig_handler");
pcntl_signal(SIGUSR2, "sig_handler");

posix_kill(posix_getpid(), SIGUSR1);
posix_kill(posix_getpid(), SIGUSR2);
?>

 

分类: PHP系统编程 标签:

Linux常见信号大全

2013年6月6日 没有评论

 

编号 信号名称 缺省动作 说明
1 SIGHUP 终止 终止控制终端或进程
2 SIGINT 终止 键盘产生的中断(Ctrl-C)
3 SIGQUIT dump 键盘产生的退出
4 SIGILL dump 非法指令
5 SIGTRAP dump debug中断
6 SIGABRT/SIGIOT dump 异常中止
7 SIGBUS/SIGEMT dump 总线异常/EMT指令
8 SIGFPE dump 浮点运算溢出
9 SIGKILL 终止 强制进程终止
10 SIGUSR1 终止 用户信号,进程可自定义用途
11 SIGSEGV dump 非法内存地址引用
12 SIGUSR2 终止 用户信号,进程可自定义用途
13 SIGPIPE 终止 向某个没有读取的管道中写入数据
14 SIGALRM 终止 时钟中断(闹钟)
15 SIGTERM 终止 进程终止
16 SIGSTKFLT 终止 协处理器栈错误
17 SIGCHLD 忽略 子进程退出或中断
18 SIGCONT 继续 如进程停止状态则开始运行
19 SIGSTOP 停止 停止进程运行
20 SIGSTP 停止 键盘产生的停止
21 SIGTTIN 停止 后台进程请求输入
22 SIGTTOU 停止 后台进程请求输出
23 SIGURG 忽略 socket发生紧急情况
24 SIGXCPU dump CPU时间限制被打破
25 SIGXFSZ dump 文件大小限制被打破
26 SIGVTALRM 终止 虚拟定时时钟
27 SIGPROF 终止 profile timer clock
28 SIGWINCH 忽略 窗口尺寸调整
29 SIGIO/SIGPOLL 终止 I/O可用
30 SIGPWR 终止 电源异常
31 SIGSYS/SYSUNUSED dump 系统调用异常

 

分类: Linux 标签: