激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频

PHP執行跟蹤工具phptrace介紹

時(shí)間:2024-06-08 21:33:24 PHP 我要投稿
  • 相關(guān)推薦

PHP執行跟蹤工具phptrace介紹2017

  phptrace 是一個(gè)追蹤(trace)PHP執行流程的工具,你如果用過(guò)strace的話(huà),則可能很容易想到phptrace到底實(shí)現了什么樣的功能。其實(shí),phptrace是類(lèi)strace的一個(gè)實(shí)現,不同的是,strace用來(lái)追蹤系統調用,而phptrace用來(lái)追蹤PHP函數調用。無(wú)論是開(kāi)發(fā)測試還是線(xiàn)上追查問(wèn)題,代碼執行流程往往會(huì )提供許多有用的信息;

  對于系統函數,我們可以用strace來(lái)觀(guān)察其調用信息,然而PHP卻長(cháng)久以來(lái)缺少這么一個(gè)行之有效的工具,因此我們開(kāi)發(fā)了phptrace。

  phptrace 目前包括兩部分功能:

  1. 打印當前PHP調用棧。

  2. 實(shí)時(shí)追蹤PHP調用。

  地址:https://github.com/Qihoo360/phptrace

  打印當前PHP進(jìn)程調用棧

  C程序的調用棧,我們通過(guò)pstack或gdb可以很容易獲取到。PHP作為一種非編譯型的語(yǔ)言,實(shí)際運行在C編寫(xiě)的PHP虛擬機之上。當我們用pstack 或 gdb來(lái)打印PHP的調用棧時(shí),實(shí)際是打印的虛擬機的執行信息。

  比如:

  $ pstack 3130

  #0  0x00000035ee6accc0 in __nanosleep_nocancel () from /lib64/libc.so.6

  #1  0x00000035ee6acb50 in sleep () from /lib64/libc.so.6

  #2  0x0000000000714f23 in zif_sleep ()

  #3  0x00000000008e36cd in execute_internal ()

  #4  0x00007f27b38b2b77 in phptrace_execute_core () from /home/renyongquan/opt/php5.4.35/lib/php/extensions/debug-non-zts-20100525/phptrace.so

  #5  0x00007f27b38b2c04 in phptrace_execute_internal () from /home/renyongquan/opt/php5.4.35/lib/php/extensions/debug-non-zts-20100525/phptrace.so

  #6  0x00000000008e44bc in zend_do_fcall_common_helper_SPEC ()

  3130 為php-fpm的進(jìn)程ID,通過(guò)pstack我們看到了PHP虛擬機調用棧,然而對于一個(gè)PHP開(kāi)發(fā)者來(lái)說(shuō),更感興趣的是PHP的調用棧,你可以通過(guò)phptrace獲。

  $ ./phptrace -p 3130 -s

  phptrace 0.1 demo, published by infra webcore team

  process id = 3130

  script_filename = /home/renyongquan/opt/nginx//webapp/block.php

  [0x7f27b9a99dc8]  sleep /home/renyongquan/opt/nginx/webapp/block.php:6

  [0x7f27b9a99d08]  say /home/renyongquan/opt/nginx/webapp/block.php:3

  [0x7f27b9a99c50]  run /home/renyongquan/opt/nginx/webapp/block.php:10

  -p 參數指定進(jìn)程pid, -s表示我們需要獲取stack信息; -p參數是必需的,并且只能是PHP相關(guān)進(jìn)程(php,php-cli,php-fpm)的pid,這很好理解,因為我們獲取的是PHP的調用信息。-s 如果省略,則phptrace不會(huì )打印調用棧,而是實(shí)時(shí)獲取PHP函數執行流程,即phptrace的第二個(gè)功能,也是其主要功能,F在我們仍然回到stack上來(lái)。

  程序輸出的第一行,是版本信息,第二行顯示了其進(jìn)程PID,第三行是當前執行的PHP腳本,從第四行開(kāi)始就是調用棧信息,從打印的信息可以看出,最外層run函數調用了say函數,最終調用了sleep函數。這時(shí)我們curl訪(fǎng)問(wèn)以下這個(gè)php腳本,顯然會(huì )被堵塞。

  curl http://localhost:8804/block.php

  我們知道,block.php在sleep,但是我們卻不知道其到底要sleep多長(cháng)時(shí)間,如果能獲取到sleep的參數,問(wèn)題便迎刃而解了,這時(shí),就需要用到我們的第二個(gè)功能:實(shí)施追蹤PHP調用。

  實(shí)時(shí)追蹤PHP調用(trace)

  trace功能依賴(lài)于我們實(shí)現的PHP模塊,模塊作為后端實(shí)時(shí)獲取PHP調用信息,前端程序phptrace則解析并打印調用信息,因此,在使用這個(gè)功能之前需要先安裝phptrace擴展。安裝擴展后,重啟fpm,并打開(kāi)trace。

  $ phptrace -p 3130

  curl http://localhost:8804/block.php   #重新訪(fǎng)問(wèn)block.php

  phptrace 打。

  1417486170.247324 run(<Null>)

  1417486170.247336     say($msg = "hello world")

  1417486170.247356         sleep($seconds = "3600")

  可以看到-p執行PID后,默認執行的就是trace功能,輸出的第一列為函數調用的時(shí)間,后面則是調用信息,phptrace按照PHP調用順序,依此打出run, say, sleep;此時(shí),我們可以看到sleep的參數為3600s,因此curl請求要在1小時(shí)后才能返回。

  實(shí)際上phptrace還可以打印函數返回值及調用耗時(shí),,由于run,say,sleep函數都沒(méi)有返回,在上面的例子中無(wú)法看到這個(gè)效果,我們改一下代碼,使其sleep 1s :

  $ ./phptrace -p 2459

  1417506346.727223 run(<Null>)

  1417506346.727232     say($msg = "hello world")

  1417506346.727241         sleep($seconds = "1")

  1417506347.727341         sleep =>      0       1.000100

  1417506347.727354     say =>    hello world     1.000122

  1417506347.727358 run =>        nil     1.000135

  輸出的前三行跟上面的例子相同,仍然是PHP函數的調用信息,后三行則表明了對應函數的返回值以及調用耗時(shí):sleep 返回0 ,耗時(shí)1.000100s, say 返回 "hello world",耗時(shí)1.000122s,之所以這么長(cháng)時(shí)間,是因為其調用了sleep函數,同樣run 返回nil,及沒(méi)有返回值,耗時(shí)1.000135s。

【PHP執行跟蹤工具phptrace介紹】相關(guān)文章:

PHP開(kāi)發(fā)工具推薦201710-06

php外部執行命令函數10-27

PHP執行Linux系統命令函數的方法07-12

幾種流行PHP集成開(kāi)發(fā)工具的比較06-10

PHP的變量的介紹11-06

php在服務(wù)器執行exec命令失敗的解決方法-php技巧08-12

如何在dos命令下執行PHP文件09-18

php定時(shí)執行任務(wù)的設置方法參考08-22

PHP的基本語(yǔ)法的介紹10-07

介紹PHP Hash算法10-21

激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频