Bagaimana cara memeriksa apakah suatu proses sedang menjalankan php?

Jika Anda telah bekerja dengan PHP, Anda mungkin menghadapi situasi di mana Anda menjalankan proses PHP yang tidak berfungsi seperti yang diharapkan. Seringkali ini dapat direproduksi dan dapat diselidiki dalam lingkungan pengembangan dengan Xdebug, atau yang aneh die('here'); jika Anda tidak memiliki Xdebug untuk ditangani

Meskipun tidak siap direproduksi, Anda mungkin memiliki alat terhubung yang menghasilkan profil dari lingkungan produksi Anda (mis. g. Tideways, XHProf, Blackfire, NewRelic, dll), memungkinkan Anda menangkap profil yang memungkinkan Anda menentukan apa yang terjadi

Bagaimana dengan situasi di mana prosesnya tidak selesai? . Ini hanya terjadi sekali dalam bulan biru, tetapi proses yang macet menumpuk secara halus, menghabiskan kumpulan pekerja PHP-FPM atau utas Apache Anda, menghentikan layanan Anda pada waktu yang paling tidak tepat

Di sinilah Anda harus dapat melompat ke proses yang sedang berjalan dan mencari tahu persis di mana proses itu macet

Orang tua tapi orang baik

Jadi, Anda telah mengidentifikasi proses nakal dan mendapatkan PID-nya. Apa sekarang?

Mari kita lihat bagaimana itu dapat membantu kita

