php7如何使用xhprof测试php性能?(方法介绍)
介绍
1 背景
PHP的xhprof扩展Facebook不再进行更新和维护,因为Faceboo已经全面使用HHVM,不再使用PHP zend引擎。
xhprof不支持新版本的PHP(PHP7),tideways扩展是从xhprof项目fork下来继续进行维护的,目前支持PHP 7.2, 7.1, 7.0, 5.6 and 5.5 。
tideways是开源项目,它收费的只是UI服务,其实 xhgui完全可以满足我们日常的需求
2 功能
tideways是用来测试PHP性能的扩展,它能获取PHP执行的整个过程中调用的函数、调用函数次数、执行时间、CPU时间、内存占用、内存峰值、总执行时间、总CPU时间、总内存占用、总内存峰值等数据,通过以上数据进行分析,找出PHP的性能瓶颈、分析PHP执行过程等。
3 优点
tideways是一个PHP扩展,结合xhgui,无需在PHP代码中进行埋点来监控代码
可以设置执行频率(例如1/100),无需每个请求都生成执行日志,从而导致性能损失;也可以主动控制是否生成执行日志,通过请求参数来控制(debug=1)
有简单直接的UI对数据进行转化
可以自由的搭配条件进行数据筛选,例如分析某个特定的接口,分析某个时间段的接口请求情况等
4 缺点
虽然是非侵入式的,但是如果对每个接口生成执行日志,那么对CPU和内存的消耗是不可忽略的。
5 实现原理
- tideways扩展负责生成运行日志
- nginx中通过配置fastcgi_param PHP_VALUE auto_prepend_file,在请求开始之前执行auto_prepend_file配置的PHP文件,文件中利用register_shutdown_function方法,在PHP进程结束的时候调用tideways_disable来实现tideways的嵌入,然后将执行日志存入mongodb或者mysql或者文件中,通过xhgui分析之后进行展示,展示形式包括柱状图、瀑布流、火焰图。
应用
接下来介绍两种应用方式:侵入式和非侵入式
侵入式指的是在代码中添加代码,侵入式使用的是默认的ui;
非侵入式指的是在不对代码做任何改动,通过改动nginx/apache实现代码注入,非侵入式使用的是xhgui;
安装 tideways_xhprof
git clone "https://github.com/tideways/php-xhprof-extension.git" cd php-xhprof-extension phpize ./configure --with-php-config=/usr/local/php7/bin/php-config make sudo make install
在php.ini中加上 extension=tideways_xhprof.so
非侵入式:
<?php tideways_xhprof_enable(); // your application code $data = tideways_xhprof_disable(); file_put_contents( sys_get_temp_dir() . "/" . uniqid() . ".yourapp.xhprof", serialize($data) ); // $data = tideways_xhprof_disable(); // file_put_contents( // sys_get_temp_dir() . "/" . date('His', time()) . ".material.xhprof", // serialize($data) // );
这里生成的 .xhprof文件在 tmp 目录下,默认UI也会去tmp目录下查找 .xhprof文件
安装默认UI用来查找数据
git clone git@github.com:phacility/xhprof.git
将此存储库中的xhprof_lib
和xhprof_html
目录安装到您的Web文件夹中,并导航xhprof_html/index.php
以查看跟踪列表。
如果想要看函数调用笔记需要安装Callgraph
安装 Callgraph
Callgraph 实际由三个工具组合而成。
一个是用于生成 C 函数调用树的 cflow 或者 calltree,下文主要介绍 cflow。
一个处理 dot 文本图形语言的工具,由 graphviz 提升。
一个用于把 C 函数调用树转换为 dot 格式的脚本:tree2dotx
以 Ubuntu 为例,分别安装它们:
sudo apt-get install cflow graphviz
接下来安装 tree2dotx 和 Callgraph,这里都默认安装到 /usr/local/bin。
wget -c https://github.com/tinyclub/linux-0.11-lab/raw/master/tools/tree2dotx wget -c https://github.com/tinyclub/linux-0.11-lab/raw/master/tools/callgraph sudo cp tree2dotx callgraph /usr/local/bin sudo chmod +x /usr/local/bin/{tree2dotx,callgraph}
接下来展示两张效果图:
侵入式:
侵入式使用的 xhgui 需要用到 mongodb
安装xhgui
git clone git@github.com:perftools/xhgui.git
配置Nginx
server { listen 80; server_name site.localhost; root /Users/markstory/Sites/awesome-thing/app/webroot/; fastcgi_param PHP_VALUE "auto_prepend_file=/home/www/xhgui/external/header.php"; #这里依据个人目录而配 }
这里的意思是在执行项目php代码前 先执行 header.php,从而达到非侵入式检测性能的目的
xhgui配置(生成日志的频率)
在xhgui的config/config.default.php中,可设置采样命中次数;
return rand(1, 100) === 42; 为1%的采样率,改成return True;则标识每次都采样
'profiler.enable' => function() { // url 中包含debug=1则百分百捕获 if(!empty($_GET['debug'])){ return True; }else{ // 1%采样 return rand(1, 100) === 42; } }
mongodb的配置
xhgui/config/config.default.php
// Can be either mongodb or file. /* 'save.handler' => 'file', 'save.handler.filename' => dirname(__DIR__) . '/cache/' . 'xhgui.data.' . microtime(true) . '_' . substr(md5($url), 0, 6), */ 'save.handler' => 'mongodb', // Needed for file save handler. Beware of file locking. You can adujst this file path // to reduce locking problems (eg uniqid, time ...) //'save.handler.filename' => __DIR__.'/../data/xhgui_'.date('Ymd').'.dat', 'db.host' => 'mongodb://127.0.0.1:27017', 'db.db' => 'xhprof',
mongo服务器的配置
mongo > use xhprof > db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } ) > db.results.ensureIndex( { 'profile.main().wt' : -1 } ) > db.results.ensureIndex( { 'profile.main().mu' : -1 } ) > db.results.ensureIndex( { 'profile.main().cpu' : -1 } ) > db.results.ensureIndex( { 'meta.url' : 1 } )
最后展示几张xhgui的效果图
相关学习推荐:PHP编程从入门到精通
Atas ialah kandungan terperinci php7如何使用xhprof测试php性能?(方法介绍). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Dalam php5, kita boleh menggunakan fungsi fsockopen() untuk mengesan port TCP. Fungsi ini boleh digunakan untuk membuka sambungan rangkaian dan melakukan beberapa komunikasi rangkaian. Tetapi dalam php7, fungsi fsockopen() mungkin menghadapi beberapa masalah, seperti tidak dapat membuka port, tidak dapat menyambung ke pelayan, dsb. Untuk menyelesaikan masalah ini, kita boleh menggunakan fungsi socket_create() dan fungsi socket_connect() untuk mengesan port TCP.

