Selamat siang, Habr!
Setahun yang lalu, proses saya kode debugging di PHP terdiri dari dua baris:
var_dump($variable); die();
Dari waktu ke waktu, tentu saja, saya harus menggunakan konstruksi yang lebih "kompleks":
console.log(data);
echo json_encode($variable, JSON_UNESCAPED_UNICODE); exit();
Tidak, apa yang kamu! Saya tahu - di zaman kita, tidak tepat bagi seorang programmer budaya untuk melakukan ini
kerajinan kunolelucon tentang kerajinan kuno lainnya
Tapi jujur, saya selalu takut pada apa yang tidak saya mengerti. Termasuk
printer xDebug, terutama cara mengkonfigurasi semua ini. Suatu hari, saya berhasil melakukannya di mobil saya dan di proyek lokal - tidak ada batas untuk sukacita. Beberapa bulan kemudian, saya menemukan masalah baru, bagaimana cara debug di PHPstorm via xDebug, jika proyek ini dibangun dari jarak jauh oleh buruh pelabuhan via CI.
Jika Anda, seperti saya, mengalami kesulitan mengkonfigurasi berbagai hal, selamat datang di kucing, saya akan berbicara tentang pengalaman saya dalam menyiapkan lingkungan debugging dengan kata-kata menakutkan seperti Docker, xDebug, CI.
Bagi mereka yang tidak suka air dan ingin langsung ke esensi pengaturan.
Mengapa Anda harus menghindari metode debug yang berjamur dan beralih ke teknologi yang memadai?
Saya menipu kucing itu sedikit, saya terlibat dalam debugging artisanal, bukan hanya karena saya takut mengkonfigurasi sesuatu, dan bukan karena itu terlalu bodoh, tetapi hanya karena saya tidak memerlukan sesuatu yang lebih nyaman. Paling sering, saya mengerjakan proyek secara lokal di komputer saya yang agak kuat, dan tugas-tugasnya tidak begitu rumit sehingga proses debugging mulai menempati posisi yang cukup signifikan.
Pada titik tertentu, saya menyadari sendiri bahwa saya merasa tidak nyaman, dan mencoba mencari teman xDebug dan PHPstorm ketika mengerjakan proyek lokal. Masalahnya adalah bahwa sebagian besar dokumentasi dan panduan yang saya temukan menyiratkan bahwa orang yang membacanya cukup berpengalaman di bidang subjek dan memahami segalanya, dalam kasus saya ini bukan kasusnya dan saya menghabiskan 4-5 pada pengaturan xDebug pertama saya jam 2 siang. Itu adalah moral yang sangat sulit, saya merasa sangat bodoh. Namun demikian, ternyata untuk mengkonfigurasi, semuanya berfungsi!
Ya, itu menjadi lebih nyaman, secara lokal, di rumah, tetapi pada pekerjaan utama saya melakukan situs dari jarak jauh, dan paling sering saya tidak dapat membongkar situs secara lokal (karena mesin yang lemah atau proses penyebaran yang tidak nyaman), atau memengaruhi pengaturan server karena hosting, oleh karena itu, membuat pengeditan "langsung" dan debugging terlibat dalam html-commenting print_r (pada saat itu pekerjaan itu "normal", meskipun tidak bangga dengan pengalaman ini).

