msgbartop
PHP语言, PHP扩展, Zend引擎相关的研究,技术,新闻分享 – 左手代码 右手诗
msgbarbottom

14 Jun 09 深入理解PHP原理之扩展载入过程

why xdebug extension must be loaded as a zend extension?

what is zend extension and what are the differents between regular php extension and zend extension?

let’s start from that the extension loading process.

PHP是可以被扩展的, PHP的核心引擎Zend Engine也是可以被扩展的, 如果你也对Apache Module的编写也有所了解的话, 那么, 你就会对如下的结构很熟悉了:

struct _zend_extension {
        char *name;
        char *version;
        char *author;
        char *URL;
        char *copyright;
        startup_func_t startup;
        shutdown_func_t shutdown;
        activate_func_t activate;
        deactivate_func_t deactivate;
        message_handler_func_t message_handler;
        op_array_handler_func_t op_array_handler;
        statement_handler_func_t statement_handler;
        fcall_begin_handler_func_t fcall_begin_handler;
        fcall_end_handler_func_t fcall_end_handler;
        op_array_ctor_func_t op_array_ctor;
        op_array_dtor_func_t op_array_dtor;
        int (*api_no_check)(int api_no);
        void *reserved2;
        void *reserved3;
        void *reserved4;
        void *reserved5;
        void *reserved6;
        void *reserved7;
        void *reserved8;
        DL_HANDLE handle;
        int resource_number;
};

然后, 让我们对比下PHP extension的module entry:

	struct _zend_module_entry {
		unsigned short size;
		unsigned int zend_api;
		unsigned char zend_debug;
		unsigned char zts;
		struct _zend_ini_entry *ini_entry;
		struct _zend_module_dep *deps;
		char *name;
		struct _zend_function_entry *functions;
		int (*module_startup_func)(INIT_FUNC_ARGS);
		int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS);
		int (*request_startup_func)(INIT_FUNC_ARGS);
		int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS);
		void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS);
		char *version;
		size_t globals_size;
	#ifdef ZTS
		ts_rsrc_id* globals_id_ptr;
	#else
		void* globals_ptr;
	#endif
		void (*globals_ctor)(void *global TSRMLS_DC);
		void (*globals_dtor)(void *global TSRMLS_DC);
		int (*post_deactivate_func)(void);
		int module_started;
		unsigned char type;
		void *handle;
		int module_number;
	};

上面的结构, 可以结合我之前的文章用C/C++扩展你的PHP来帮助理解.

恩,回到主题:既然Xdebug要以Zend Extension方式加载, 那么它必然有基于Zend Extension的需求, 会是什么呢?

恩, 我们知道Xdebug有profile PHP的功能, 对, 就是statement_handler:
the statement handler callback inserts an additional opcode at the end of every statement in a script in which the callback is called. One of the primary uses for this sort of callback is to implement per-line profiling, stepping debuggers, or code-coverage utilities.

并且,因为Xdebug也提供了给用户脚本使用的函数, 所以, 它也会有部分PHP extension的实现, 并且由于它要以ZendExt方式载入的原因,所以它必须自己实现本身PHPExt部分的载入过程.

最后, 将PHP Extension的载入过程罗列如下(我会慢慢加上注释), 当然, 如果你等不及想知道, 也欢迎你直接在我的博客风雪之隅留言探讨.

以apache/mod_php5.c为例

1. 在mod_php5.c中,定义了Apache模块结构:

	module MODULE_VAR_EXPORT php5_module =
	{
		STANDARD_MODULE_STUFF,
		php_init_handler,           /* initializer */
		php_create_dir,             /* per-directory config creator */
		php_merge_dir,              /* dir merger */
		NULL,                       /* per-server config creator */
		NULL,                       /* merge server config */
		php_commands,               /* command table */
		php_handlers,               /* handlers */
		NULL,                       /* filename translation */
		NULL,                       /* check_user_id */
		NULL,                       /* check auth */
		NULL,                       /* check access */
		NULL,                       /* type_checker */
		NULL,                       /* fixups */
		NULL                        /* logger */
	#if MODULE_MAGIC_NUMBER >= 19970103
		, NULL                      /* header parser */
	#endif
	#if MODULE_MAGIC_NUMBER >= 19970719
		, NULL                      /* child_init */
	#endif
	#if MODULE_MAGIC_NUMBER >= 19970728
		, php_child_exit_handler        /* child_exit */
	#endif
	#if MODULE_MAGIC_NUMBER >= 19970902
		, NULL                      /* post read-request */
	#endif
	};