Cara memasang sambungan mongo dalam php7.0: 1. Buat kumpulan pengguna dan pengguna mongodb 2. Muat turun pakej kod sumber mongodb dan letakkan pakej kod sumber dalam direktori "/usr/local/src/" 3. Masukkan direktori "src/" 4. Buka zip pakej kod sumber 5. Buat direktori fail mongodb 6. Salin fail ke direktori "mongodb/" 7. Buat fail konfigurasi mongodb;

Untuk menyelesaikan pemalam yang tidak menunjukkan isu yang dipasang dalam PHP 7.0: Semak konfigurasi pemalam dan dayakan pemalam. Mulakan semula PHP untuk menggunakan perubahan konfigurasi. Semak kebenaran fail pemalam untuk memastikan ia betul. Pasang kebergantungan yang hilang untuk memastikan pemalam berfungsi dengan betul. Jika semua langkah lain gagal, bina semula PHP. Punca lain yang mungkin termasuk versi pemalam yang tidak serasi, memuatkan versi yang salah atau isu konfigurasi PHP.

Sebagai bahasa sebelah pelayan yang popular, PHP memainkan peranan penting dalam pembangunan dan operasi laman web. Walau bagaimanapun, apabila jumlah kod PHP terus meningkat dan kerumitan aplikasi meningkat, kesesakan prestasi semakin berkemungkinan berlaku. Untuk mengelakkan masalah ini, kita perlu melakukan analisis prestasi dan penalaan. Artikel ini akan memperkenalkan secara ringkas cara menggunakan PHP untuk analisis prestasi dan penalaan untuk menyediakan persekitaran berjalan yang lebih cekap untuk aplikasi anda. 1. Alat analisis prestasi PHP 1.XdebugXdebug ialah alat analisis kod yang digunakan secara meluas.

Cara memasang dan menggunakan php7.0: 1. Pergi ke laman web rasmi PHP untuk memuat turun versi pemasangan yang sepadan dengan sistem tempatan 2. Ekstrak fail zip yang dimuat turun ke direktori yang ditentukan 3. Buka tetingkap baris arahan dan pergi ke direktori "E:\php7" Hanya jalankan arahan "php -v".

Penyelesaian biasa untuk persekitaran pelayan PHP termasuk memastikan versi PHP yang betul dipasang dan fail yang berkaitan telah disalin ke direktori modul. Lumpuhkan SELinux buat sementara waktu atau selama-lamanya. Semak dan konfigurasikan PHP.ini untuk memastikan sambungan yang diperlukan telah ditambah dan disediakan dengan betul. Mulakan atau mulakan semula perkhidmatan PHP-FPM. Semak tetapan DNS untuk isu penyelesaian.

Berbanding dengan PHP7, PHP8 mempunyai beberapa kelebihan dan penambahbaikan dari segi prestasi, ciri baharu dan penambahbaikan sintaks, sistem jenis, pengendalian ralat dan sambungan. Walau bagaimanapun, memilih versi yang hendak digunakan bergantung pada keperluan khusus anda dan keadaan projek. Pengenalan terperinci: 1. Peningkatan prestasi, PHP8 memperkenalkan pengkompil Just-in-Time (JIT), yang boleh meningkatkan kelajuan pelaksanaan kod 2. Ciri baharu dan penambahbaikan sintaks, PHP8 menyokong pengisytiharan parameter yang dinamakan dan parameter pilihan, membuat fungsi Panggilan adalah lebih fleksibel kelas tanpa nama, jenis pengisytiharan sifat, dsb.

Persekitaran setempat: sistem redhat6.7. nginx1.12.1, php7.1.0, kod menggunakan masalah rangka kerja yii2: tapak web tempatan perlu menggunakan perkhidmatan elasticsearch. Apabila PHP menggunakan elasticsearch yang dibina pada pelayan tempatan, beban tempatan adalah normal. Apabila saya menggunakan perkhidmatan elasticsearch AWS, beban pada pelayan tempatan selalunya terlalu tinggi. Semak log nginx dan php dan tidak mencari pengecualian. Bilangan sambungan serentak dalam sistem juga tidak tinggi. Pada masa ini, saya memikirkan alat diagnostik jejak yang bos kami beritahu saya. Proses penyahpepijatan: Cari idstrace sub-proses php-