Namun, 3 bulan lalu saya pindah ke perusahaan yang lebih dingin dan mulai terlibat dalam proyek yang sangat serius dengan beban yang tinggi. Dan di sini banyak yang berubah untuk saya. Infrastruktur dan proses pengembangannya kira-kira sebagai berikut: ada server GitLab, setiap proyek memiliki repositori sendiri, tugas datang ke Jira, Anda membuat cabang dengan nomor tugas, saat membuat cabang menggunakan CI, kotak pasir Anda sendiri dengan situs tempat Anda bekerja dengan tenang secara otomatis dibuat, setiap dorongan pasang kembali cabang, di akhir pekerjaan yang Anda berikan ke ulasan kode, tuangkan cabang ke master.
Semuanya keren kecuali untuk satu TETAPI, masing-masing membangun kembali cabang dalam kasus saya membutuhkan waktu sekitar 10 detik. Dalam proses pengembangan itu sendiri, ini adalah waktu yang tidak signifikan, karena saya telah melewati tahap ketika saya harus memeriksa operabilitas kode hampir setiap baris karena ketidakpastian dan sedikit pengalaman. Namun, ketika saya beralih ke debugging, 10 detik ini mulai memainkan peran nyata. Proses debugging tersebut terlihat sebagai berikut:
- Tambahkan 2 baris
- Pushu melakukan
- Saya menunggu 10 detik
- Periksa, lihat apa yang salah
- Ulangi
Menurut perkiraan kasar, cabang siap-gabung memiliki sekitar 20% komitmen bermanfaat dan 80% komitmen debug. Misalkan saya selesai bekerja pada cabang dengan 300 komit, yang 240 komit pada dasarnya hanya menghabiskan 40 menit waktu kerja saya (dan ini hanya waktu tunggu untuk perakitan cabang, tidak memperhitungkan detik yang menambahkan hingga menit, untuk menambah 2 baris dan kemudian hapus mereka).

Pada titik tertentu saya sudah bosan dan saya memutuskan untuk mengkonfigurasi xDebug untuk membuat proses debug lebih murah. Sayangnya, kolega saya saat ini tidak menggunakan teknologi ini (saya sedang menunggu lelucon tentang "Saya punya perusahaan keren di mana tidak ada yang menggunakan xDebug"), atau mereka tidak tahu / tidak ingat bagaimana berteman dengan IDE xDebug ketika cabang pergi jarak jauh melalui CI, dan karena saya tidak pernah menghabiskan waktu dan seperti yang saya sebutkan di atas, proses pengaturan sesuatu adalah proses yang cukup menyakitkan bagi saya, itu menghasilkan sekitar 6 jam waktu murni, sehingga akhirnya bekerja, dan saya mengerti prosesnya, dan itu akan cukup nyaman.
Proses pengaturan
Saya tidak akan menjelaskan secara terperinci tentang cara memasang CI, Docker, secara umum, cara merakit infrastruktur, diasumsikan bahwa ini semua dilakukan dan yang tersisa hanyalah mengatur lingkungan pribadi Anda.
Katakanlah repositori kami memiliki struktur seperti ini:

Pertama, kita perlu memeriksa apakah xDebug sendiri ada dalam gambar saat ini, untuk ini Anda dapat menggunakan
phpinfo ();Jika xDebug sudah termasuk dalam perakitan - baiklah, jika tidak, maka periksa
sumber ini , yang membantu saya secara langsung dalam pengaturan itu sendiri, bagaimanapun, saya pergi dengan cara yang sedikit berbeda.
Konfigurasikan php.ini
Agar semuanya berfungsi pada akhirnya, 2 pengaturan xDebug penting bagi kami:
- xdebug.remote_enable
- xdebug.remote_host
Dalam perakitan akhir cabang jarak jauh,
remote_enable harus diaktifkan, dan di
remote_host IP komputer Anda di jaringan harus ditetapkan. Mari sertakan pengaturan ini dalam build kami.
Pertama, Anda perlu mencari tahu di mana pengaturan php disimpan, mereka dapat ditemukan di
/usr/local/etc/php/conf.d/php.ini , atau file .ini itu sendiri dapat dinamai berbeda, dalam kasus saya adalah
/ usr / local / etc / php / conf.d / php-settings.ini . Anda dapat mengetahui dari pengaturan gambar yang dikumpulkan.
Kami membuat pengaturan tambahan di cabang kami melalui file php-settings.ini yang sama, dan menempatkannya di
./build_env/php/php-settings.iniKami menulis di dalamnya 2 dari pengaturan di atas:
xdebug.remote_enable = on
xdebug.remote_host = IP...
Selanjutnya, kita perlu menambahkan file ini ke pengaturan gambar "induk". Saya melakukan ini melalui volume dengan menambahkan baris ke ./build_env/docker-compose/docker-compose.tmpl:
- ${PROJECT_DIR}/build_env/php/php-settings.ini:/usr/local/etc/php/conf.d/php-settings.ini
Inilah yang terlihat seperti docker-compose.tmpl di proyek saya:

