php運行原理如何理解,具體看代碼?

來源:互聯網
上載者:User
關鍵字 php
   PHP 測試   Hello World

'; ?>

這個是一段簡單的php代碼,檔案是hello.php,我通過www.xxx.com/hello.php請求這個頁面的時候,php是如何解析資料返回給伺服器,返回給我的,這個過程是怎麼樣的。我的理解是當我訪問這個檔案的時候伺服器找到了這個php指令碼,然後調用php的指令碼解析器解析裡邊的php代碼,那麼echo的意思是直接返回了資料麼,返回資料只能使用echo麼,伺服器整合了html和php返回的資料然後發送給用戶端,這個頁面是我直接存取的,如果這個頁面依賴於其他的全域的變數,要怎麼辦。其他的語言都有一個初始化的東西,初始化整個應用程式,那php就直接運行某一個指定的指令碼麼,沒有初始化這一說麼。

回複內容:

   PHP 測試   Hello World

'; ?>

這個是一段簡單的php代碼,檔案是hello.php,我通過www.xxx.com/hello.php請求這個頁面的時候,php是如何解析資料返回給伺服器,返回給我的,這個過程是怎麼樣的。我的理解是當我訪問這個檔案的時候伺服器找到了這個php指令碼,然後調用php的指令碼解析器解析裡邊的php代碼,那麼echo的意思是直接返回了資料麼,返回資料只能使用echo麼,伺服器整合了html和php返回的資料然後發送給用戶端,這個頁面是我直接存取的,如果這個頁面依賴於其他的全域的變數,要怎麼辦。其他的語言都有一個初始化的東西,初始化整個應用程式,那php就直接運行某一個指定的指令碼麼,沒有初始化這一說麼。

這樣吧,你先別管web,直接在你hello.php的檔案夾運行命令php hello.php
會看到輸出下面的內容(1):

   PHP 測試   

Hello World

這就是php解譯器執行你的hello.php的結果,沒錯,現在跟web還沒有半毛錢關係。
php程式對hello.php做了些什麼事情呢:

  • 1、開啟hello.php檔案;

  • 2、從上到下掃描hello.php檔案內容;

  • 3、如果找到則按照php的文法執行code,一般的邏輯代碼直接執行,但如code裡面有輸出語句(比如echo print_r等等),則將結果輸出;

  • 4、如果字串不在裡面,那麼php程式就不認識這些字串,無法處理,直接把它們輸出就行。

php解譯器能做的就這麼幾件事情,你在上面看到的輸出也就這個過程得到的。

那麼 ,現在來說是php和web。
你瀏覽器開啟http://www.xx.com/hello.php,這個請求被你的web服務程式(nginx、apache……)收到,它(web服務程式)根據你的配置知道這個請求應該是給php解譯器來執行的(而像css、js、圖片等靜態檔案的話是不用給php解譯器解釋了,web服務程式直接處理就ok),它再根據你的配置得到這個網站的根目錄在那裡,就知道這個請求應該對應到你的哪個hello.php檔案上去,繼而它將相關的請求資訊(HTTP要求標頭等)設定到環境變數裡面,然後通知php解譯器去解釋hello.php,php解譯器就像一開始那樣去解釋hello.php,並輸出(1),web服務程式再把php解譯器的輸出返回給瀏覽器(當然會加一些額外的資訊,比如HTTP頭)。

簡單講就是,web服務程式告訴php該執行那個檔案,然後把php的執行結果返回給瀏覽器。整體上就這樣一個過程,但是配置成cgi、fastcgi、php-fpm在web服務程式和php解譯器之間的互動上有些差異。
這整個過程在任意的web上都是類似的,尤其是指令碼類的語言,無外乎換了個解譯器或者是web服務程式和解譯器之間的通訊方式。

希望你不要走入誤區:其實沒必要瞭解這個,就像不知道空調的製冷原理不影響使用一樣。如果你想開發一門語言才需要,但是如果你有能力開發一門語言的話你肯定不會問這個問題。為什麼說你走入誤區了呢?

而且你舉的例子和PHP關係不大。
1-通過xxx.com/hello.php運行php檔案,這是你的web伺服器做的事情,與php無關。
2-是web伺服器收到你的請求,然後找到hello.php這個檔案,然後調用php解譯器解析檔案
3-php解析hello.php返回解析結果給web伺服器
4-web伺服器返回結果給瀏覽器
5-瀏覽器把這個結果解析成網頁呈現到你的面前。
這是全過程,而php只在步驟3發生了作用。

