1. 程式人生 > >1.PHP 擴充套件開始以及核心應用(1) --- PHP 的生命週期

1.PHP 擴充套件開始以及核心應用(1) --- PHP 的生命週期

1.2 PHP 的啟動與終止
	PHP 程式的啟動可以看做有2個概念上的啟動,終止也有2個。其中一個是 PHP 作為 Apache(舉例)的一個模組的啟動和終止,
  這次啟動PHP會初始化一些必要的資料,比如與宿主apache有關的,並且這些資料是常駐記憶體的。終止與之相對。還有一個概念上
  的啟動就是當 apache 分配一個頁面請求過來的時候,php 會有一次啟動與終止。

    在最初的初始化的時候,就是 php 隨著 apache 的啟動而誕生在記憶體的時候,它會把自己所有已載入的擴充套件的 MINIT方法(
  全場 module initialization, 是由每個模組自己定義的函式)都執行一遍。在這個時間裡,擴充套件可以定義一些自己的常量,類,
  資源等所有會被使用者的 php 指令碼用到的東西。但要記住,這裡定義的東西會在 apache 常駐記憶體,可以被所有請求使用,直到 apache
  解除安裝掉 php 模組。

    核心中預置了 PHP_MINIT_FUNCTION 巨集函式,來幫助我們實現這個功能:
    int time_of_minit; // 在 MINIT() 中初始化,在每次頁面請求中輸出,看是否有變化
    PHP_MINIT_FUNCTION(副檔名)
    {
    	time_of_minit = time(null);
    	return SUCCESS;  // 返回 SUCCESS 代表正常,返回 FALIURE 就不會載入這個擴充套件了
    }

    當一個頁面請求到來的時候,php 會迅速的開闢一個新的環境,並重新掃描自己的各個擴充套件,遍歷執行它們各自的 RINIT方法(俗稱 request initialization),
  這個時候擴充套件可能會初始化本次請求中會用到的變數等,還會初始化使用者端(即 php 指令碼)中的變數之類的,核心預置了 PHP_RINIT_FUNCTION()這個巨集函式來幫我們
  實現這個功能:
    int time_of_minit;
  	PHP_RINIT_FUNCTION(副檔名)
  	{
  		time_of_minit=time(null);
  		return SUCCESS;
  	}

  	好了,現在這個頁面請求執行的差不多了,可能是順利的走到了自己檔案的最後。也可以被使用者的 die 或者 exit 了,這個時候 php 就會啟動回收程式。它這次會執行
  所有已經載入的擴充套件的 RSHUTDOWN(request shutdown)方法,這個時候擴充套件可以抓緊利用核心的變量表之類的做一些事情,因為一旦 php 把所有擴充套件的 RSHUTDOWN 方法
  執行完,便會釋放這次請求使用過的所有東西,包括變量表的所有變數,所有在這次請求中申請的記憶體等。
    核心預置了 PHP_RSHUTDOWN_FUNCTION() 巨集函式來幫助我們實現。
    PHP_RSHUTDOWN_FUNCTION(副檔名)
    {
    	FILE *fp=fopen('time_rshutdown.txt', 'a+');
    	fprintf(fp, "%ld\n", time(null)); // 每次請求結束都在這裡追加資料
    	fclose(fp);
    	return SUCCESS;
    }

    當 apache 終止時,會通知 php 自己要 stop 了。 php 便進入 MSHUTDOWN(module shutdown)階段。這個時候 php 便會給所有的擴充套件下最後通牒,如果哪個擴充套件還有
  未了心事,就放在 MSHUTDOWN 方法裡,一旦 php 把擴充套件的 MSHUTDOWN 執行完,便進入自毀程式,這裡一定要把自己申請的記憶體給釋放掉。
    PHP_MSHUTDOWN_FUNCTION(副檔名)
    {
    	FILE *fp=fopen('time_mshutdown.txt', 'a+');
    	fprintf(fp, "%ld\n", time(NULL));
    	return SUCCESS;
    }

    這裡的4個巨集是在 自己的擴充套件裡面實現的,其他的都是在 main/php.h 裡別定義的

