搜尋
首頁後端開發PHP7一起看看php7帶來的效能升級

一起看看php7帶來的效能升級

前言
本文是一篇講座聽後+後續研究的總結。
話說當年追時髦,php7一出就給電腦立刻裝上了,php5和php7共存,也是立刻寫了個超級耗時的循環腳本測了一番,確實php7給力很多,然後也是注意了一些新增的特性與一些丟棄掉的用法。
由於php升級乃頭等大事,公司近期才打算升級,所以之前一直只能私下欣賞php7帶來的快感,負責升級的小伙伴搞了個分享,還挺全的,此處mark一下,當作筆記。

相關免費學習推薦:微信小程式開發

#主要研究問題:
1.PHP7帶來的好處
2.PHP7帶來的新東西
3.PHP7帶來的廢棄
4.PHP7帶來的變更
5.如何充分發揮PHP7的性能
6。如何更好的寫程式碼來迎接PHP7?
7.如何升級當前專案程式碼來相容PHP7?

#PHP7帶來的好處
#是的,性能上的大幅度提升,可以省機器,可以省錢。


PHP7帶來的新東西
1.類型的宣告
可以使用字串(string), 整數(int) , 浮點數(float), 以及布林值(bool),來宣告函數的參數型別與函數傳回值。

declare(strict_types=1);
function add(int $a, int $b): int { return $a+$b;}
echo add(1, 2);
echo add(1.5, 2.6);

php5是無法執行上面程式碼的,php7執行的時候會先輸出一個3和一個報錯( Argument 1 passed to add() must be of the type integer, float given);

標量類型宣告有兩種模式: 強制(預設) 和嚴格模式。
declare(strict_types=1),必須放在檔案的第一行執行程式碼,目前檔案有效!

2.set_exception_handler() 不再保證收到的一定是Exception 物件
在PHP 7 中,很多致命錯誤以及可恢復的致命錯誤,都被轉換為異常來處理了。這些異常繼承自 Error 類,此類實作了 Throwable 介面 (所有異常都實作了這個基礎介面)。

PHP7進一步方便開發者處理, 讓開發者對程式的掌控能力更強. 因為在預設情況下, Error會直接導致程式中斷, 而PHP7則提供捕獲並且處理的能力, 讓程式繼續執行下去, 為程式設計師提供更靈活的選擇。

3.新增運算子「」
語法:$c = $a $b

如果$a > $b, $c 的值為1

如果$a == $b, $c 的值為0

如果$a

4.新增運算元「??」
如果變數存在且值不為NULL, 它就會傳回自身的值,否則傳回它的第二個操作數。

//原写法$username = isset($_GET['user]) ? $_GET['user] : 'nobody';
//现在$username = $_GET['user'] ?? 'nobody';

5.define() 定義常數數組

define('ARR',['a','b']);
echo ARR[1];// a

6.AST: Abstract Syntax Tree, 抽象語法樹
AST在PHP編譯過程作為一個中間件的角色, 替換原來直接從解釋器吐出opcode的方式, 讓解釋器(parser)和編譯器(compliler)解耦, 可以減少一些Hack代碼, 同時, 讓實現更容易理解和可維護.

PHP5 : PHP程式碼-> Parser語法解析-> OPCODE -> 執行
PHP7 : PHP程式碼-> Parser語法解析-> AST -> OPCODE -> ;執行

7.匿名函數

$anonymous_func = function(){return 'function';};
echo $anonymous_func(); // 输出function

8.Unicode字元格式支援(echo “\u{9999}”)
9.Unserialize 提供過濾特性

防止非法資料進行程式碼注入,提供了更安全的反序列化資料。

10.命名空間參考最佳化

// PHP7以前语法的写法 
use FooLibrary\Bar\Baz\ClassA; 
use FooLibrary\Bar\Baz\ClassB; 
// PHP7新语法写法 
use FooLibrary\Bar\Baz\{ ClassA, ClassB};

PHP7帶來的廢棄
1、廢棄擴充功能
Ereg 正規表示式
mssql
mysql
sybase_ct

2、廢棄的特性
不能使用同名的建構子
實例方法不能用靜態方法的方式呼叫

3、廢棄的函式
方法呼叫

call_user_method() 
call_user_method_array()

應該要採用call_user_func () 和call_user_func_array()

加密相關函數

mcrypt_generic_end() 
mcrypt_ecb() 
mcrypt_cbc() 
mcrypt_cfb() 
mcrypt_ofb()

注意: PHP7.1 以後mcrypt_*序列函數都會移除。建議使用:openssl 序列函數

雜項

set_magic_quotes_runtime 
set_socket_blocking 
Split 
imagepsbbox() 
imagepsencodefont() 
imagepsextendfont() 
imagepsfreefont() 
imagepsloadfont() 
imagepsslantfont() 
imagepstext()

4、廢棄的用法
$HTTP_RAW_POST_DATA 變數被移除, 使用php://input來代

ini檔案裡面不再支援#開頭的註解, 使用」;”

移除了ASP格式的支援和腳本語法的支援: 和<code>

PHP7帶來的變更
1.字串處理機制修改
含有十六進位字元的字串不再視為數字, 也不再區別對待.

