
PHP ์จ๋ผ์ธ ๊ฐ์
>PHP - ๊ณ ๊ธ
๐ PHP ๊ณ ๊ธ - 7์ฃผ์ฐจ: ์ฑ๋ฅ ์ต์ ํ ๋ฐ ๋๋ฒ๊น - 02 ์ฝ๋ ํ๋กํ์ผ๋ง (Xdebug)
![]() |
ํ์ | 10.0 | ๋ผ์ด์ผ์ค | free |
---|---|---|---|---|
์ฌ์ฉ์ํ์ | 10.0 | ์ด์์ฒด์ | ||
๋ค์ด๋ก๋ | 1 | ํ์ผํฌ๊ธฐ | 0 | |
์ ์์ฌ | LUZENSOFT | ๋ฑ๋ก์ผ | 2025-09-22 17:03:33 | |
์กฐํ์ | 16 |
์ฝ๋ ํ๋กํ์ผ๋ง์ ์ค์์ฑ
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ์ผ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์ง์ ์ ์ ํํ ์ฐพ์๋ด๋ ๊ฒ์ ๋๋ค. ๋จ์ํ '๋๋ฆฌ๋ค'๊ณ ๋ง ์๊ฐํ๊ณ ์ง์์ผ๋ก ์ฝ๋๋ฅผ ์์ ํ๋ฉด ์คํ๋ ค ๋ ํฐ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์์ต๋๋ค. ์ด๋ ํ์ํ ๊ฒ์ด ๋ฐ๋ก #์ฝ๋_ํ๋กํ์ผ๋ง(Code Profiling)์ ๋๋ค. ์ฝ๋ ํ๋กํ์ผ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ๋ถ์ํ์ฌ ์ด๋ค ํจ์๋ ์ฝ๋๊ฐ ๊ฐ์ฅ ๋ง์ #์๊ฐ ๊ณผ #๋ฉ๋ชจ๋ฆฌ ๋ฅผ ์๋นํ๋์ง ํ์ ํ๋ ๊ณผ์ ์ ๋๋ค. โฑ๏ธ
Xdebug๋ ๋ฌด์์ธ๊ฐ?
#Xdebug ๋ PHP์ ๊ฐ์ฅ ๊ฐ๋ ฅํ #๋๋ฒ๊น ๋ฐ #ํ๋กํ์ผ๋ง ๋๊ตฌ ์ค ํ๋์ ๋๋ค. Xdebug๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋ ์คํ ํ๋ฆ์ ๋จ๊ณ๋ณ๋ก ์ถ์ ํ ์ ์์ ๋ฟ๋ง ์๋๋ผ, ํจ์ ํธ์ถ ์๊ฐ, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ฑ ๋ค์ํ ์ฑ๋ฅ ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ์์งํ ์ ์์ต๋๋ค. ์ด ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณ๋ชฉ ์ง์ (bottleneck)์ ์ฝ๊ฒ ์๋ณํ ์ ์์ต๋๋ค. ๐
Xdebug ํ๋กํ์ผ๋ง ์ค์ ๋ฐ ์ฌ์ฉ๋ฒ
Xdebug๋ฅผ ์ฌ์ฉํ ์ฝ๋ ํ๋กํ์ผ๋ง์ ํฌ๊ฒ ์ธ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
1. Xdebug ์ค์น ๋ฐ ์ค์
php.ini
ํ์ผ์์ Xdebug๋ฅผ ํ์ฑํํ๊ณ ํ๋กํ์ผ๋ง ์ต์
์ ์ค์ ํด์ผ ํฉ๋๋ค.
Ini, TOML
[Xdebug]
zend_extension="c:phpextphp_xdebug.dll" ; ์๋์ฐ ๊ฒฝ๋ก ์์
xdebug.mode = profile
xdebug.start_with_request = yes
xdebug.output_dir = "C:xampptmpxdebug" ; ํ๋กํ์ผ๋ง ํ์ผ์ด ์ ์ฅ๋ ๊ฒฝ๋ก
xdebug.mode = profile
: Xdebug์ ๋ชจ๋๋ฅผ ํ๋กํ์ผ๋ง์ผ๋ก ์ค์ ํฉ๋๋ค.xdebug.start_with_request = yes
: ๋ชจ๋ HTTP ์์ฒญ์ ๋ํด ์๋์ผ๋ก ํ๋กํ์ผ๋ง์ ์์ํ๋๋ก ์ค์ ํฉ๋๋ค.xdebug.output_dir
: ํ๋กํ์ผ๋ง ๊ฒฐ๊ณผ ํ์ผ(.cachegrind)์ด ์ ์ฅ๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ํฉ๋๋ค.
2. ์ฝ๋ ์คํ ๋ฐ ํ๋กํ์ผ๋ง ๋ฐ์ดํฐ ์์ฑ
์ค์ ์๋ฃ ํ ์น ์๋ฒ๋ฅผ ์ฌ์์ํ๊ณ , ํ๋กํ์ผ๋งํ PHP ์คํฌ๋ฆฝํธ๋ฅผ ์คํํฉ๋๋ค. ์คํฌ๋ฆฝํธ ์คํ์ด ๋๋๋ฉด xdebug.output_dir
์ .cachegrind
ํ์ฅ์๋ฅผ ๊ฐ์ง ํ์ผ์ด ์์ฑ๋ฉ๋๋ค. ์ด ํ์ผ์๋ ํจ์๋ณ ํธ์ถ ํ์, ์คํ ์๊ฐ, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ฑ์ ์์ธ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
3. ํ๋กํ์ผ๋ง ๋ฐ์ดํฐ ๋ถ์
์์ฑ๋ .cachegrind
ํ์ผ์ ํ
์คํธ ํธ์ง๊ธฐ๋ก ์ด์ด๋ณด๊ธฐ์๋ ๋ด์ฉ์ด ๋๋ฌด ๋ณต์กํฉ๋๋ค. ๋ฐ๋ผ์ ์ ๋ฌธ์ ์ธ ๋ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋๊ตฌ๋ #KCachegrind (๋ฆฌ๋
์ค) ๋๋ #qcachegrind (์๋์ฐ, macOS)์
๋๋ค.
์ด๋ฌํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ์๊ฐ์ ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
#ํจ์_ํธ์ถ_ํธ๋ฆฌ: ์ด๋ค ํจ์๊ฐ ์ด๋ค ํจ์๋ฅผ ํธ์ถํ๋์ง ๊ณ์ธต์ ์ผ๋ก ๋ณด์ฌ์ค๋๋ค.
#์คํ_์๊ฐ: ๊ฐ ํจ์๊ฐ ์ด ์ผ๋ง๋ ๋ง์ ์๊ฐ์ ์๋นํ๋์ง ํ์ํฉ๋๋ค.
#์์ฒด_์๊ฐ (Self Time): ํจ์ ๋ด๋ถ ์ฝ๋ ์์ฒด์ ์คํ ์๊ฐ์ ๋๋ค.
#ํฌํจ_์๊ฐ (Inclusive Time): ํจ์๊ฐ ํธ์ถํ ๋ค๋ฅธ ํจ์์ ์คํ ์๊ฐ๊น์ง ๋ชจ๋ ํฌํจํ ์ด ์คํ ์๊ฐ์ ๋๋ค.
์ด ์ ๋ณด๋ฅผ ํตํด ์คํ ์๊ฐ์ด ๊ฐ์ฅ ๊ธด ํจ์๋ฅผ ์ฐพ์๋ด๊ณ , ํด๋น ํจ์ ๋ด๋ถ์ ๋ฌธ์ ์ฝ๋๋ฅผ ์ง์ค์ ์ผ๋ก ๊ฐ์ ํ ์ ์์ต๋๋ค.
์ค์ ์์: ๋๋ฆฐ ์ฝ๋ ๋ถ์ํ๊ธฐ
๋ค์๊ณผ ๊ฐ์ด ์๋์ ์ผ๋ก ๋๋ฆฌ๊ฒ ์๋ํ๋ PHP ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค.
PHP
<?php
function slow_operation_A() {
usleep(500000); // 0.5์ด ์ง์ฐ
}
function slow_operation_B() {
for ($i = 0; $i < 100000; $i++) {
// ๋ณต์กํ ๊ณ์ฐ์ ์๋ฎฌ๋ ์ด์
}
}
function main_function() {
slow_operation_A();
slow_operation_B();
slow_operation_B();
}
main_function();
?>
์ด ์ฝ๋๋ฅผ Xdebug๋ก ํ๋กํ์ผ๋งํ๊ณ qcachegrind
๋ก ๋ถ์ํ๋ฉด, slow_operation_B
๊ฐ slow_operation_A
๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์๊ฐ์ ์๋ชจํ์์ ์๊ฐ์ ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฐ๋ฆฌ๋ slow_operation_B
ํจ์์ ๋ก์ง์ ๊ฐ์ ํ๋ ๋ฐ ์ง์คํด์ผ ํ๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ฆด ์ ์์ต๋๋ค.
๋ง์น๋ฉฐ
#์ฑ๋ฅ_๋ณ๋ชฉ_ํ์ ์ ํด๊ฒฐํ๋ ์ฒซ๊ฑธ์์ ์ ํํ ์ง๋จ์ ๋๋ค. Xdebug๋ฅผ ํ์ฉํ ์ฝ๋ ํ๋กํ์ผ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๊ณผํ์ ์ผ๋ก ๋ถ์ํ๊ณ , #์ต์ ํ ์ ๋ฐฉํฅ์ ๋ช ํํ๊ฒ ์ ์ํด ์ค๋๋ค. ๋จ์ํ ๋๋ฒ๊น ์ ๋์ด, ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํ ํ์์ ์ธ ๊ธฐ์ ์ด๋ ๊ผญ ์ตํ๋์ธ์. โจ
์๋, ์์ ์ฑ ํ์ค. ๋๊น์์ด ๋น ๋ฅธ VPN. ๊ณ ํ์ง ๋ธ์ดํผ์ ๋ฌด๋ฃ์ฒดํ!