# strace -s128 -p6720
poll([{fd=8, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=8, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
poll([{fd=8, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)

Jadi, apa yang terjadi di sana? . Mengatur ukuran string maksimum tidak diperlukan tetapi seringkali membuat output lebih mudah dibaca jadi saya cenderung menyertakan opsi secara default saat menjalankan strace

strace kemudian mulai mengeluarkan semua panggilan sistem yang sedang dibuat oleh proses. Di sini kita dapat melihat bahwa prosesnya memanggil poll. Dengan asumsi Anda tidak akrab dengan panggilan sistem Linux, google cepat (atau man 2 poll) muncul sebagai berikut

NAMA
poll, ppoll — tunggu beberapa peristiwa pada deskriptor file

RINGKASAN
#include

int polling(struct pollfd *fds, nfds_t nfds, int batas waktu);

Ini terlihat seperti yang kita lihat di output strace, jadi kita sekarang tahu bahwa proses kita sedang menunggu event di deskriptor file. Sabas

Bagaimana itu membantu kita? . Ini mungkin file lokal, koneksi TCP ke database, atau sumber daya lain yang bergantung pada skrip Anda. Ini tidak memberi kita nomor baris untuk dilihat dalam kode PHP kita, tetapi ini masih merupakan titik awal yang berharga untuk menentukan apa yang salah dan harus mengarahkan kita ke arah yang benar

Cukup sering Anda akan melihat keluaran di strace yang dapat langsung Anda tautkan kembali ke kode Anda, yaitu. e. kueri database tertentu yang hanya dipanggil di satu tempat, jadi Anda tahu ke mana harus mencari kode untuk mulai menyelidiki

Strace 2. 0

strace adalah alat yang ampuh, tetapi bisa sedikit melelahkan untuk mengarungi keluaran, googling untuk menguraikan panggilan sistem, dan menjalankan alat terpisah untuk pengidentifikasi dereferensi

©2014 RenOfSwagzareth (http. //fav. saya/d7j9hha)

Masukkan die('here');_6. die('here');7 adalah 'alat sederhana untuk visibilitas sistem dalam, dengan dukungan asli untuk wadah'. Ini adalah pekerja keras yang menggali sistem Anda untuk memberi tahu Anda apa yang sedang terjadi. Biasanya Anda akan menjalankan die('here');8, yang merupakan 'UI kutukan yang sederhana, intuitif, dan dapat disesuaikan sepenuhnya untuk sysdig', untuk melakukan analisis waktu nyata, atau Anda akan menggunakan die('here');7 untuk menghasilkan tangkapan (e. g. strace0) dan melihatnya di alat Sysdig Inspect gui

Dalam konteks penyelidikan di atas yang kami lakukan di strace, ini bisa dilakukan di die('here');8 cukup sepele. Ketika Anda pertama kali menjalankannya, ini memberi Anda daftar proses yang berjalan dengan cara yang mirip dengan strace3. Anda kemudian dapat memfilter ke proses tertentu dan menggali panggilan sistemnya, file apa yang telah dibuka, IO apa yang dilakukannya, dan banyak hal lain yang mungkin tidak Anda ketahui sedang dilakukan proses Anda

Ini adalah alat yang paling komprehensif untuk menyelidiki proses yang salah yang telah saya gunakan. Jika sebelumnya Anda pernah menggunakan strace untuk menggali proses, saya sarankan untuk mencoba die('here');8, atau Sysdig Inspect untuk yang lebih nyaman dalam gui

Tunjukkan pada saya jejak tumpukan

Kemungkinan Anda bisa mendapatkan cukup jauh dengan orang-orang seperti strace, die('here');7, et. Al. , tetapi mungkin Anda tidak tahu harus mulai dari mana dengan pemanggilan sistem, atau alat yang beroperasi di dalam dan di sekitar level kernel linux sedikit membingungkan, atau Anda memang menguasainya, tetapi kesulitan untuk menghubungkannya kembali dengan Anda

Jika demikian, maka Anda perlu ________2______8. strace9 adalah profiler pengambilan sampel yang akan terhubung ke proses PHP yang sedang berjalan dan menghasilkan pelacakan tumpukan di setiap interval sampel

Ini adalah alat yang cukup baru dan saya menemukan beberapa sisi kasar saat menggunakannya, tetapi hasilnya masih sangat mengesankan. Pada saat penulisan, tidak ada rilis terpaket atau binari untuk diunduh, tetapi proses untuk membangunnya sangat mudah dan didokumentasikan dalam file readme repositori. Ketika saya membangunnya, ia mengeluarkan beberapa peringatan kompilasi, tetapi dengan senang hati dibangun dan dijalankan

Setelah Anda membuatnya, cobalah dengan menemukan proses PHP dan menghubungkannya, mis. g. strace0. Ini menjalankan strace_9 memberitahukannya untuk mengharapkan PHP versi 7. 1 (strace_2), untuk dilampirkan ke proses dengan PID 6720 (strace3, dan membatasi keluaran hingga lima sampel (strace4)

Ini akan mengeluarkan 5 jejak tumpukan yang menunjukkan kepada Anda apa yang dilakukan proses setiap kali diambil sampelnya. Itu pada dasarnya ilmu hitam sejauh yang saya ketahui. Tidak akan pernah lagi sebuah proses macet dengan saya bertanya-tanya apa yang dilakukannya di saat-saat terakhir sebelum saya mengeluarkan strace5 untuk mengeluarkannya dari kesengsaraannya

Seolah-olah bagian pesta itu tidak cukup, Anda dapat menyalurkan output melalui beberapa skrip perl (dibundel dengan strace9) untuk menghasilkan grafik api, mis. g. strace_7. Hal ini memungkinkan Anda untuk melihat statistik gabungan dari waktu ke waktu, yang dapat membantu mengidentifikasi apa yang menghabiskan sumber daya jika tidak jelas dari beberapa contoh pelacakan tumpukan

Apa yang kita pelajari?

Anda sekarang memiliki pegangan tentang cara menggali proses yang berperilaku aneh, bahkan jika Anda tidak melengkapinya dengan alat pembuatan profil sebelum Anda memulainya. Ini adalah teknik debugging yang berharga yang dapat sampai ke akar penyebab dari proses yang macet. Ke depan, Anda harus dapat menghindari teknik yang menutupi jenis masalah ini, seperti skrip pengawas yang mencari proses yang berjalan lama macet dan memulai ulang.

Senang rasanya bisa melaporkan kepada atasan atau klien Anda bahwa Anda telah mengidentifikasi dan memperbaiki masalah, daripada harus bekerja keras setiap kali itu terjadi, tidak mengetahui penyebabnya.

Ini benar-benar hanya menggores permukaan informasi yang dapat Anda peroleh kembali dari proses yang sedang berjalan. Ada alat lain untuk diselidiki, seperti strace_8 yang memberi Anda panggilan perpustakaan untuk suatu proses, atau strace9 jika Anda menggunakan sistem berbasis BSD, seperti MacOS misalnya. (Ada juga port Linux -s1280 tapi saya tidak tahu bagaimana keadaannya. )

Beberapa alat ini mungkin tampak sedikit berlebihan pada awalnya, tetapi ada banyak contoh penggunaan di web. Kemungkinan seseorang telah melakukan apa yang Anda coba lakukan bahkan jika Anda tidak tahu persis argumen apa yang perlu Anda berikan kepada strace untuk mendapatkan apa yang Anda inginkan, itu tidak boleh lebih dari pencarian cepat saja

Bagaimana saya tahu jika PHP menjalankan CMD?

Cara Memeriksa apakah php berjalan dari cli (baris perintah) .
Periksa konstanta STDIN. STDIN adalah konstanta yang ditentukan saat php dijalankan dari baris perintah. .
Periksa php_sapi_name. Fungsi php_sapi_name seharusnya mengembalikan "cli" jika skrip dijalankan dari baris perintah. .
Periksa konstanta PHP_SAPI

Bagaimana Anda memeriksa apakah suatu proses sedang berjalan di Linux dengan pid?

Cara termudah untuk mengetahui apakah proses sedang berjalan adalah jalankan perintah ps aux dan nama proses grep . Jika Anda mendapatkan output bersama dengan nama proses/pid, proses Anda sedang berjalan.

Bagaimana cara mendapatkan ID proses di PHP?

Lihat Juga ¶ .
getmygid() - Dapatkan GID pemilik skrip PHP
getmyuid() - Mendapat UID pemilik skrip PHP
get_current_user() - Mendapat nama pemilik skrip PHP saat ini
getmyinode() - Mendapat inode dari skrip saat ini
getlastmod() - Mendapatkan waktu modifikasi halaman terakhir