本文目錄一覽:
php是什麼意思
php通常指超文本預處理器,用於面向對象、命令式編程,是一種通用開源腳本語言。
主要特點:
為開源性和免費性、快捷性、資料庫連接的廣泛性、面向過程和面向對象並用。優點是利於學習,使用廣泛。此外,php還可以指菲律賓比索的標準貨幣代碼符號,MPLS網路中的倒數第二跳彈出功能。是英文超級文本預處理語言Hypertext Preprocessor的縮寫。PHP 是一種HTML 內嵌式的語言,是一種在伺服器端執行嵌入HTML文檔的腳本語言,語言風格有些類似於C語言,被廣泛的運用。
簡介:
PHP(外文名:PHP: Hypertext Preprocessor,中文名:「超文本預處理器」)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP 獨特的語法混合了C、Java、Perl以及PHP自創的語法它可以比CGI或者Perl更快速地執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML(標準通用標記語言下的一個應用)文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多;PHP還可以執行編譯後代碼,編譯可以達到加密和優化代碼運行,使代碼運行更快。
特性包括:
1、PHP 獨特的語法混合了 C、Java、Perl 以及 PHP 自創新的語法
2、PHP可以比CGI或者Perl更快速的執行動態網頁——動態頁面方面,與其他的編程語言相比,PHP是將程序嵌入到HTML文檔中去執行,執行效率比完全生成htmL標記的CGI要高許多;PHP具有非常強大的功能,所有的CGI的功能PHP都能實現
3、 PHP支持幾乎所有流行的資料庫以及操作系統。
4、最重要的是PHP可以用C、C++進行程序的擴展!
語言特點:
開源免費
PHP是一個受眾大並且擁有眾多開發者的開源軟體項目,Linux + Nginx + Mysql + PHP是它的經典安裝部署方式,相關的軟體全部都是開源免費的,所以使用PHP可以節約大量的正版授權費用。不過PHP作為一個開源軟體,它缺乏大型科技公司的支持背景,網路上對它的唱衰也是經久不衰,不過它的持續迭代和性能持續增強的現實卻是鼓舞人心的,PHP社區用實際行動給予各種質疑強有力的回擊。
快捷高效
PHP的內核是C語言編寫的基礎好效率高,可以用C語言開發高性能的擴展組件;PHP的核心包含了數量超過1000的內置函數,功能應有盡有很全面,開箱即用程序代碼簡潔; PHP數組支持動態擴容,支持以數字、字元串或者混合鍵名的關聯數組,能大幅提高開發效率; PHP是一門弱類型語言,程序編譯通過率高,相對其他強類型語言開發效率快;PHP天然熱部署,在php-fpm運行模式下代碼文件覆蓋即完成熱部署;PHP經過20多年的發展,在互聯網上可以搜到海量的參考資料供參考學習。
性能提升
PHP版本越高它的整體性能越高,根據官方介紹,PHP7.0.0 對比PHP5.6性能就提升了2倍,PHP7.4已經比PHP7.0快了約30%,PHP8.0在性能上又相對PHP7.4大約改進了10%。PHP 8.0 引入了 JIT編譯器特性,同時加入多種新的語言功能,例如命名參數、聯合類型、註解、Constructor Property Promotion、match 表達式、nullsafe 運算符以及對類型系統、錯誤處理和一致性的改進。PHP擁有自己的核心開發團隊,保持5年發布一個大版本、1個月發布2個小版本的頻率,最新的版本是PHP8.08 。
跨平台
每個平台都有對應的php解釋器版本,指針對不同平台均編譯出目標平台的二進位碼(PHP解釋器),php開發的程序可以不經修改運行在windows、linux、unix等多個操作系統上。
常駐內存
php-cli模式下可以實現程序常駐內存,各種變數和資料庫連接都能長久保存在內存實現資源復用,比較常用的做法是結合swoole 組件編寫cli框架。
頁面生命周期
在php-fpm模式下,所有的變數都是頁面級的,無論是全局變數還是類的靜態成員,都會在頁面執行完畢後被清空,對程序員水平要求低,佔用內存非常少,特別適合中小型系統的開發。
運行機制:
PHP常見的運行模式有2種,分別是php-fpm 和php-cli 。當PHP 選擇運行在php-fpm模式下,所有的變數都是頁面級的,無論是全局變數還是類的靜態成員,都會在頁面執行完畢後被清空。運行在php-cli模式下可以實現程序常駐內存,各種變數和資料庫連接都能長久保存在內存 實現資源復用,性能可以得到很大的提升,php-cli開發比較複雜能但是能夠獲取更高的性能,對開發者的要求比較高需要比較高的開發水平,比較常用的模式是結合swoole 組件編寫cli框架,各種變數能保存在跨進程的高性能共享內存 Table ,可以開發出支持熱啟動的php-cli可靠各類應用系統。
php-fpm在PHP 5.3.3 版本成為了官方正式組件(2010-07-22),它提供了穩定可靠的進程管理服務,進程不足時候可以智能擴充數量,閑置時候可以自動回收銷毀多餘的進程,同時它對程序的容錯能力很強大運行非常穩定,可以應付企業級的開發需求。php-fpm友好的完成了使用HTTP/HTTPS等TCP/IP互聯網協議下進行的用戶的輸入輸出,頁面級生命周期各種資源用完即釋放,不存在內存泄漏的問題。php-fpm也提供有一些常駐內存的技術支持,例如PHP 7.4引入的opcache.preload也能實現局部的PHP類和函數的常駐內存,不過這個方法不夠靈活,和伺服器配置捆綁的太死了。
php-cli因為能實現各類資源的常駐內存,所以可以資源復用,更高效完成多進程編程和非同步編程,可以開發出負載能力更高的應用系統。但是相對php-fpm的簡單編程開發,開發者要注意很多的事項和需要做很多附加的控制器開發,否則就無法實現期待中的高性能。
首先開發者需要去實現可靠的進程管理服務,保證系統進程遇到各類錯誤退出運行後能夠自動創建新的進程,只有這樣才能保證後續的服務請求有足夠空閑進程可分配。每個業務代碼段都要做異常處理,讓進程遇到非致命錯誤時候不會退出,因為進程重啟意味程序和各類資源需要再次載入,這個過程性能消耗不小,所以只有進程穩定運行了常駐內存才有意義。
其次因為常駐內存,編寫的新的程序必須重啟服務才能生效,這一點習慣了fpm模式的開發者會感到比較陌生。另外開發者需要手工釋放內存,否則系統長時間運行後會出現內存泄露。同時在cli模式下,我們不能像fpm里直接用 $_SERVER、$_POST、$_GET、$_COOKI和$_FILES 進行編程工作,需要自己去解析各種互聯網通訊協議完成用戶的輸入輸出。要實現多進程編程利用多核CPU計算,還有學習使用pcntl和posix編程,這裡涉及到了非同步編程邏輯,這塊難度還是比較大的。比較常用的模式是結合swoole 組件編寫cli框架。
PHP是一個活躍的社區開發語言,有專業的核心開發團隊在持續不斷的迭代,最近一個版本就是PHP 8.0.8 引入了很多的新特性。
語言參考:
內置函數
PHP 有很多標準的函數和結構。還有一些函數需要和特定的擴展模塊一起編譯,否則在使用它們的時候就會得到一個致命的「未定義函數」錯誤。例如,要使用 image 函數中的 imagecreatetrue,需要在編譯 PHP 的時候加上 GD 的支持。或者要使用 mysqli_connect函數,就需要在編譯 PHP 的時候加上 MySQLi 支持。有很多核心函數已包含在每個版本的 PHP 中如字元串和變數函數。調用 phpinfo或者 get_loaded_extensions可以得知 PHP 載入了那些擴展庫。同時還應該注意,很多擴展庫默認就是有效的。
靜態網站與動態網站的區別
靜態網站:web1.0 時代
動態網站:web2.0 時代
靜態網站特點:
1、網頁內容一經發布到網站伺服器,無論是否有用戶訪問,每個靜態頁面的內容都是保存在網站伺服器上的。也就是說,靜態網頁是實實在在保存在伺服器上的文件,每個網頁都是一個獨立的文件。
2、靜態網頁的內容相對穩定,因此容易被搜索引擎檢索。
3、 靜態網頁沒有資料庫的支持,在網站製作和維護方面工作量較大,因此當網站信息量很大時完全依靠靜態網頁製作方式比較困難。
4、靜態網頁的交互性較差,在功能方面有較大的限制。
動態網站特點:
1、交互性:網頁會根據用戶的要求和選擇而動態地改變和響應,瀏覽器作為客戶端,成為一個動態交流的橋樑,動態網頁的交互性也是今後web發展的潮流。
2、自動更新:即無須手動更新HTML文檔,便會自動生成新頁面,可以大大節省工作量
3、因時因人而異:即當不同時間、不同用戶訪問同一網址時會出現不同頁面。
動態網頁是與靜態網頁相對應的,靜態網頁的後綴是以 .htm , .html , .shtml , .xml ,動態網頁的後綴是以 .asp , .jsp , .php , .perl , cgi 等形式。在動態網頁網址中有一個標誌性的符號”?”
php的優點有哪些?
1、良好的安全性
PHP是開源軟體,所有PHP的源代碼每個人都可以看得到,代碼在許多工程師手中進行了檢測,同時它與Apache編繹在一起的方式也可以讓它具有靈活的安全設定,PHP具有了公認的安全性能。開源造就了強大,穩定,成熟的系統。
2、跨平台特性
PHP幾乎支持所有的操作系統平台及資料庫系統,並廣為流行。
3、執行速度快,
效率高
PHP是一種強大的CGI腳本語言,語法混合了C、Java、Perl和PHP式的新語法,執行網頁速度比CGI、Perl和ASP更快,而且內嵌Zend加速引擎,性能穩定快速,佔用系統資源少,代碼執行速度快。PHP消耗相當少的系統資源。的源代碼:
所有的PHP源代碼事實上都可以得到。
4、很好的移植性和
擴展性強
PHP具有很好的開放性和可擴展性,PHP可以運行在任何伺服器上(不管是windows還是Linux)屬於自由軟體,其源代碼完全公開,任何程序員為PHP擴展附加功能都非常容易。在很多網站上都可以下載到最新版本的PHP。目前,PHP主要是基於Web伺服器運行的,支持PHP腳本運行的伺服器有多種,其中最有代表性的為Apache和IIS。
5、降低網站開發成本
PHP不受平台束縛,可以在UNIX、Linux等眾多不同的操作系統中架設基於PHP的Web伺服器。採用Linux+Apache+PHP+MySQL這種開源免費的框架結構可以為網站經營者節省很大一筆開支.
6.支持面向對象
面向對象編程(OOP)是當前的軟體開發趨勢,PHP對OOP提供了良好的支持。可以使用OOP的思想來進行PHP的高級編程,對於提高PHP編程能力和規劃好Web開發構架都非常有意義。
7.功能強大
PHP在Web項目開發過程中具有極其強大的功能,而且實現相對簡單,主要表現在如下幾點:
可操縱多種主流與非主流的資料庫,例如:MySQL、Access、SQL
Server、Oracle、DB2等,其中,PHP與MySQL是現在絕佳的組合,可以跨平台運行。
可與輕量級目錄訪問協議進行信息交換。
可與多種協議進行通信,包括IMAP、POP3、SMTP、SOAP和DNS等。
使用基於POSIX和Perl的正則表達式庫解析複雜字元串。
可以實現對XML文檔的有效管理及創建和調用Web服務等操作。
8.可選擇性
PHP可以採用面向過程和面向對象兩種開發模式,並向下兼容,開發人員可以從所開發網站的規模和日後維護等多角度考慮,選擇所開發網站應採取的模式。
PHP進行Web開發的過程中使用最多的是MySQL資料庫。PHP
5.0以上版本中不僅提供了早期MySQL資料庫操縱函數,而且提供了MySQLi擴展技術對MySQL資料庫的操縱,這樣開發人員可以從穩定性和執行效率等方面考慮操縱MySQL資料庫的方式。
9.版本更新速度快
與數年才更新一次的ASP相比,PHP的更新速度要快得多,因為PHP幾乎每年更新一次。
10.模板化
實現程序邏輯與用戶界面的分離。
11.應用範圍廣
目前在互聯網有很多網站的開發都是通過PHP語言來完成的,例如,搜狐、網易和百度等,在這些知名網站的創作開發中都應用到了PHP語言。
php5.3與5.3以下版本的區別
Namespaces
php 5.3最大的改動,毫無疑問就是Namespaces(此前有一篇相關的PHP Namespaces FAQ)。這給php開發人員帶來的好處不少,廣為人們所詬病的函數命名問題也得到了解決。代碼更清晰
5.3之前常見的代碼,需要自定義前綴區分函數和類名PLAIN TEXTCODE:function MY_wrapper() {}
class MY_DB { }
define(‘MY_CONN_STR’, ”);
MY_wrapper();
new MY_DB();
MY_CONN_STR;
使用名稱空間之後,代碼看上去更加clean。PLAIN TEXTCODE:namespace MY;
function wrapper() {}
class DB { }
const CONN_STR = ”;
use MY AS MY;
wrapper();
new DB();
CONN_STR;
一個文件中定義了多個namespace
如果一個文件中定義了多個namespace,應該怎樣處理?PLAIN TEXTCODE:namespace LIB;
class MySQL {}
class SQLite {}
$b = new SQLite();
namespace LIB_EXTRA;
class MScrypt {}
$a = new MScrypt();
var_dump(
get_class($a),
get_class($b)
);
以上代碼輸出為:PLAIN TEXTCODE:string(18)”LIB_EXTRA::MScrypt”
string(11)”LIB::SQLite”
php是解釋執行的語言,以上結果合情合理。namespace的優先順序
namespace中定義的函數,類和常量優先,其次才是全局的。PLAIN TEXTCODE:namespace foo;
function strlen($foo) { return htmlentities($foo); }
echo strlen(“test”); // test
echo ::strlen(“test”); // 4
echo namespace::strlen(“test”); // test
namespace和autoload的友情
autoload會根據namespace名稱以及class名稱來解析類文件位置
僅當namespace和全局範圍都沒找到class定義的情況下,autoload才會被觸發
在namespace中定義的__autoload不會被自動調用
PLAIN TEXT
CODE:
function __autoload($var) { var_dump($var); } // LIB::foo
require “./ns.php”; /*
?php
namespace LIB;
new foo();
*/
namespace一些輔料
PLAIN TEXTCODE:namespace really::long::pointlessly::verbose::ns;
__NAMESPACE__; // 新增的魔法常量,表示當前namespace名稱
class a{}
get_class(new a()); // really::long::pointlessly::verbose::ns::a
use really::long::pointlessly::verbose::ns::a AS b;// 從名稱空間中引用一個類
註:這裡的內容節選自pdfIntroduction to PHP 5.3 Slides,後文不再複述。性能提升
php 5.3的總體性能提升了5 – 15%md5()快了10-15%
Better stack implementation in the engine
Constants移到read-only內存里
exception處理過程改進(簡化,opcodes更少)
(require/include)_once改進,去掉重複open
Smaller binary size startup size with gcc4
新語言特性__DIR__
在5.3以前,為了獲得當前腳本的目錄,需要一次函數調用PLAIN TEXTCODE:echo dirname(__FILE__); // PHP 5.3
在5.3,只需要一個魔術常量__DIR__就解決了。PLAIN TEXTCODE:echo __DIR__; // = PHP 5.3
?:操作符
便捷的?:操作符,可以從兩個值/表達式中快速取得非空值。PLAIN TEXTCODE:$a = true ?: false; // true
$a = false ?: true; // true
$a = “” ?: 1; // 1
$a = 0 ?: 2; // 2
$a = array() ?: array(1); // array(1);
$a = strlen(“”) ?: strlen(“a”); // 1
__callStatic()
新增了魔術方法__callStatic,功能和__call類似,但是僅對static方法有效。PLAIN TEXTCODE:class helper {
static function __callStatic($name, $args) {
echo $name.'(‘.implode(‘,’, $args).’)’;
}
}
helper::test(“foo”,”bar”); // test(foo,bar)
動態調用static方法
動態的調用靜態方法?動靜結合。PLAIN TEXTCODE:class helper {
static function foo() { echo __METHOD__; }
}
$a = “helper”;
$b = “foo”;
$a::$b(); // helper::foo
Late Static Binding
不知道怎麼譯,可能留個原文更容易理解。靜態方法的事件處理時機有變化,以前是在編譯期處理,現在是執行期間處理。在php 5.3之前,下面的代碼會輸出一個A,但是這不是咱們要的,whoami方法已經在class B中重新定義,它本該輸出B才符合咱們想當然的思維。PLAIN TEXTCODE:class A {
public static function whoami() {
echo __CLASS__;
}
public static function identity() {
self::whoami();
}
}
class B extends A {
public static function whoami() {
echo __CLASS__;
}
}
B::identity(); // A — PHP 5.3
下面代碼中使用了static::whoami()來調用靜態方法。php 5.3之後,由於__CLASS__是在執行期被處理,那麼這個例子中能順利抓到class B。PLAIN TEXTCODE:class A {
public static function whoami() {
echo __CLASS__;
}
public static function identity() {
static::whoami();
}
}
class B extends A {
public static function whoami() {
echo __CLASS__;
}
}
B::identity(); // B –= PHP 5.3
mysqlnd
見mysqlnd成為php 5.3中的默認mysql驅動但是PDO_MySQL暫時還不支持mysqlnd,目前只有mysql(i)擴展可以用到之前介紹的php 5.3的新特性,都是方便開發人員的東東。下面介紹個很討虛擬主機提供商喜歡的特性。增強的ini文件支持
CGI/ FastCGI支持類似.htaccess的INI配置
每個目錄下都可以有INI設置,ini的文件名取決於php.ini的配置,但是[PATH=/var/www/domain.com], [HOST=]段落的設置用戶不能修改。
增強的error handling
允許在ini文件中定義變數和常量,可以在程序中直接調用。
附上一段ini文件的例子PLAIN TEXTCODE:#用戶自定義的php.ini文件名(.htaccess). 默認是”.user.ini”
user_ini.filename=”.user.ini”
#如果要禁用這個特性,設置為空值即可
user_ini.filename=
#用戶自定義的php.ini文件TTL時長(time-to-live),單位為秒,我理解為緩存過期時間。默認為300秒
user_ini.cache_ttl=300
[PATH=/var/www/domain.com]
variables_order = GPC
safe_mode =1
[my variables]
somevar = 「1234」
anothervar = ${somevar}; anothervar == somevar
[ini arrays]
foo[bar]=1
foo[123]=2
foo[]=3
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/185942.html