日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

mach空串 php preg_PHP 优化详解

發布時間:2025/4/16 php 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mach空串 php preg_PHP 优化详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

筆者收集的這些技巧來源較廣,完整性不能保證。 由于數量較多,這些優化技巧沒有經過測試。請各位看官在使用之前自行測試,畢竟這些技巧是否能派上用場,還是需要由PHP所在的獨特環境所決定的。

目錄索引

找到瓶頸(Finding the Bottleneck)

面對一個性能問題是,第一步永遠是找到問題產生的原因,而不是去看技巧列表。搞明白產生瓶頸的原因,找到目標并且實施修復,然后再重新測試。查找瓶頸只是萬里長征的第一步,這里有些常用技巧,希望對最重要的第一步找到瓶頸能有所幫助。

使用監控方法(比如監控寶),進行benchmark和監控,網絡,特別是網絡狀況瞬息萬變,做得好的話5分鐘就可以找到瓶頸。

剖析代碼。必須了解那部分代碼耗時最多,在這些地方多多關注。

想找到瓶頸,請檢查每個資源請求(比如,網絡、CPU、內存、共享內存、文件系統、進程管理、網絡連接等等……)

先對迭代結構和復雜的代碼進行benchmark

在在真實負載下用真實數據進行真實測試,當然,如果可以最好用產品服務器。

緩存 (Caching)

有些人認為緩存是解決性能問題最有效的辦法之一,試試這些:

使用OPCODE(操作碼)緩存,這樣腳本就不會在每次訪問時重新編譯一次。比如:啟用Windows平臺上的windows緩存擴展。可以緩存opcode,文件,相對路徑,session數據和用戶數據。

考慮在多服務器環境下使用分布式緩存

在調用imap_header()之前先調用imap_headers()

編譯 vs. 解釋(Compiling vs. Interpreting)

將PHP源碼編譯成機器碼。動態解釋執行同樣的編譯,但它是按行執行的。編譯為opcode是折中選擇,它可以將PHP源碼翻譯為opcode,之后opcode再轉為機器碼。以下為關于編譯與解釋的相關技巧:

上線之前將PHP代碼編譯為機器碼。opcode緩存盡管并不是最好的選擇,但依舊比解釋型來得強。或者,考慮將PHP代碼編譯成一個C擴展。

PHP的opcode編譯器(bcompiler)還不能在產品環境中使用,但是開發者應該關注http://php.net/manual/en/book.bcompiler.php.

代碼減肥 (Content Reduction)

越少越塊。 這些技巧可以幫助減少代碼:

每頁提供更少的功能

清理網頁內容

如果解釋型執行,請清理注釋和其他空白

減少數據庫查詢

多線程與多進程(Multithreading & Multiprocessing)

由快到慢依次為:

多線程(單一進程中)

多進程(比如,pcntl_fork,計劃任務)

單進程(一行又一行)

PHP不支持多線程,但是可以用C寫多線程的PHP擴展。有一些辦法可以使用多進程或模擬多進程,但支持的并不是很好,沒準兒比單進程還慢。

字符串(Strings)

字符串處理,是大多數編程語言中最常用的操作之一。這里有些技巧可以幫我們讓字符串處理速度更快一些:

PHP的連接運算(點運算),是最快的鏈接方式

避免在print中鏈接字符串,用逗號分割后用ECHO

盡可能使用str_前綴的字符串函數替代正則表達式

pos()比preg_mach()和ereg()都快

有人說單引號包裹字符串比雙引號更快,有人說沒有區別。當然,如果想在字符串中引用變量,單引號沒戲。

如果想判斷字符串長度是否小于某值(比如5),請使用isset($s[4])<5。

如需將多個小字符串連接成一個大字符串,試著先開啟ob_start輸出緩存,再用echo輸出到緩沖區,完成后使用ob_get_contents讀取字符串

正則表達式(Regular Expressions)

正則表達式為們帶來了靈活多樣的比較與查找字符串的方法,單他的性能開銷卻著實不低

