Apakah menutup koneksi mysql penting?

88

Apakah penting untuk menutup koneksi mysql secara efisien, atau apakah secara otomatis menutup setelah file php berjalan?

John Yeary
sumber
Lihat pertanyaan ini juga stackoverflow.com/questions/336078/…
alex
Saya kira hal yang sama berlaku untuk ftp_close?
doc_id
Apakah menutup koneksi mysql penting? ya, ini seperti destruktor di c ++
jasinth premkumar

Jawaban:

90

Dari dokumentasi :

Catatan: Tautan ke server akan ditutup segera setelah eksekusi skrip berakhir, kecuali jika ditutup sebelumnya dengan secara eksplisit memanggil mysql_close ().

Jika skrip Anda memiliki cukup banyak pemrosesan yang harus dilakukan setelah mengambil hasil dan telah mengambil rangkaian hasil lengkap, Anda pasti harus menutup koneksi. Jika tidak, ada kemungkinan server MySQL akan mencapai batas koneksinya saat server web sedang dalam penggunaan berat. Jika Anda tidak dapat menutup koneksi MySQL hingga mendekati akhir skrip, itu lebih bersih meskipun tidak perlu dilakukan secara eksplisit.

Saya tidak yakin bagaimana fastcgi mempengaruhi banyak hal. Satu halaman mengklaim bahwa build PHP yang mendukung fastcgi akan membuat koneksi persisten, bahkan untuk mysql_connect. Ini bertentangan dengan dokumentasi di mana koneksi ditutup saat proses, bukan skrip, berakhir. Daripada mengujinya, saya akan merekomendasikan menggunakan mysql_close (). Sebenarnya saya merekomendasikan menggunakan PDO , jika tersedia.

outis
sumber
Saya kira hal yang sama berlaku untuk ftp_close?
doc_id
4
Apakah itu berarti bahwa jika pengguna menutup halaman (misalnya) lebih awal (atau ada beberapa error) koneksi mungkin tetap terbuka?
Toni Michel Caubet
1
@Toni Michel Caubet "The link to the server will be closed as soon as the execution of the script ends."Ketika pengguna menutup halaman lebih awal, itu tidak masalah untuk server PHP. Ini menjalankan skrip seperti biasa dan mengakhiri skrip seperti biasa. Hanya pengguna yang tidak akan melihat hasil.
Arrowman
10

Apakah itu penting? Tidak terlalu banyak

Apakah ini dianggap praktik yang baik untuk diikuti? Iya.

Saya tidak mengerti mengapa Anda tidak ingin menutupnya.

ist_lion
sumber
6
Yah, mengingat bahkan halaman manual untuk mysql_closemengatakan "Menggunakan mysql_close () biasanya tidak diperlukan, karena tautan terbuka non-persisten secara otomatis ditutup pada akhir eksekusi skrip." Saya tidak akan menganggapnya sebagai praktik yang buruk untuk tidak menutup koneksi.
nico
4
"Saya tidak mengerti mengapa Anda tidak ingin menutupnya." Anda tidak ingin menutupnya jika ada kemungkinan Anda membutuhkannya lagi.
Frank Farmer
1
jika U menggunakan ajax maka jika koneksi ditutup maka setiap kali U mencoba menggunakan ajax koneksi akan dibuka dan ditutup lagi dan ini akan lebih berharga daripada membiarkan koneksi terbuka ke server dan klien tidak peduli tentang koneksi terbuka atau tidak dia peduli bahwa situs webnya cepat
Robert
itu memang bisa sangat penting !!! jika beban server tinggi dan Anda memiliki banyak koneksi yang tidak tertutup seperti yang dikatakan oleh orang lain lebih jauh bahwa ini dapat menyebabkan server tidak responsif, jadi menurut saya ini sangat penting!
oliiix
Lebih baik ditutup. Mudah dan tidak bermasalah.
José Carlos PHP
5

Saat menggunakan sesuatu seperti cgi, sama sekali tidak perlu menutup koneksi mysql Anda karena mereka menutup secara otomatis pada akhir eksekusi skrip. Saat menggunakan teknologi persisten seperti mod_perl dan lainnya, yang menjaga koneksi Anda di antara permintaan, penting untuk melacak koneksi, variabel global, dll ..

Pada dasarnya, untuk data persisten, bersihkan sendiri. Untuk data yang sepele dan tidak persisten, semuanya akan hilang saat permintaan selesai. Bagaimanapun, praktik terbaik adalah selalu menutup koneksi Anda.

jess
sumber
1
Dia berbicara tentang PHP, yang tidak gigih, jadi itu tidak berlaku.
Sasha Chedygov
2

Akan ditutup segera setelah skrip selesai dieksekusi. Kecuali Anda telah membuka koneksi persisten. Idealnya Anda harus merilis sumber daya (koneksi di sini) segera setelah Anda selesai menggunakannya. Kecuali jika ada kemungkinan besar Anda akan membutuhkannya lagi segera dalam eksekusi.

Penggabungan koneksi atau menggunakan koneksi persisten (jika itu yang Anda maksudkan) adalah ide bagus jika Anda berada di belakang server database tunggal. Namun jika ada lebih banyak server dan Anda melakukan load balancing, hal itu dapat mengganggu distribusi pekerjaan. Biasanya beberapa klien menjalankan kueri berat sementara yang lain menjalankan kueri yang lebih ringan. Jadi jika koneksi yang sama digunakan selama n over, beberapa server akan mengalami beban berat sementara yang lain kurang dimanfaatkan. Pertimbangkan untuk menggunakan ttls yang lebih kecil dan ukuran kumpulan koneksi variabel.

neal aise
sumber
1

Kebanyakan CMS menutup koneksi MySQL di akhir permintaan, yang sebenarnya tidak ada artinya, karena PHP akan tetap melakukannya.

Namun, jika Anda memiliki skrip di mana koneksi tidak lagi diperlukan, katakan di tengah-tengah skrip, dan kemudian aktivitas berat lainnya terjadi, maka ada baiknya untuk menutup koneksi secara eksplisit. Ini akan membebaskan beberapa sumber daya.

Sekarang, banyak yang telah dikatakan tentang manfaat menutup koneksi, tetapi hampir tidak ada yang dikatakan tentang manfaat tidak menutupnya. Pada dasarnya, jika Anda tidak menutup koneksi di akhir skrip, maka Anda benar-benar menghemat beberapa sumber daya. Bayangkan sebuah aplikasi web (atau aplikasi apapun) menerima 100 tampilan halaman / detik. Jadi, setiap detik, Anda perlu memanggil mysqli_close100 kali - yang berarti dalam setiap detik, Anda memiliki 100 perjalanan pulang pergi yang tidak perlu ke server database untuk menutup koneksi yang terbuka. Dari perspektif kinerja, ini adalah overhead murni, karena PHP akan memeriksa koneksi terbuka ketika skrip selesai dan akan menutup koneksi tersebut, dan mungkin saja, karena semuanya terjadi begitu cepat, PHP tidak melihat bahwa Anda memilikinya menutup koneksi tersebut dan akan mencoba menutupnya lagi.

Catatan: jawaban di atas mengasumsikan bahwa Anda tidak menggunakan koneksi persisten (koneksi persisten tidak digunakan di CMS utama mana pun).

itoctopus
sumber