而人機互動本來就是非常傻瓜的事情,在非圖形介面的前提下,使用者總是輸入字元,解譯器按照預定的規則解釋,然後返回字元。

所以,你舉的例子的核心部分,當php解釋hello.php做了什麼呢?判斷是不是php代碼,不是就原樣返回,是就執行並把執行結果返回。怎麼判斷是不是php代碼呢?寫在的就是,否則都不是。

所以,基礎很重要。先搞明白web請求、http協議、伺服器端指令碼、瀏覽器端指令碼等基本的概念吧,你的問題跨度太大了。

PHP不僅僅 解釋了 Hello World

'; ?> 它解釋了整個頁面,

你可以試著搜尋cgi

當使用者代碼輸入給PHP核心去執行的時候, PHP核心會對PHP代碼進行詞法分析和文法分析, 詞法分析是把PHP代碼分割成一個個的“單元”(TOKEN), 文法分析則將這些“單元”轉化為Zend Engine可執行檔操作。 然後PHP內部的Zend Engine對這些操作進行順次的執行。 Zend Engine是PHP核心的核心部分,負責最終操作的執行和結果的返回, 可以理解成為PHP核心中的“發動機”。

php不僅僅只是解析一下內的內容,它是解釋了整個頁面,你請求伺服器時,伺服器返回給你的html代碼(也就是所說的網頁原始碼)是在服務端已經解析好的代碼了,然後才是到瀏覽器端進行渲染等操作,不過現在比較火的方式是將拼接html這些拿到瀏覽器端來做。

這個直接看php原始碼最清楚了

所以,你舉的例子的核心部分,當php解釋hello.php做了什麼呢?判斷是不是php代碼,不是就原樣返回,是就執行並把執行結果返回。怎麼判斷是不是php代碼呢?寫在的就是,否則都不是。

非常感謝你的回答,對於上面這段話想繼續請教一下,如果hello.php既包含html也包含php伺服器看到php尾碼都會發給php解析器處理,而不是自己先解析 遇到php才發給php解析器。你說的把執行結果返回,echo這種輸出代表一種執行結果,其他的比如運算,如果不適用echo是不是就不返回,暫時這麼多 還請賜教

樓主問的好像主要是:其他的語言都有一個初始化的東西,初始化整個應用程式,那php就直接運行某一個指定的指令碼麼,沒有初始化這一說麼。

這一句吧?
你所說的初始化,是不是指“編譯”???

而php是指令碼語言,它是執行的時候再“編譯”,而不是先編譯,再執行的。
當然,指令碼語言有很多,不只是php.

樓主,你的這個意思嗎?

這涉及到cgi的知識。

從使用者請求一個php檔案到php解譯器解釋執行指令檔再到伺服器把解釋結果返回給使用者這整個過程@incNick解釋的很清楚了。而樓主疑惑的地方是php解譯器怎麼實現“初始化”過程,這其實就是CGI的工作原理。

維基百科上說:

CGI的工作方式,從Web伺服器的角度看,是在特定的位置(比如:http://www.example.com/wiki.cgi)定義了可以運行CGI程式。當收到一個匹配URL的請求,相應的程式就會被調用,並將用戶端發送的資料作為輸入。程式的輸出會由Web伺服器收集,並加上合適的檔頭,再發送回用戶端。

php指令碼為例,當web伺服器遇到匹配的php結尾的uri請求時,會啟動php解譯器,並把用戶端發送的相關的資料(比如,使用者請求的uri,相應的get和post的資料等)通過環境變數傳遞給php解譯器,然後php解譯器根據這些環境變數在解析指令碼的時候設定$_GET, $_POST, $_SERVER等全域變數以供指令碼使用,然後解析整個指令碼內容,html原樣輸出,php代碼執行輸出,得到最後的html頁面,傳遞迴web伺服器,由web伺服器返回給使用者,完成整個響應過程。

所以,初始化過程就是根據伺服器設定的環境變數設定這些全域變數,沒有其他的。而web伺服器設定哪些環境變數正事整個CGI協議的中心。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.