PHP擴展開發與內核應用閱讀筆記---php的生命周


首先提供書的地址:http://www.walu.cc/phpbook/index.md,並向作者表示感謝!同時歡迎同看此書的人加入QQ羣:76761320

本章知識點:

  1. 簡單瞭解SAPI
  2. php的啓動與終止
  3. php的生命週期
  4. 線程安全

一、SAPI就是PHP和外部環境的代理器, 他把外部環境抽象後, 爲內部的PHP提供一套固定的, 統一的接口, 

使得PHP自身實現可以不用考慮不同的外部環境而導致邏輯複雜.

二、php終止與啓動的兩個概念:

         1.PHP作爲Apache(拿它舉例,板磚勿扔)的一個模塊的啓動與終止,這次啓動php會初始化一些必要數據。並且這些數據是常駐內存的!

         2.當Apache分配一個頁面請求過來的時候,PHP會有一次啓動與終止,這也是我們最常討論的一種。

         3.通過修改擴展文件中的.c文件來體驗,php的啓動和終止

                如果你的擴展起名爲walu那麼我們需要修改你擴展目錄下的walu.c ,用下面代碼中的函數替換walu.c中同名的函數

//這些代碼都在walu.c裏面,不再.h裏

int time_of_minit;//在MINIT中初始化,在每次頁面請求中輸出,看看是否變化
PHP_MINIT_FUNCTION(walu)
{
    time_of_minit=time(NULL);//我們在MINIT啓動中對他初始化
    return SUCCESS;
}

int time_of_rinit;//在RINIT裏初始化,看看每次頁面請求的時候變不。
PHP_RINIT_FUNCTION(walu)
{
    time_of_rinit=time(NULL);
    return SUCCESS;
}

PHP_RSHUTDOWN_FUNCTION(walu)
{
    FILE *fp=fopen("/cnan/www/erzha/time_rshutdown.txt","a+");//請確保文件可寫,否則apache會莫名崩潰
    fprintf(fp,"%d\n",time(NULL));//讓我們看看是不是每次請求結束都會在這個文件裏追加數據
    fclose(fp);
    return SUCCESS;
}

PHP_MSHUTDOWN_FUNCTION(walu)
{
    FILE *fp=fopen("/cnan/www/erzha/time_mshutdown.txt","a+");//請確保文件可寫,否則apache會莫名崩潰
    fprintf(fp,"%d\n",time(NULL));
    return SUCCESS;
}

//我們在頁面裏輸出time_of_minit和time_of_rinit的值
PHP_FUNCTION(walu_test)
{
    php_printf("%d<br />",time_of_minit);
    php_printf("%d<br />",time_of_rinit);
    return;
}

        在這裏我們需要搞清楚這些函數到是什麼時候執行的,做什麼的。

首先:PHP_MINIT_FUNCTION:


           當模塊被Zend Engine(ZE)加載後,例如Apache啓動,加載了PHP模塊,
ZE會對每一個擴展模塊調用此函數(如果有的話),可以在該函數裏進行一些初始化操作。

PHP_RINIT_FUNCTION: 

        對於每一個"使用"該模塊的PHP腳本請求前,都執行該函數(如果有的話),最好的例子: Session 擴展模塊,如果在一個PHP腳本里執行session.start(), Session模塊的PHP_RINIT_FUNCTION(),將被調用. 詳情可以看看 session模塊 的源代碼

PHP_RSHUTDOWN_FUNCTION:

        與PHP_RINIT_FUNCTION()相反,該函數是在一個 PHP 腳本執行完畢後執行

PHP_MSHUTDOWN_FUNCTION:

        當ZE收到shutdown信號後,例如apache卸載PHP模塊,ZE 對每一個模塊調用此函數,最後關閉自己的核心子系統.

三、PHP的生命週期:

       通過二的php的啓動與終止我們瞭解到php執行了四個過程

      Module init、Request init、Request Shutdown、Module shutdown  。

四、線程安全:

     看完之後感覺有些深,有些散亂,沒明白到底講的什麼。等過段時間再來看!

      推薦兩篇關於線程安全的博文:

1.PHP源碼分析之線程安全模型

2.深入研究PHP及Zend Engine的線程安全模型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章