1.4 執行緒安全
	在 PHP 初期,是作為單程序的 cgi 來執行的,所以並沒有考慮執行緒安全的問題。我們可以隨意的在全域性作用域中設定變數並在程式中對
  它進行修改,訪問,核心申請的資源如果沒有被正確釋放,也會在 cgi 程序結束後自動被清理乾淨。
    隨著事業在多執行緒模式的軟體越來越多,php 核心中需要一種新的資源管理方式,
  並最終在 php 核心中形成了一個新的抽象層:TSRM(thread safe resource management)。

  執行緒安全與非執行緒安全:
  	在一個沒有執行緒的程式中,我們往往傾向於把全域性變數放在原始檔的頂部,編輯器會自動的為它分配資源供我們在宣告語句之下的程式邏輯中使用。
  	但是在一個多執行緒的程式中,如果我們需要每個執行緒都擁有自己獨立的資源的話,便需要為每個執行緒獨立開闢出一個區域來存放它們各自的資源。

  thread-safe data pools(執行緒安全的資源池):
  	在擴充套件的 module init 裡,擴充套件可以呼叫 ts_allocate_id() 來告訴 trsm  自己需要多少資源。trsm 接收後更新系統使用的資源,並得到一個
  指向剛剛分配的那份資源的 id。
    當一個請求需要訪問資料段的時候,擴充套件從 tsrm 層請求當前執行緒的資源池,以 ts_allocate_id() 返回的資源 id 來獲取偏移量。

    因為在 php 的執行緒安全中構建訪問全域性變數資源設計到執行緒資料池查詢對應的偏移量,這是一些額外的負載,結果就是它比對應的非執行緒方式(直接從編譯計算好的真實
  全域性變數地址取出資料)慢一些。
    非執行緒構建還有程序隔離的優勢,這樣給定的請求碰到完全出乎意料的情況時,它也不會影響到其他程序,即使是產生錯誤也不會導致整個 web-server 癱瘓。實際上,
  apache 的 MaxRequestPerChild 指令就是設計用來提升整個特性的,它經常性的有目的的 kill 掉子程序併產生新的子程序,來避免某些可能由於程序長時間執行 "積累"
  而來的問題(比如記憶體洩漏).

  訪問全域性變數:
  	在建立一個擴充套件時,你並不知道它最終的執行環境是否是執行緒安全的。幸運的是,你要使用的標準包含檔案集合中已經包含了條件定義的 ZTS 預處理標記。當 php 因為 sapi
  需要通過 enable-maintainer-zts 選項安裝等原因以執行緒安全方式構建時,這個值會被自動的標記,並可以用一組 #ifdef ZTS 這樣的指令集去測試它的值。就像你前面看到的,
  只有在 php 以執行緒安全方式編譯時,才會存到執行緒安全池,只有執行緒安全池存在時,才會真的線上程安全池中分配空間。

  即使你不需要執行緒也需要考慮執行緒:
  	正常的 php 構建預設是關閉執行緒安全的,只有在構建的 sapi 明確需要執行緒安全或執行緒安全在 ./configure 階段顯示開啟,才會以執行緒安全方式構建。給出了全域性查詢的速度問題
  和程序隔離的缺點後,你看你會疑惑為什麼明明不需要還有人故意開啟它?這是因為,多數情況下,擴充套件和 sapi 的開發者認為你是執行緒安全開關的操作者,這樣可以很大程度上保證新程式碼
  可以在所有的環境中正常執行。當執行緒安全啟用的時候,一個名為 tsrm_ls 的特殊指標被增加到了很多的內部函式原型中。這個指標允許 php 區分不同的執行緒的資料。 

1.2 PHP 的啟動與終止

相關推薦

1.PHP 擴充套件開始以及核心應用(1) --- PHP生命週期

1.2 PHP 的啟動與終止 PHP 程式的啟動可以看做有2個概念上的啟動,終止也有2個。其中一個是 PHP 作為 Apache(舉例)的一個模組的啟動和終止, 這次啟動PHP會初始化一些必要的資料,比如與宿主apache有關的,並且這些資料是常駐記憶體的。終止與之

PHP擴充套件開發及核心應用》學習筆記(二)

二、PHP變數在核心中的實現 在強型別的程式語言中,我們必須在使用變數前先宣告(定義)變數的型別和名稱。 而PHP屬於弱型別的程式語言,PHP 會根據變數的值,自動把變數轉換為正確的資料型別。 1. 變數的型別 PHP中,一共有8種資料型別: 包括4中標

JSF 應用程式的生命週期

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

IIS處理瀏覽器請求的流程 | 應用程式的生命週期 |反編譯工具用法 |管道事件

我們在IIS上部署一個網站的時候(我們在Internet 資訊服務(IIS)管理器,對應網站的右邊>編輯網站>基本設定,可以看到,網站名稱與應用程式池的名稱是一樣的:其實我們在IIS裡建立一個網站的時候,IIS會自動給我們建立一個與網站名稱相同名稱的應用程式

iOS應用程式的生命週期及前後臺切換,應用的各種狀態)

一、iOS應用程式狀態機一共有五種狀態:   1. Not running(未執行):應用還沒有啟動,或者應用正在執行但是途中被系統停止。   2. Inactive(未啟用):當前應用正在前臺執行,但是並不接收事件(當前或許正在執行其它程式碼)。一般每當應用要從一個狀

iOS-關於應用/檢視的生命週期及程式啟動原理小結

前言:   所有的移動作業系統都有個致命的缺點:app很容易受到打擾。比如一個來電或者鎖屏會導致app進入後臺甚至被終止   還有很多其它類似的情況會導致app受到干擾,在app受到干擾時,會

Android中級教程之--------Android應用程式的生命週期(一定要理解,面試會問的哦!)