盡可能使用STR_前綴的字符串處理函數代替正則表達式

使用[aeiou]的不是(a|e|i|o|u)

正則表達式越簡單速度越快

盡可能不要設置PCRE_DOTALL修飾符

用^.*代替.*

簡化正則表達式。(比如使用a*代替(a+)*

迭代結構 (Iteration Constructs (for, while))

迭代(重復,循環)是最基本的結構化編程方法,很難想像有不使用它的程序。這里有些技巧,幫助我們改進迭代結構的性能:

盡可能講代碼移出到循環外(函數調用、SQL查詢等等……)

使用i=maxval;while(i–)代替for(i=0;i

使用foreach迭代集合與數組

選擇結構 (Selection Constructs (if, switch))

與迭代結構相同,選擇結構也是最基本的結構化變成方法。以下技巧或許能改善性能:

switches和else-if中,應該將最近常出現true的列在前面,較少出現true的請靠后

有人說if-else比swtich/case快,當然,有人反對。

用elseif替代else if.

函數與參數 (Functions & Parameters)

將函數的代碼分解成小函數代碼可以消除冗余,讓代碼具有可讀性,但代價是什么?這里有些技巧,以幫助更好的使用函數:

引用傳遞出對象和數組,而不是傳值

如果只在一個地方使用,使用內聯。如果在多個地方調用,考慮內聯,但請注意可維護性

了解你所用函數的復雜度。比如similar_text()為O(N^3),這意味著字符串長度增加一倍,處理時間將增加8倍

不要通過“返回引用”來提升性能,引擎會自動優化它。

以常規方式調用函數,而不是使用call_user_func_array()或eval()

面向對象結構 (Object-Oriented Constructs)

PHP的面向對象特性,可能會影響到性能。以下提示可以幫助我們盡量減少這種影響:

不是一切都需要面向對象, 性能的損失可能會超過其優點本身

創建對象比較慢

如果可以,盡可能時候用數組而不是對象

如果一個方法可以靜態化,請靜態聲明

函數調用比派生類方法調用要快,派生類方法調用比基類調用要快

考慮將基類中最常用的代碼復制到派生類中,但要注意維護性隱患

避免使用原生的getters與setters。如果不需要他們,請刪除并且屬性公開

創建復雜的PHP類時,考慮使用單件模式

Session處理 (Session Handling)

創建sessions有很多好處,但有時會產生沒必要的性能開支。以下技巧可以幫助我們最大限度減少性能開支:

不要使用auto_start

不要啟用use_trans_sid

將session_cache_limited設置為private_no_expire

為虛擬主機(vhost)中的每個用戶分配自己的目錄

使用基于內存的session處理,而不是基于文件的session處理

類型轉換 (Type Casting)

從一種類型轉換為另一種類型需要成本

壓縮(Compression)

在傳輸前,壓縮文本和數據:

使用ob_start()在代碼起始處

使用ob_gzhandler()可以下載提速,但是注意CPU開支

Apache的mod_gzip模塊可以即使壓縮

錯誤處理(Error Handling)

錯誤處理影響性能。我們能做的是:

記錄錯誤日志,別再使用“@”抑制錯誤報告,抑制對性能一樣有影響

不要只檢查錯誤日志,警告日志一樣需要處理

聲明、定義與范圍(Declarations, Definitions, & Scope)

創建一個變量、數組或者對象,對性能都有影響:

有人說,聲明和使用全局變量/對象,比局部變量/對象要快,有人反對。請測試再決定。

在使用變量前聲明所有變量,不要聲明不使用的變量

在循環中盡可能使用$a[],避免使用$a=array(…)

內存泄漏(Memory Leaks)

如果內存分配后不釋放,這絕對是個問題:

堅持釋放資源,不要指望自帶/自動的垃圾回收

使用完后盡量注銷(unset)變量,尤其是資源類和大數組類型的

使用完畢就關閉數據庫連接

每次使用ob_start(),記得ob_end_flush()或者ob_end_clean()

不要重復發明輪子(Don’t Reinvent the Wheel)

為什么要花費時間去解決別人已經解決的問題?

了解PHP,了解它的功能和擴展。如果你不知道,可能會無法利用一些現成的功能

使用自帶的數組和字符串函數,它們絕對是性能最好的。

前人發明的輪子,并不意味著在你的環境下吸能是最好的,多多測試

代碼優化(Code Optimization)

使用一個opcode optimizer

如果將被解釋運行,請精簡源碼

使用RAM(Using RAM Instead of DASD)

RAM比磁盤快很多很多,使用RAM可以提升一些性能:

移動文件到Ramdisk

使用基于內存的session處理,而不是基于文件的session處理

使用服務(Using Services (e.g., SQL))

SQL經常被用來訪問關系型數據庫,但我們的PHP代碼可以訪問許多不同的服務。下面是一些訪問服務是需要牢記的:

不要一遍又一遍地問服務器向東的事情。使用memoization緩存第一次的結果,以后訪問直奔緩存;

在SQL中,使用mysql_fetch_assoc()代替mysql_fetch_array(),可以減少結果集中的整數索引。以字段名訪問結果集,而不用索引數字。

對于Oracle數據庫,如果沒有足夠的可用內存,增加oci8.default_prefetch。將oci8.statement_cache_size設置為應用中的語句數

請使用mysqli_fetch_array()替換mysqli_fetch_all(), 除非結果集將發送到其他層進行處理。

安裝與配置(Installation & Configuration)

安裝與配置PHP時,請考慮性能:

添加更多內存

刪除競爭性的應用與服務

只編譯所需要用的擴展

將PHP靜態編譯進APACHE

使用-O3 CFLAGS開啟所有編譯器優化

只安裝所需使用的模塊

升級到最新版本的次要版本。主板本升級,等到第一次bug修復后再進行,當然,也別等太久

為多CPU環境進行配置

使用 -enable-inline-optimization

設置session.save_handler=mm ,以 -with-mmto編譯,使用共享內存

使用RAM disk

關閉resister_global和magic_quotes_*

關閉expose_php

關閉 always_populate_raw_post_data 除非你必須使用它

非命令行模式下請關閉register_argc_argv

只在.php文件中使用PHP

優化max_execution_time, max_input_time, memory_limit與output_buffering的參數

將Apache配置文件中allowoverride設置為none提升文件/目錄的訪問速度

使用-march, -mcpu, -msse, -mmmx, and -mfpmath=sseto使CPU最優化

使用MySQL原生驅動(mysqlnd)替換libmysql、mysqli擴展以及PDO MYSQL驅動

關閉 register_globals、register_long_arrays以及register_argc_argv. 開啟auto_globals_jit.

其他(Other)

還有些技巧比較難歸類:

使用include()、require(),避免使用include_once()和require_once()

在include()/require()中使用絕對路徑

靜態HTML被PHP生成的HTML要快

使用ctype_alnum、ctype_alpha以及ctype_digit代替正則表達式

使用簡單的servlets或CGI

代碼在產品環境中使用時,盡可能寫日志

使用輸出緩沖

請使用isset($a)代替比較$a==null;請使用$a===null代替is_nul($a)

需要腳本開始執行時間,請直接讀取$_SERVER[’REQUEST_TIME’],而不是使用time()

使用echo替代print

使用前自增(++i)代替后自增(i++),大多數編譯器現在都會優化,但是他們不優化時,請保持這樣的寫法。

處理XML,使用正則表達式代替DOM或者SAX

HASH算法:md4, md5, crc32, crc32b, sha1比其他的散列速度都要快

使用spl_autoload_extensions時,文件擴展名請按最常用–>最不常用的順序,盡量排除掉壓根不用的。

使用fsockopen或fopen時,使用IP地址代替域名;如果只有一個域名,使用gethostbyname()可以獲取IP地址。使用cURL速度會更快。

但凡可能,用靜態內容代替動態內容。

總結

以上是生活随笔為你收集整理的mach空串 php preg_PHP 优化详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。