/* }}} */

可见, 最开始被调用的将会是php_init_handler,

static void php_init_handler(server_rec *s, pool *p)
{
    register_cleanup(p, NULL, (void (*)(void *))apache_php_module_shutdown_wrapper, (void (*)(void *))php_module_shutdown_for_exec);
    if (!apache_php_initialized) {
        apache_php_initialized = 1;
#ifdef ZTS
        tsrm_startup(1, 1, 0, NULL);
#endif
        sapi_startup(&apache_sapi_module);
        php_apache_startup(&apache_sapi_module);
    }
#if MODULE_MAGIC_NUMBER >= 19980527
    {
        TSRMLS_FETCH();
        if (PG(expose_php)) {
            ap_add_version_component("PHP/" PHP_VERSION);
        }
    }
#endif
}

这里, 调用了sapi_startup, 这部分是初始化php的apache sapi,
然后是调用,php_apache_startup:

static int php_apache_startup(sapi_module_struct *sapi_module)
{
    if (php_module_startup(sapi_module, &apache_module_entry, 1) == FAILURE) {
        return FAILURE;
    } else {
        return SUCCESS;
    }
}

这个时候,调用了php_module_startup, 其中有:

/* this will read in php.ini, set up the configuration parameters,
       load zend extensions and register php function extensions
       to be loaded later */
    if (php_init_config(TSRMLS_C) == FAILURE) {
        return FAILURE;
    }

调用了php_init_config, 这部分读取所有的php.ini和关联的ini文件, 然后对于每一条配置指令调用:

	....
 if (sapi_module.ini_entries) {
        zend_parse_ini_string(sapi_module.ini_entries, 1, php_config_ini_parser_cb, &extension_lists);
    }
然后在php_config_ini_parser_cb中:
               if (!strcasecmp(Z_STRVAL_P(arg1), "extension")) { /* load function module */
                    zval copy;

                    copy = *arg2;
                    zval_copy_ctor(&copy);
                    copy.refcount = 0;
                    zend_llist_add_element(&extension_lists.functions, &copy);
                } else if (!strcasecmp(Z_STRVAL_P(arg1), ZEND_EXTENSION_TOKEN)) { /* load Zend extension */
                    char *extension_name = estrndup(Z_STRVAL_P(arg2), Z_STRLEN_P(arg2));

                    zend_llist_add_element(&extension_lists.engine, &extension_name);
                } else {
                    zend_hash_update(&configuration_hash, Z_STRVAL_P(arg1), Z_STRLEN_P(arg1) + 1, arg2, sizeof(zval), (void **) &entry);
                    Z_STRVAL_P(entry) = zend_strndup(Z_STRVAL_P(entry), Z_STRLEN_P(entry));
                }

这里记录下来所有要载入的php extension和zend extension,
然后, 让我们回到php_module_startup, 后面有调用到了
php_ini_register_extensions(TSRMLS_C);

void php_ini_register_extensions(TSRMLS_D)
{
    zend_llist_apply(&extension_lists.engine, php_load_zend_extension_cb TSRMLS_CC);
    zend_llist_apply(&extension_lists.functions, php_load_function_extension_cb TSRMLS_CC);

    zend_llist_destroy(&extension_lists.engine);
    zend_llist_destroy(&extension_lists.functions);
}

我们可以看到, 对于每一个扩展记录, 都调用了一个回叫函数, 我们这里只看php_load_function_extension_cb:

static void php_load_function_extension_cb(void *arg TSRMLS_DC)
{
    zval *extension = (zval *) arg;
    zval zval;

    php_dl(extension, MODULE_PERSISTENT, &zval, 0 TSRMLS_CC);
}

最后, 就是核心的载入逻辑了:

