一些關於提高PHP效率和最佳化的方案建議
這篇文章給大家分享的內容是一些關於提高PHP效率和優化的方案建議,有著一定的參考價值,有需要的朋友可以參考一下
1 字串
1.1 少用正規表示式
#能用PHP內部字串運算子的情況下,盡量用他們,不要用正規表示式,因為其效率高於正則。
沒得說,正則最耗性能。
str_replace函數要比preg_replace快得多,strtr函數又比str_replace來得快。
有沒有你漏掉的好用的函數?
例如:strpbrk()、strncasecmp()、strpos()、strrpos()、stripos()、strripos()。
1.2 字元替換
如果需要轉換的全是單一字符,用字串作為strtr() 函數完成替換,而不是數組:
$addr = strtr($addr, "abcd", "efgh"); // 建議
$addr = strtr($addr, array('a' => 'e', )); // 不建議
效率提升:10 倍。
str_replace字元替換比正規替換preg_replace快,但strtr比str_replace又快1/4。
另外,不要做無謂的替換,即使沒有替換,str_replace也會為其參數分配記憶體。很慢!
用 strpos 先查找(非常快),看是否需要替換,如果需要,再替換。
如果需要替換,效率幾乎相等,差異在 0.1% 左右。
如果不需要替換:用 strpos 快 200%。
1.3 壓縮大的字串
使用 gzcompress() 和 gzuncompress() 對容量大的字串進行壓縮和解壓,再存入和取出資料庫。
這種內建的函數使用gzip演算法,能壓縮字串90%。
1.4 echo 輸出
echo 字串用逗號代替點連接符號更快些。
雖然,echo是一種語言結構,不是真正的函數。
但是,它可以把逗號隔開的多個字串當作「函數」參數傳入,所以速度會更快。
echo $str1, $str2; // 速度快
echo $str1 . $str2; // 速度稍慢
1.5 盡量使用單引號##PHP引擎允許使用單引號和雙引號來封裝字串變量,但是它們的速度是有很大的差異的!
使用雙引號的字串會告訴 PHP 引擎,先去讀取字串內容,找出其中的變量,並改為變數對應的值。
一般來說字串是沒有變數的,使用雙引號會導致效能不佳。
最好使用字串連接,而不是雙引號字串。
$output = "This is a plain string"; // 不好的实践 $output = 'This is a plain string'; // 好的实践 $type = "mixed"; // 不好的实践 $output = "This is a $type string"; $type = 'mixed'; // 好的实践 $output = 'This is a ' . $type . ' string';
1.6 使用isset取代strlen在檢驗字串長度時,我們第一個想法會使用 strlen() 函數。
此函數執行起來相當快,因為它不做任何計算,只傳回在zval結構(C的內建資料結構,用於儲存PHP變數)中儲存的已知字串長度。
但是,由於strlen()是函數,多多少少會有些慢,因為函數呼叫會經過諸多步驟,如字母小寫化、雜湊查找,會跟著被呼叫的函數一起執行。
在某些情況下,你可以使用 isset() 技巧加速執行你的程式碼。例如:
if (strlen($foo) < 5) { echo "Foo is too short"; } // 使用isset() if (!isset($foo{5})) { echo "Foo is too short"; }
1.7 用split分割字串#在分割字串時,split()要比explode()快。
0.001813 - 0.002271 seconds (avg 0.002042 seconds)
explode()
0.001678 - 0.003626 seconds#avg 0.001678 - 0.003626 seconds# #1.8 echo效率高於print
因為echo沒有回傳值,print回傳一個整數。
開啟Apache的mod_deflate進行壓縮,或是開啟ob_start將內容放進緩衝區,可以改善效能問題。
2 語句
2.1 最好不用@
用@掩盖错误会降低脚本运行速度,并且在后台有很多额外操作。
用@比起不用,效率差距 3 倍。特别不要在循环中使用@。
在 5 次循环的测试中,即使是先用error_reporting(0)关掉错误,循环完成后再打开,都比用@快。
2.2 避免使用魔术方法
对于__开头的函数就命名为魔术函数,它们都在特定的条件下触发。
这些魔术函数包括:__construct()、__get()、__call()、__autoload()等等。
以__autoload() 为例,如果不能将类名与实际的磁盘文件对应起来,将不得不做大量的文件存在判断。
而判断文件存在需要磁盘I/O操作,众所周知,磁盘I/O操作的效率很低,因此这才是使得autoload机制效率降低的原因。
因此,在系统设计时,需要定义一套清晰的、将类名与实际磁盘文件映射的机制。
这个规则越简单越明确,__autoload()机制的效率就越高。
autoload机制并不是天然的效率低下,只有滥用autoload、设计不好的自动装载函数,才会导致其效率的降低.
所以说,尽量避免使用__autoload等魔术方法,有待商榷。
2.3 别在循环里用函数
例如:
for($x=0; $x < count($array); $x++) { }
这种写法在每次循环的时候都会调用 count() 函数,效率大大降低,建议这样:
$len = count($array); for($x=0; $x < $len; $x++) { }
让函数在循环外面一次获得循环次数。
2.4 使用三元运算符
在简单的判断语句中,三元运算符?:更简洁高效。
2.5 使用选择分支语句
switch、case好于使用多个if、else if语句,并且代码更加容易阅读和维护。
2.6 屏蔽敏感信息
使用 error_reporting() 函数来预防潜在的敏感信息显示给用户。
理想的错误报告应该被完全禁用在php.ini文件里
如果用的是共享虚拟主机,php.ini不能修改,最好添加 error_reporting() 函数。
放在每个脚本文件的第一行,或者用require_once()来加载,能有效的保护敏感的SQL查询和路径,在出错时不被显示。
2.7 不实用段标签
不要使用开始标志的缩写形式,你正在使用这样的符号吗,应该用完整的当然,如果是输出变量,用= $value ?>这种方式是鼓励的,可以是代码更加简洁。
2.8 纯PHP代码不加结束标记
如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记?>。
这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图。
2.9 永远不要使用register_globals和magic quotes
这是两个很古老的功能,在当时(十年前)也许是一个好方法,但现在看来并非如此。
老版本的PHP在安装时会默认打开这两个功能,这会引起安全漏洞、编程错误及其他的问题。
如只有用户输入了数据时才会创建变量等。
PHP5.4.0开始这两个功能都被舍弃了,所以每个程序员都应该避免使用。
如果你过去的程序有使用这两项功能,那就尽快将其剔除吧。
3 函数
3.1 尽量使用PHP内部函数
内置函数使用C语言实现,并且经过PHP官方优化,效率更高。
3.2 使用绝对路径
在include和require中尽量使用绝对路径。
如果包含相对路径,PHP会在include_path里面遍历查找文件。
用绝对路径就会避免此类问题,解析路径所需的时间会更少。
3.3 包含文件
尽量不要用require_once和include_once包含文件,它们多一个判断文件是否被引用的过程,能不用尽量不用。
而使用require、include方法代替。
鸟哥在其博客中就多次声明,尽量不要用require_once和include_once。
3.4 函数快于类方法
调用只有一个参数、并且函数体为空的函数,花费的时间等于7-8次$localvar++运算。
而同一功能的类方法大约为15次$localvar++运算。
3.5 用子类方法
基类里面只放能重用的方法,其他功能尽量放在子类中实现,子类里方法的性能优于在基类中。
3.6 类的性能和其方法数量没有关系
新添加10个或多个方法到测试的类后,性能没什么差异。
3.7 读取文件内容
在可以用file_get_contents()替代file()、fopen()、feof()、fgets()等系列方法的情况下,尽量用file_get_contents()。
因为他的效率高得多!
3.8 引用传递参数
通过参数地址引用的方式,实现函数多个返回值,这比按值传递效率高。
方法是在参数变量前加个 &。
3.9 方法不要细分得过多
仔细想想你真正打算重用的是哪些代码?
3.10 尽量静态化
如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍。
当然了,这个测试方法需要在十万级以上次执行,效果才明显。
其实,静态方法和非静态方法的效率主要区别在内存。
静态方法在程序开始时生成内存,实例方法(非静态方法)在程序运行中生成内存。
所以,静态方法可以直接调用,实例方法要先成生实例再调用,静态速度很快,但是多了会占内存。
任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。
静态内存是连续的,因为是在程序开始时就生成了,而实例方法申请的是离散的空间,所以当然没有静态方法快。
静态方法始终调用同一块内存,其缺点就是不能自动进行销毁,而实例化可以销毁。
3.11 用C扩展方式实现
如果在程式碼中存在大量耗時的函數,可以考慮以C擴充的方式實作它們。
4 變數
4.1 及時銷毀變數
陣列、物件和GLOBAL變數在PHP 中特別佔記憶體的,這個由於PHP的底層的zend引擎引起的。
一般來說,PHP數組的記憶體利用率只有 1/10。
也就是說,一個在C語言裡面100M 記憶體的數組,在PHP裡面就要1G。
特別是,在PHP作為後台伺服器的系統中,常常會出現記憶體耗費太大的問題。
4.2 使用$_SERVER變數
如果你需要得到腳本執行的時間,$_SERVER['REQUSET_TIME']優於time()。
一個是現成就可以直接用,一個還需要函數得到的結果。
4.3 方法建立局部變數
在類別的方法裡建立局部變數速度最快,幾乎和在方法裡呼叫局部變數一樣快。
4.4 局部變數比全域變數快
由於局部變數是存在堆疊中的。
當一個函數佔用的堆疊空間不是很大的時候,這部分記憶體很有可能全部命中cache,CPU存取的效率是很高的。
相反,如果一個函數同時使用全域變數和局部變量,當這兩段位址相差較大時,cpu cache需要來回切換,效率會下降。
4.5 局部變數而不是物件屬性
建立一個物件屬性(類別裡面的變量,例如:$this->prop )比局部變數慢3倍。
4.6 提前宣告局部變數
建立一個未宣告的局部變量,要比建立一個已經定義過的局部變數慢9-10倍。
4.7 謹慎宣告全域變數
宣告一個未被任何一個函數使用過的全域變量,也會使效能降低。
這和宣告相同數量的局部變數一樣,PHP可能會去檢查這個全域變數是否存在。
4.8 使用 $i遞增
當執行變數$i的遞增或遞減時,$i 會比 $i慢一些。
這種差異是PHP特有的,並不適用於其他語言,所以請不要修改你的C或Java程式碼,並指望它們能立即變快,沒用的。
$i更快是因為它只需要3個指令(opcodes),$i 則需要4個指令。
後置遞增實際上會產生一個臨時變量,這個臨時變量隨後被遞增。
而前置遞增直接在原值上遞增。
這是最優化處理的一種,正如Zend的PHP優化器所做的那樣。
牢記,這個最佳化處理不失為一個好主意,因為不是所有的指令優化器都會做同樣的最佳化處理。
4.9 不要隨便複製變數
有時候為了讓PHP 程式碼更整潔,有些PHP 新手(包括我)會把預先定義好的變量,複製到一個名字比較短的變數中。
其實這樣做的結果是增加了一倍的記憶體消耗,只會讓程式更慢。
試想一下,在下面的例子中,如果使用者惡意插入 512KB 位元組的文字,就會導致 1MB 的記憶體被消耗!
// 不好的实践 $description = $_POST['description']; echo $description; // 好的实践 echo $_POST['description'];
4.10 循环内部不要声明变量
尤其是大变量,这好像不只是PHP里面要注意的问题吧?
4.11 一定要对变量进行初始化
这里的“初始化”指的是“声明”。
当需要没有初始化的变量,PHP解释器会自动创建一个变量,但依靠这个特性来编程并不是一个好主意。
这会造成程序的粗糙,或者使代码变得另人迷惑。
因为你需要探寻这个变量是从哪里开始被创建的。
另外,对一个没有初始化的变量进行递增操作要比初始化过的来得慢。
所以对变量进行初始化会是个不错的主意。
5 数组
5.1 用字符串而不是数组作为参数
如果一个函数既能接受数组,又能接受简单字符做为参数,那么尽量用字符作为参数。
例如,字符替换函数,参数列表并不是太长,就可以考虑额外写一段替换代码。
使得每次传递参数都是一个字符,而不是接受数组做为查找和替换参数。
5.2 数组元素加引号
$row['id']比$row[id]速度快7倍。
如果不带引号,例如$a[name],那么PHP会首先检查有没有define定义的name常量
如果有,就用这个常量值作为数组键值。如果没有,再查找键值为字符串'name'的数组元素。
多了一个查找判断的过程,所以建议养成数组键名加引号的习惯。
正如上面字符串部分所述,用'又比用"速度更快。
5.3 多维数组操作
多维数组尽量不要循环嵌套赋值。
5.4 循环用foreach
尽量用foreach代替while和for循环,效率更高。
6 架构
6.1 压缩输出
在php.ini中开启gzip压缩:
zlib.output_compression = On
zlib.output_compression_level = (level)
level可能是1-9之间的数字,你可以设置不同的数字。
几乎所有的浏览器都支持Gzip的压缩方式,gzip可以降低80%的输出.
付出的代价是,大概增加了10%的cpu计算量。
但是还是会赚到了,因为带宽减少了,页面加载会变得很快。
如果你使用apache,也可以激活mod_gzip模块。
6.2 静态化页面
Apache/Nginx解析一个PHP脚本的时间,要比解析一个静态HTML页面慢2至10倍。
所以尽量使页面静态化,或使用静态HTML页面。
6.3 将PHP升级到最新版
提高性能的最简单的方式是不断升级、更新PHP版本。
6.4 利用PHP的扩展
一直以来,大家都在抱怨PHP内容太过繁杂。
最近几年来,开发人员作出了相应的努力,移除了项目中的一些冗余特征。
即便如此,可用库以及其它扩展的数量还是很可观。
甚至一些开发人员开始考虑实施自己的扩展方案。
6.5 PHP缓存
一般情况下,PHP脚本被PHP引擎编译后执行,会被转换成机器语言,也称为操作码。
如果PHP脚本反复编译得到相同的结果,为什么不完全跳过编译过程呢?
PHP加速器缓存了编译后的机器码,允许代码根据要求立即执行,而不经过繁琐的编译过程。
对PHP开发人员而言,目前提供了两种可用的缓存方案。
一种是APC(Alternative PHP Cache,可选PHP缓存),它是一个可以通过PEAR安装的开源加速器。
另一种流行的方案是OPCode,也就是操作码缓存技术。
6.6 使用NoSQL缓存
Memchached或者Redis都可以。
这些是高性能的分布式内存对象缓存系统,能提高动态网络应用程序性能,减轻数据库的负担。
这对运算码 (OPcode)的缓存也很有用,使得脚本不必为每个请求重新编译。
以上是一些關於提高PHP效率和最佳化的方案建議的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。