Android的應用程式的生命週期,我相信這在以後的Android面試一定是經常考的題目,所以大家一點要重視哦!下面我將圖文雙執行緒,希望對大家有一點幫助! 首先我們看一下Android應用程式的生命週期圖:         在大部份情況下,每個Android應用都

Fragment和Activity生命週期以及橫豎屏切換對生命週期的影響

生命週期變化 : 切換到該Fragment 05-21 14:26:35.095: D/FragmentDemo(7649): onAttach 05-21 14:26:35.095: D/FragmentDemo(7649): onCreate 05-21 14:26:35.095: D/Frag

【WPF學習】第二十六章 Application類——應用程式的生命週期

  在WPF中,應用程式會經歷簡單的生命週期。在應用程式啟動後,將立即建立應用程式物件,在應用程式執行時觸發各種應用程式事件,你可以選擇監視其中的某些事件。最後,當釋放應用程式物件時,應用程式將結束。 一、建立Application物件   使用Application類的最簡單方式是手動建立它。下面的示例演示

PHP.25-TP框架商城應用實例-後臺1-添加商品功能、鉤子函數、在線編輯器、過濾XSS、上傳圖片並生成縮略圖

引用傳遞 none move 名稱 textarea 如果 library time fields 添加商品功能   1、創建商品控制器【C】  /www.test.com/shop/Admin/Controller/GoodsController.class.php

(轉)C#開發微信門戶及應用(1)--開始使用微信接口

主界面 回調 商機 存在 配置 manager 功能 之前 隨筆 http://www.cnblogs.com/wuhuacong/p/3613826.html 微信應用如火如荼,很多公司都希望搭上信息快車,這個是一個商機,也是一個技術的方向,因此,有空研究下、學習下微信

蘋果從2018年1月起開始淘汰32位Mac應用

lis 應用 egl mac 開始 onu u2l http oca JDK6%E6%98%8E%E5%B9%B42%E6%9C%88%E5%81%9C%E6%AD%A2%E6%9B%B4%E6%96%B0%EF%BC%8C%E7%94%B2%E9%AA%A8%E6%96%

Windows 64位下安裝php的redis擴充套件(php7.2+redis3.1

近來因為php環境升級到php7.x,所以也對redis進行了升級 1下載redis3.0 : https://github.com/MSOpenTech/redis/releases 2 將下載的檔案解壓到電腦中(D:\redis),安裝完成。 3 開啟redis

php sphinx擴充套件錯誤,object(SphinxClient)#1 (2) { ["error"]=> string(35) "connect() failed: Permission den

我在centos上測試coreseek,一切準備就緒後,安裝php sphinx擴充套件,發現php呼叫時 打印出的是SphinxClient Object ( [error] => connect() failed: Permission denied [warning]

*Qt5 設定應用程式圖示以及Debug Error 1問題**

Qt5 設定應用程式圖示以及Debug Error 1問題 第一步:下載圖示檔案(必須是.ico檔案)並放在工程原始碼資料夾下,推薦下載地址:http://www.icosky.com/ 第二步:在.pro工程建立一個.txt檔案,裡面內容為:IDI_ICON

PHP核心之旅-1.生命週期

PHP 核心之旅系列 1.SAPI介面 PHP具體應用的程式設計介面。 2.開始和結束   PHP開始執行以後會經過兩個主要的階段:     處理請求之前的開始階段和請求之後的結束階段。       1.1開始階段:         1.1.1 模組初始化階段(MINT),只進行一次。  

YOLO 人臉識別演算法以及應用 (1)

最前沿的網路技術,為你的網站帶來國際化的使用者體驗和易用性,這一切只有Witmart.com能做到。 第四周 特殊應用:人臉識別和神經風格轉換(Special applications: Face recognition &Neural style t

從零開始學習H5應用1)——V1.0版,簡單頁面滑動切換效果

可曾看見過那些在微信上轉瘋了的H5神作?好生羨慕啊,那麼從今天開始,我將從零開始學習製作H5應用,看看那麼漂亮的頁面是怎麼樣一步一步形成的。 2016年2月更新:之前很多朋友問我要原始碼,由於工作原因,一直沒來得及上傳,今天已上傳至github,點選下面的地址

odoo12從零開始:三、1)建立你的第一個應用模型(module)

前言       以前,我一直都不知道為什麼好多框架的入門都是“hello world”開始,當我思前想後我要如何介紹odoo的model、record、template等繼承等高階特性時,發現在那之前便需要清楚地介紹什麼是模型(model),什麼是記錄

Kubernetes實戰 - 從零開始搭建微服務 1 - 使用kind構建一個單層架構Node/Express網路應用程式

# 使用kind構建一個單層架構Node/Express網路應用程式 > Kubernetes實戰-從零開始搭建微服務 1 ![k8s structure](https://d33wubrfki0l68.cloudfront.net/152c845f25df8e69dd24dd7b0836a28974