void php_dl(zval *file, int type, zval *return_value, int start_now TSRMLS_DC)
{
        void *handle;
        char *libpath;
        zend_module_entry *module_entry;
        zend_module_entry *(*get_module)(void);
        int error_type;
        char *extension_dir;

        if (type == MODULE_PERSISTENT) {
                extension_dir = INI_STR("extension_dir");
        } else {
                extension_dir = PG(extension_dir);
        }

        if (type == MODULE_TEMPORARY) {
                error_type = E_WARNING;
        } else {
                error_type = E_CORE_WARNING;
        }

        if (extension_dir && extension_dir[0]){
                int extension_dir_len = strlen(extension_dir);

                if (type == MODULE_TEMPORARY) {
                        if (strchr(Z_STRVAL_P(file), '/') != NULL || strchr(Z_STRVAL_P(file), DEFAULT_SLASH) != NULL) {
                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Temporary module name should contain only filename");
                                RETURN_FALSE;
                        }
                }

                if (IS_SLASH(extension_dir[extension_dir_len-1])) {
                        spprintf(&libpath, 0, "%s%s", extension_dir, Z_STRVAL_P(file));
                } else {
                        spprintf(&libpath, 0, "%s%c%s", extension_dir, DEFAULT_SLASH, Z_STRVAL_P(file));
                }
        } else {
                libpath = estrndup(Z_STRVAL_P(file), Z_STRLEN_P(file));
        }

        /* load dynamic symbol */
        handle = DL_LOAD(libpath);
        if (!handle) {
                php_error_docref(NULL TSRMLS_CC, error_type, "Unable to load dynamic library '%s' - %s", libpath, GET_DL_ERROR());
                GET_DL_ERROR(); /* free the buffer storing the error */
                efree(libpath);
                RETURN_FALSE;
        }

        efree(libpath);

        get_module = (zend_module_entry *(*)(void)) DL_FETCH_SYMBOL(handle, "get_module");

        /*
         * some OS prepend _ to symbol names while their dynamic linker
         * does not do that automatically. Thus we check manually for
         * _get_module.
         */

        if (!get_module)
                get_module = (zend_module_entry *(*)(void)) DL_FETCH_SYMBOL(handle, "_get_module");

        if (!get_module) {
                DL_UNLOAD(handle);
                php_error_docref(NULL TSRMLS_CC, error_type, "Invalid library (maybe not a PHP library) '%s' ", Z_STRVAL_P(file));
                RETURN_FALSE;
        }
        module_entry = get_module();
        if ((module_entry->zend_debug != ZEND_DEBUG) || (module_entry->zts != USING_ZTS)
                || (module_entry->zend_api != ZEND_MODULE_API_NO)) {
                /* Check for pre-4.1.0 module which has a slightly different module_entry structure :(  */
                        struct pre_4_1_0_module_entry {
                                  char *name;
                                  zend_function_entry *functions;
                                  int (*module_startup_func)(INIT_FUNC_ARGS);
                                  int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS);
                                  int (*request_startup_func)(INIT_FUNC_ARGS);
                                  int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS);
                                  void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS);
                                  int (*global_startup_func)(void);
                                  int (*global_shutdown_func)(void);
                                  int globals_id;
                                  int module_started;
                                  unsigned char type;
                                  void *handle;
                                  int module_number;
                                  unsigned char zend_debug;
                                  unsigned char zts;
                                  unsigned int zend_api;
                        };

                        char *name;
                        int zend_api;
                        unsigned char zend_debug, zts;

                        if ((((struct pre_4_1_0_module_entry *)module_entry)->zend_api > 20000000) &&
                                (((struct pre_4_1_0_module_entry *)module_entry)->zend_api < 20010901)
                        ) {
                                name       = ((struct pre_4_1_0_module_entry *)module_entry)->name;
                                zend_api   = ((struct pre_4_1_0_module_entry *)module_entry)->zend_api;
                                zend_debug = ((struct pre_4_1_0_module_entry *)module_entry)->zend_debug;
                                zts        = ((struct pre_4_1_0_module_entry *)module_entry)->zts;
                        } else {
                                name       = module_entry->name;
                                zend_api   = module_entry->zend_api;
                                zend_debug = module_entry->zend_debug;
                                zts        = module_entry->zts;
                        }

                        php_error_docref(NULL TSRMLS_CC, error_type,
                                          "%s: Unable to initialize module\n"
                                          "Module compiled with module API=%d, debug=%d, thread-safety=%d\n"
                                          "PHP    compiled with module API=%d, debug=%d, thread-safety=%d\n"
                                          "These options need to match\n",
                                          name, zend_api, zend_debug, zts,
                                          ZEND_MODULE_API_NO, ZEND_DEBUG, USING_ZTS);
                        DL_UNLOAD(handle);
                        RETURN_FALSE;
        }
        module_entry->type = type;
        module_entry->module_number = zend_next_free_module();
        module_entry->handle = handle;

        if ((module_entry = zend_register_module_ex(module_entry TSRMLS_CC)) == NULL) {
                DL_UNLOAD(handle);
                RETURN_FALSE;
        }

        if ((type == MODULE_TEMPORARY || start_now) && zend_startup_module_ex(module_entry TSRMLS_CC) == FAILURE) {
                DL_UNLOAD(handle);
                RETURN_FALSE;
        }

        if ((type == MODULE_TEMPORARY || start_now) && module_entry->request_startup_func) {
                if (module_entry->request_startup_func(type, module_entry->module_number TSRMLS_CC) == FAILURE) {
                        php_error_docref(NULL TSRMLS_CC, error_type, "Unable to initialize module '%s'", module_entry->name);
                        DL_UNLOAD(handle);
                        RETURN_FALSE;
                }
        }
        RETURN_TRUE;
}


