关注LAMP|PHP源代码分析|web架构|PHP扩展|Erlang|服务端架构
2010年01月2日Erlang

0 Comments

OTP中supervisor启动过程

 

rabbit_sup模块开始看起:

rabbit_sup模块的start_link是被rabbit app模块的start/2方法所调用的

rabbit.erl文件:

start(normal, []) ->

{ok, SupPid} = rabbit_sup:start_link(),

rabbit_sup.erl文件:

-define(SERVER?MODULE).

start_link() ->

supervisor:start_link({local, ?SERVER}, ?MODULE, []).

这里的?SERVER和?MODULE是一样的值,都为rabbit_sup 。 继续阅读 »

2009年12月31日Erlang

0 Comments

rabbitmq代码摘录(1)

 

诸多erlang应用都是基于erlang现有的一些applicationrabbitmq也不例外,在rabbitmq中,需要的applicationsaslos_monmnesia。而rabbitmq启动这些application(包括其自身)的代码写的相当的巧妙:(源码基于rabbitmq 1.7.0

文件 rabbit.erl

-define(APPS, [os_mon, mnesia, rabbit]).

start() ->

    try

        ok = prepare(),

        ok = rabbit_misc:start_applications(?APPS

    after

        %%give the error loggers some time to catch up

        timer:sleep(100)

    end.

stop() ->

    ok = rabbit_misc:stop_applications(?APPS).

文件 rabbit_misc.erl

manage_applications(IterateDoUndoSkipErrorErrorTagApps) ->

    Iterate(fun (AppAcc) ->

                    case Do(Appof

                        ok -> [App | Acc];

                        {error, {SkipError_}} -> Acc;

                        {error, Reason} ->

                            lists:foreach(UndoAcc),

                            throw({error, {ErrorTagAppReason}})

                    end

            end, [], Apps),

    ok.

start_applications(Apps) ->

    manage_applications(fun lists:foldl/3,

                        fun application:start/1,

                        fun application:stop/1,

                        already_started,

                        cannot_start_application,

                        Apps).

stop_applications(Apps) ->

    manage_applications(fun lists:foldr/3,

                        fun application:stop/1,

                        fun application:start/1,

                        not_started,

                        cannot_stop_application,

                        Apps).

顺序启动或者关闭几个application,在失败的情况下首先判断操作失败的原因,如果是已经启动或者已经停止,则跳过;如果是启动失败或者停止失败,则先依次停止或者启动之前已经操作成功的application,之后抛出异常结束进程。

PHP中Exception性能简单测试及结论

关于是否使用exception风格(个人的说法,也就是非正常的返回值都以抛异常的形式返回)来编码,我产生了一些疑问,经过和同事的一些讨论,我决定做些简单的性能测试。

<?php

/**

 * Exception 简单的性能测试

 * @author Qingliang.Cn  qing.liang.cn@gmail.com

 * @created 2009-11-18 

 * @lastmodified 2009-11-18

 */

define(‘T’1000000);

function no_except($a$b)

{

    if (mt_rand(110) > 0){

        return $a $b;

    }

}

function except($a$b)

{

    try {

        if (mt_rand(110) > 5){ //  0.5的概率抛出异常

            return $a $b;

        }else{

            throw new Exception(1);

        }

    }catch (Exception $e){

        return $e->getMessage();

    }

}

echo "1. with no exception, time is:";

$begin = microtime(true);

for ($i=0$i< T; $i++)

{

    no_except(11);

}

echo microtime(true) - $begin;

echo "\r\n";

echo "2. with exception, time is:";

$begin = microtime(true);

for ($i=0$i< T; $i++)

{

    except(11);

}

echo microtime(true) - $begin;

echo "\r\n";

结果:

100000 (10W)

1. with no exception, time is:3.2554759979248

2. with exception, time is:4.2815051078796

1000000(100W)

1. with no exception, time is:31.89279794693

2. with exception, time is:39.047714948654

上面的测试结果可以看出消耗的时间是相当稳定的,直接的结果是exception比直接return要慢。 

继续分析

抛出异常的概率为0.5,也就是说:50w次的异常处理导致了11秒的性能损失。每次exception处理的消耗大概是 20 微秒,这个消耗是相当的小的。 因为一般情况下,web请求的时间都是ms级别的。

同时这里还有两点需要注意:

1. 没有使用异常的时候,代码中的逻辑判断分值必然会加多,也是一定的消耗。

2. 多数的程序exception命中率不会如上面代码中那么高(50%)。

所以在PHP中应用exception是不需要考虑性能问题的。

如有不同的观点,欢迎拍砖和讨论。 email: qing.liang.cn at gmail.com

2009年10月23日暂未分类

0 Comments

Windows7试用

这几天折腾了一下Windows7,总体的感觉不错。从体验上来说,各方面的设置都和XP类似,即使是有变化也是过渡的非常平稳。唯一感觉不太好的是Windows7的画面感觉不太舒服,看起来非常的累,我的显卡是蓝宝4830的,应该不是卡的问题,舍友安装后也觉得电影的画面看起来有格子的感觉,可能是驱动的问题。

可能是因为我刚换的4核CPU,感觉windows7的操作似乎比xp还要流畅。

2009年08月10日Flex

0 Comments

本地Service browser中调试amfphp注意一则

注意关闭本地web服务器的keepalive功能,否则可能会出现刚刚修改的代码要隔断时间才能失效的问题。目前只在apache环境下发现这个问题。

PHP扩展之自定义全局变量

跟踪了一下PHP$_GET$_POST的产生过程,发现通过zend提供的函数和宏可以很方便注册自己的全局数组。相关的函数和宏:

END_API int zend_register_auto_global(

char *name, //全局数组名

uint name_len,  //数组名称长度- 1

zend_auto_global_callback auto_global_callback TSRMLS_DC //数组初始化回调函数

);

#define ZEND_SET_SYMBOL(symtable, name, var) \

{ \

char *_name = (name); \

\

ZEND_SET_SYMBOL_WITH_LENGTH(symtable, _name, strlen(_name)+1, var, 1, 0); \

}

下面来注册我们的全局变量,假设我们的扩展名为test,我们在MINIT中进行注册操作。

zend_bool ming_global_callback(char *name, uint name_len TSRMLS_DC)

{

        zval *tmp;

        MAKE_STD_ZVAL(tmp);

        array_init(tmp);

        add_next_index_long(tmp,2222);

        ZEND_SET_SYMBOL(&EG(symbol_table), name, tmp);

}

PHP_MINIT_FUNCTION(test)

{

        /* If you have INI entries, uncomment these lines 

        REGISTER_INI_ENTRIES();

        */

        zend_register_auto_global("_MING"sizeof("_MING") - 1, ming_global_callback  TSRMLS_DC);

        return SUCCESS;

}

运行PHP代码 

<?php

var_dump($_MING);

结果:

array(1) {

  [0]=>

  int(2222)

}

xampp下 Pear安装出错Call to undefined method PEAR_Error::set()

简单的解决办法:删除PHP文件夹下的php.ini

PHP源代码分析之HashTable

PHPzval结构体可以看出PHP使用HashTable来保存数组信息,PHP的HashTable使用了一些技巧,这些技巧是PHP高效数组操作的直接原因,源代码在PHP源代码目录的Zend/zend_hash.h  Zend/zend_hash.c 中。先来看看Zend HashTable的定义:

继续阅读 »

Pages: 上一页 1 2 3 4 5 6 7 下一页
返回顶部