Lain kali Anda membangun cabang, Anda dapat memeriksa apakah pengaturan baru terikat melalui
phpinfo yang sama
(); jika ya - bagus, jika tidak - Anda kurang beruntung dan harus pergi dengan cara yang sama seperti yang saya lakukan pertama kali :(
Menyesuaikan Pemetaan dalam PHPstorm
Selanjutnya, Anda perlu mengkonfigurasi PHPstorm itu sendiri. Saya memutuskan untuk tidak menggunakan DBgp Proxy, agar tidak mengkonfigurasi pemetaan di popup setiap saat. Dalam kasus saya, saya menggunakan templat server yang akan berisi pemetaan yang diperlukan.
Pergi ke
Pengaturan / Preferensi | Bahasa & Kerangka Kerja | Php | Server- Buat templat server
- Nama: CABANG
- host: apa saja, itu tidak mempengaruhi
- port: apapun, itu tidak mempengaruhi
- Debugger: xDebug
- Letakkan daw di Use path mappings
- Kami meletakkan pemetaan yang sesuai, folder lokal yang berfungsi harus sesuai dengan folder di server tempat cabang-cabang yang dikumpulkan berada, dalam kasus saya build yang dikumpulkan berada di folder / var / www / builds / your_namespace / your_project / your_branch

Kami menyimpan pengaturan ini, kami akan mengubahnya setiap kali kami bekerja dengan cabang baru. Misalnya, jika hari ini saya bekerja dengan cabang web-2233, maka saya akan mengubah pemetaan ke
/ var / www / builds / build_path / web-2233Tambahkan variabel lingkungan baru sehingga IDE secara otomatis menarik pemetaan
Sekarang hal yang agak penting dan bukan yang paling jelas. Saat kami memulai debug, PHPstorm perlu memahami file lokal mana yang sesuai dengan file di server jauh. Jika server tidak memberikan instalasi tertentu, jendela sembul akan muncul di mana Anda perlu memetakan jalur secara manual. Agar PHPstorm segera mengambil pemetaan dari server dengan nama BRANCH, Anda perlu menambahkan variabel lingkungan
PHP_IDE_CONFIG ke perakitan kami
Di
./build_env/docker-compose/docker-compose.tmpl buat variabel lingkungan baru di lingkungan:
PHP_IDE_CONFIG: ${PHP_IDE_CONFIG}

Di
.gitlab-ci.yml kita mengatur variabel ini:
- export PHP_IDE_CONFIG="serverName=BRANCH"

Selesai!
Kami tidak perlu ekstensi browser, tidak perlu meneruskan URL XDEBUG_SESSION_START = IDE_KEY untuk mendapatkan parameter, kami tidak perlu menambahkan konfigurasi tambahan.
Nyalakan penyadapan

dan menyegarkan halaman situs, segera setelah kami menemukan breakpoint pertama, aplikasi akan berhenti di situ

Terima kasih atas perhatian Anda, saya harap artikel ini akan bermanfaat dan seseorang akan menghemat waktu tanpa menginjak menyapu yang sama seperti saya :)
Sumber yang saya gunakan saat pengaturan awal:
https://gist.github.com/chadrien/c90927ec2d160ffea9c4https://confluence.jetbrains.com/display/PhpStorm/Docker+Support+in+PhpStorm#DockerSupportinPhpStorm-Debugging aplikasiPHPwebaplikasi berjalan di heDockercontainer