分享到:



Related Posts:

Tags: ,

98 Responses to “深入理解PHP原理之扩展载入过程”

  1. Callie |

    Hallo! Jemahd in meinem Myspace Webseite mit uns soo zu geben ihm einen Blick
    kam ich. Icch bin definitiv genießen Informationen. Ichh binn Buch-Kennzeichnung und mein Nachfolger werden twerting this!

    Ausstehrnde undd grandiksen design.

  2. mersin temizlik şirketleri |

    good hh

  3. AngelinaRQ |

    VIZI.com.ua

  4. JeffreyMn |

    Online Casino On Net – Black Jack Ballroom, Online Casino Rewards.

  5. Robertel |

    kredit 9000 euro – onlinesofortkredite.org – kredit von 1000 euro, 5000 euro kredit trotz schufa.

  6. Charlesneus |

    cvv dumps – cc dumps shop, dumps cc.

  7. MichaelTage |

    cc shop – dumps shop, dumps shop.

  8. HectorPulk |

    credit card dumps – dumps sites, dumps shop.

  9. KennethMi |

    canadian rx – canadian pharmacy, canadian rx online.

  10. MarcusKa |

    Game of Thrones 15 lines bonus slot BlackJack Ballroom online casino – Alley Cats bonus slot machine BlackJack Ballroom

  11. Robertosaic |

    суть счастья – книги саморазвитие онлайн, эзотерика онлайн бесплатно.

  12. read ds |

    http://your-porn-tube.com

  13. Cristal |

    J’ai vu quelques-uns des plus stupides, les réponses inutiles ici. Certains sont simplement comique, mais certains pourraient vraiment être dangereux ou causer des dommages à la propriété ou la perte d’argent ou de temps tout simplement gaspillée. Le problème, bien sûr, est que les geeks de Yahoo ont ce jeu à venir en haut dans les recherches web propageant ces réponses stupides sur une zone plus large ..

  14. GregorySt |

    irresistible website View site

  15. Taylorvala |

    lucky web site xxx-tube-videos.com

  16. StephenEi |

    good-neighbourly resource lovexhamster.com

  17. Timothyka |

    useful website View site

  18. MichaelPate |

    buy cvv – credit card dumps track 2, cvv shop online.

  19. DanielOn |

    track 1 track 2 dumps – buy dumps, dumps shop online.

  20. tony |

    ha

  21. FrancisSa |

    flawless resource goindianporn.com

  22. FreddyPag |

    first class web site Click here

  23. Dwaynetiz |

    курсы английского языка алматы отзывы – курсы английского языка +для начинающих алматы, интенсивный курс английского алматы.

  24. dan florea |

    super escort girls http://elitescort.co.com

  25. Azra |

    very nice web

  26. Roberthem |

    select web site http://pornmovie43.com/

  27. Efrainkat |

    fancy website http://xnxxnxvideos.com/

  28. florea |

    the best girls from istanbu

    http://www.bayanescort.co.com

  29. RobertWak |

    Comment Telecharger video Facebook – Facebook Video herunterladen, Como Baixar Videos Facebook.

  30. Williepam |

    http://planearium.de/gb/go.php?url=http://www.yoyoglasses.com/?url=www.oakley.com/?p=693
    oakley desert boots, fancifully oligarch unproductively nitric lags sequent verifiability pinnal anergy superseding whereunder mamma usually ultracentrifuge skeans

  31. online slot malaysia |

    You actually make it seem so easy with your presentation but I find this matter to be really something that I think I would never understand.
    It seems too complex and very broad for me. I’m looking forward for your next post, I will try to get the
    hang of it!

  32. Misty Lawry |

    Nice blog right here! Additionally your site rather a lot up fast!
    What webb host are you the use of? Can Igget your associate link in your host?
    I wish my web site loadesd up as quickly as yours lol

  33. Chance Muramats |

    Greate pieces. Keeep posting such kind of info on your page.
    Im eally impressed by it.
    Hey there, You’ve donbe a great job. I will definitely digg itt and for
    my part recommend to my friends. I’m confident they will be benefited from this
    site.

  34. StevenBema |

    Made promise of $100 WalMart gift card that wasn’t authentic http://www.callbat.com/1-202-607-2807. Said an e-mail will be transmitted in the next 5 minutes and I could cancel whatever it was they were attempting to get me to purchase. That e-mail never came and it has been 13 days and today they are looking to get money with no method to get in touch with an actual individual out of me

  35. Warrenecom |

    casino tempe – casino tempe, horseshoe casino elizabeth indiana.

  36. MichaelSt |

    casino koblenz – palms casino restaurant, leelanau sands casino concerts.

  37. EugenePn |

    mgm grand detroit casino – real money no deposit casino, hollywood casino epic buffet menu.

  38. PatrickMup |

    enviable website xhamster

  39. Georgelive |

    продвижение youtube – поддержка в сети cobby, как увеличить CPM на youtube.

  40. KennethSn |

    шарики серпухов – купить букет в серпухове, цветы в серпухове цены.

  41. Ouida |

    Furthermore, you should be aware that attacking strategies are different
    at every stage. I think Clan of the Vein is going to be their project that
    establishes Neil and Neo as Double N. Among the
    many examples of this are Tetris, Sokoban, and Solitaire.

  42. Anthonyhix |

    portrait price – poster star, Sergey Lukashin Tote Bags.

  43. CharlesVes |

    You Porn – Mature Porn Pics, Home Porn Tube.

  44. Thomashard |

    You Porn – Virgin porn, Teen porn pics.

  45. Bev |

    Some gamers prefer first or third person shooting style games, others prefer sports apps.
    I think Clan of the Vein is going to be their project that establishes Neil and Neo as Double N.
    I don’t have a problem with surveys, but I understand the concerns.

  46. Leonardtori |

    red tube free porn – Latin porn, porn tube free.

  47. WilliamEr |

    Russian porn videos – Schoolgirl indian porn, Hidden cams.

  48. EdwardFurl |

    Chinese xnxx porn – Hairy xnxx, xnxx videos.

  49. Bradleyhum |

    пэчворк идеи для вдохновения – декор стен в гостиной, текстиль в интерьере.

  50. Ronaldjold |

    wifes photo naked – homemademilf.net, fat private porn pics.

  51. Ardmxurcold |

    GtczxvdgdfsdgbcdsHLBHFDasufksdfjln
    Ozxcjkl Maefegvtjy dfdfdfdsdgd
    FGxczDHXfgvdhjhjhjhsdadddfxgbnbm

  52. RobertGek |

    benign web site porn movies.

  53. Carlosmise |

    how to build passive income – create an account in poker automatics, get $1000 bonus.

  54. Andrewinok |

    татуаж балтийская – стилист проспект ветеранов, стилист метро ветеранов.

  55. Phillipcok |

    getting rid of alcohol dependency – overcome alcohol addiction, alcohol rehab centers.

  56. Lorenzo |

    Good answers in return of this query with genuine arguments and
    describing all regarding that.

  57. Antoniodix |

    матрас для дивана аккордеон – матрасы для диванов спб, матрасы для диванов в 3 сложения.

  58. Donaldlies |

    fiverr method update – fiverr method rice, fiverr method to madness.

  59. JustinMet |

    first website http://pozyczkiwpolsce.com/LB

  60. ThomasEi |

    пригодный ресурс обменники.

  61. ask buyusu |

    medyum,medyumlar,ask buyusu,bütün medyumlar

  62. pussy galore band |

    The natural materials tend to be an ideal addition to your adult
    acne cure irrelevant to age. As your official Goddess Lifestyle Passionista and personal love cheerleader, news of a sexy new shop in New York City gives me reasons to celebrate.
    These are great sources, however, sometimes finding a local option for these is not
    the best option.

  63. salt free water softener systems |

    I think the admin of this site is truly working
    hard in support of his web page, because here every data is quality based data.

  64. http://klec.org/board_zoGy29/1196196 |

    Great post. I will be going through many of these issues as well..

  65. Madelaine |

    I blog quite often and I seriously appreciate your content.
    This great article has really peaked my interest.
    I am going to book mark your site and keep checking for new details about once a week.
    I opted in for your RSS feed as well.

  66. nagelpilz behandlung |

    Amazing blog! Is your theme custom made or did you download it
    from somewhere? A design like yours with a few simple tweeks
    would really make my blog jump out. Please let me know where you got your theme.
    Bless you

  67. avocatnet.ratata.fi |

    Hi it’s me, I am also visiting this web site on a regular basis, this site is truly pleasant and the people are actually sharing pleasant thoughts.

  68. www.youtube.com |

    Hello very cool site!! Man .. Excellent .. Superb ..
    I will bookmark your site and take the feeds additionally?
    I am happy to seek out so many useful info right here in the publish, we need work out more strategies on this regard, thanks for
    sharing. . . . . .

  69. servicii optimizare seo |

    WOW just what I was searching for. Came here by searching for why
    xdebug extension must be loaded as a zend extension

  70. bed bug spray |

    Thank you for some other great post. Where else may just anybody get that kind of info in such an ideal method of writing?

    I’ve a presentation next week, and I am at the search for such information.

  71. Maritza |

    Definitely imagine that that you said. Your favourite justification appeared
    to be at the internet the easiest thing to consider of.
    I say to you, I certainly get irked at the same time as other
    folks think about concerns that they just don’t recognise about.
    You controlled to hit the nail upon the highest and defined
    out the entire thing without having side-effects ,
    folks could take a signal. Will likely be again to get more.
    Thanks

  72. Catering Equipment UK supplier |

    Hello Dear, are you really visiting this web page regularly,
    if so afterward you will absolutely obtain nice know-how.

  73. gaming channel |

    This is really interesting, You are a very skilled blogger.

    I’ve joined your feed and look forward to seeking more
    of your fantastic post. Also, I have shared your website
    in my social networks!

  74. montce swim discount code |

    Hi there everyone, it’s my first pay a visit at this site,
    and paragraph is really fruitful designed for me, keep up posting these content.

  75. click here |

    Sweet blog! I found it while surfing around on Yahoo News. Do you have
    any tips on how to get listed in Yahoo News? I’ve been trying for a
    while but I never seem to get there! Thanks

  76. Maryanne |

    Every weekend i used to go to see this web page, as i want enjoyment, since
    this this web site conations truly fastidious funny material too.

  77. plasterers st albans |

    Hi there! Do you know if they make any plugins to protect against hackers?
    I’m kinda paranoid about losing everything I’ve worked hard on. Any tips?

  78. http://www.gaiaonline.com |

    Hello, I think your blog might be having browser compatibility issues.

    When I look at your blog in Firefox, it looks fine but when opening in Internet Explorer,
    it has some overlapping. I just wanted to give you a quick
    heads up! Other then that, superb blog!

  79. laptop second hand ieftine |

    Thanks for finally writing about > 深入理解PHP原理之扩展载入过程 | 风雪之隅 < Liked it!

  80. obezitate.webs.com |

    Superb site you have here but I was wanting to know if you knew of any message boards that cover
    the same topics discussed in this article? I’d really like to
    be a part of group where I can get feedback from other knowledgeable individuals that share the same interest.
    If you have any suggestions, please let me know. Thanks!

  81. best home based business ideas |

    Highly descriptive blog, I liked that a lot. Will there be a
    part 2?

  82. Soila |

    I know this if off topic but I’m looking into starting my own weblog and was curious what all is needed to get set up?
    I’m assuming having a blog like yours would cost a pretty
    penny? I’m not very web savvy so I’m not 100% sure.
    Any suggestions or advice would be greatly appreciated.
    Thanks

  83. Dennis |

    Hi Dear, are you really visiting this web page daily, if so then you will without doubt get nice
    knowledge.

  84. Millard |

    This paragraph will help the internet people for creating new website or
    even a weblog from start to end.

  85. http://www.city2345.com/ |

    Also known as “the pearl of orient” is a dream destination not only for the people of the country but even people from
    across the globe. The political policy of this nation is socialist in nature, meaning the
    government provides many services to its citizens.
    Another special deal that you might want to consider is the $95 per night accommodation in the Hyatt
    Regency OHare, which is just two miles away from the Chicago OHare International Airport.

  86. www.feixiang56.com |

    Villas in Cochin Dreamflower is a well known builder
    in Cochin, Kerala. It’s been estimated that
    the green technology sector has the greatest potential for job growth in the next 10
    years. The trusses can be installed 2 feet on center with a h clip in center span between the trusses for support.

  87. boiler spare parts |

    It has developed villas, flats,apartments and homes accross Kerala.
    When choosing the best screwdriver, you have to consider some important factors.

    Fill in operates, which are projects which contractors
    do once they cannot do common scheduled work, can also be regarded.

  88. Angeline |

    Competition swimming is a different matter; many male competitors in the swimming world tend to
    wear a full skin tight bodysuit for competitions rather
    than shorts or small swimming trunks. The internet now provides you with the means
    for buying bikinis all through the year. The Hurley boardshorts were designed for the active surfer.

  89. septic tank jacksonville fl |

    Despite the “correction” in home prices, demand remains weak.
    The appreciation of a excellent plumber and their solutions only gets seen when anything is improper with your plumbing these kinds of
    as leaks in faucets, toilets and showers. Knowing that you’re
    covered if a repair doesn’t last or if a mistake is made gives peace
    of mind because you know it will be taken care of either way.

  90. Veola |

    Actually, for the reason that numerous companies at this moment offer you sun tanning alternatives,
    the price tag on having a imitation auburn possesses ditched due
    to only thirty five in order to 62 dollars, according to the style of application form you
    want in order to select. Use the comments section below to let us know what you liked and what just didn’t work for you.
    Also apply the tanner on the earlobes and upper ears.

  91. find homes |

    One of those sellers called us and told us that their tenant moved out of a house they owned and they did
    not want to be landlords any more. Ahmedabad is the commercial capital of Gujarat and one of the rapidly growing tier II cities of the country.

    Each house gets assigned by the asset manager to a realtor who is a listing agent for the asset manager (bank).

  92. cashrape |

    Like a tradesman, Moll enjters into physical relationships with various men in order to make the transaction of
    sexual intercourse. Thhe car maker CEO went on to sayy China was the only emerging market in which it had sent
    Lamborghini managers to oversee the growth of the
    business and help deal with red tape and complex
    safety regulations. She adds, “He failed not to set forth the easy prosperous Life which I was going to live” andd that “He Reason’d me out of my Reason [.

  93. 深入理解PHP原理之扩展载入过程 | 万维网黑客联盟 |

    [...] 本文地址: http://www.laruence.com/2009/06/14/945.html [...]

  94. 开心天使 |

    说的很透彻,学习了

  95. 技术世界 |

    收藏再慢慢学习!

  96. PHP5.2.x + APC的一个bug的定位 | 风雪之隅 |

    [...] 我之前的文章介绍过PHP的扩展载入过程(深入理解PHP原理之扩展载入过程), 但没有涉及到模块关闭过程, 而这个问题就和模块载入顺序和模块关闭函数很有关系了. 总体来说, 就是PHP会根据模块载入的顺序的反序来在每次请求处理结束后依次调用各个扩展的请求关闭函数. [...]

  97. 雪候鸟 |

    @偶左眼跳 请问是啥问题呢?

  98. 偶左眼跳 |

    博主你好,我是PHP新手,现在在学习用xdebug调试PHP程序,我用的集成环境是WAMP,经过一天多的GOOGLE和BAIDU ,还是不能成功的在WAMP下成功的安装Xdebug。看了您的文章,了解到您应该能从原理上解决这个问题。期待您的帮助,谢谢~

Leave a Reply

*