var_dump("0x123" == "291"); // false
var_dump(is_numeric("0x123")); // false
var_dump("0xe" + "0x1"); // 0
var_dump(substr("f00", "0x1")) // foo

2.整數處理機制修改
Int64支援, 統一不同平台下的整數長度, 字串和檔案上傳都支援大於2GB. 64位元PHP7字串長度可以超過2^31次方位元組.

// 无效的八进制数字(包含大于7的数字)会报编译错误$i = 0681; // 老版本php会把无效数字忽略。
// 位移负的位置会产生异常var_dump(1 >> -1);
// 左位移超出位数则返回0var_dump(1 << 64);// 0
// 右位移超出会返回0或者-1var_dump(100 >> 32);// 0 var_dump(-100 >> 32);// -1

3.參數處理機制修改
不支援重複參數命名

#
function func(a,a,b, c,c,c) {} ;

报错

func_get_arg()和func_get_args()这两个方法返回参数当前的值, 而不是传入时的值, 当前的值有可能会被修改

所以需要注意,在函数第一行最好就给记录下来,否则后续有修改的话,再读取就不是传进来的初始值了。

function foo($x) {
 $x++;
 echo func_get_arg(0);
}
foo(1); //返回2


4.foreach修改
foreach()循环对数组内部指针不再起作用

$arr = [1,2,3];
foreach ($arr as &$val) {
 echo current($arr);// php7 全返回0
}

按照值进行循环的时候, foreach是对该数组的拷贝操作

$arr = [1,2,3];
foreach ($arr as $val) {
 unset($arr[1]);
}
var_dump($arr);

最新的php7依旧会打印出[1,2,3]。(ps:7.0.0不行)
老的会打印出[1,3]

按照引用进行循环的时候, 对数组的修改会影响循环

$arr = [1];
foreach ($arr as $val) {
 var_dump($val);
 $arr[1]=2;
}

最新的php7依旧会追加新增元素的循环。(ps:7.0.0不行)

5. list修改
不再按照相反的顺序赋值

//$arr将会是[1,2,3]而不是之前的[3,2,1]
list($arr[], $arr[], $arr[]) = [1,2,3];

不再支持字符串拆分功能

// $x = null 并且 $y = null
$str = &#39;xy&#39;;
list($x, $y) = $str;

空的list()赋值不再允许

list() = [123];

list()现在也适用于数组对象

list($a, $b) = (object)new ArrayObject([0, 1]);

6.变量处理机制修改
对变量、属性和方法的间接调用现在将严格遵循从左到右的顺序来解析,而不是之前的混杂着几个特殊案例的情况。 下面这张表说明了这个解析顺序的变化。

 

引用赋值时自动创建的数组元素或者对象属性顺序和以前不同了

$arr = [];
$arr[&#39;a&#39;] = &$arr[&#39;b&#39;];
$arr[&#39;b&#39;] = 1;
// php7: [&#39;a&#39; => 1, &#39;b&#39; => 1]
// php5: [&#39;b&#39; => 1, &#39;a&#39; => 1]

7.杂项
1.debug_zval_dump() 现在打印 “int” 替代 “long”, 打印 “float” 替代 “double”

2.dirname() 增加了可选的第二个参数, depth, 获取当前目录向上 depth 级父目录的名称。

3.getrusage() 现在支持 Windows.mktime() and gmmktime() 函数不再接受 is_dst 参数。

4.preg_replace() 函数不再支持 “\e” (PREG_REPLACE_EVAL). 应当使用 preg_replace_callback() 替代。

5.setlocale() 函数不再接受 category 传入字符串。 应当使用 LC_* 常量。

6.exec(), system() and passthru() 函数对 NULL 增加了保护.

7.shmop_open() 现在返回一个资源而非一个int, 这个资源可以传给shmop_size(), shmop_write(), shmop_read(), shmop_close() 和 shmop_delete().

8.为了避免内存泄露,xml_set_object() 现在在执行结束时需要手动清除 $parse。

9.curl_setopt 设置项CURLOPT_SAFE_UPLOAD变更

TRUE 禁用 @ 前缀在 CURLOPT_POSTFIELDS 中发送文件。 意味着 @ 可以在字段中安全得使用了。 可使用 CURLFile作为上传的代替。
PHP 5.5.0 中添加,默认值 FALSE。 PHP 5.6.0 改默认值为 TRUE。. PHP 7 删除了此选项, 必须使用 CURLFile interface 来上传文件。

如何充分发挥PHP7的性能
1.开启Opcache

zend_extension=opcache.so 
opcache.enable=1 
opcache.enable_cli=1

2.使用GCC 4.8以上进行编译
只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持, 这个会带来5%左右的性能提升(Wordpres的QPS角度衡量)

3.开启HugePage (根据系统内存决定)


4.PGO (Profile Guided Optimization)
第一次编译成功后,用项目代码去训练PHP,会产生一些profile信息,最后根据这些信息第二次gcc编译PHP就可以得到量身定做的PHP7

需要选择在你要优化的场景中: 访问量最大的, 耗时最多的, 资源消耗最重的一个页面.

相关学习推荐:小程序开发教程

以上是一起看看php7帶來的效能升級的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版

SublimeText3 Mac版

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

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具