首先提供書的地址:http://www.walu.cc/phpbook/index.md,並向作者表示感謝!同時歡迎同看此書的人加入QQ羣:76761320
本章知識點:
- 簡單瞭解SAPI
- php的啓動與終止
- php的生命週期
- 線程安全
一、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 。
四、線程安全:
看完之後感覺有些深,有些散亂,沒明白到底講的什麼。等過段時間再來看!
推薦兩篇關於線程安全的博文: