แก้ปัญหา idle ของ pgsql + apache2 + php5

×

Error message

Deprecated function: implode(): Passing glue string after array is deprecated. Swap the parameters in drupal_get_feeds() (line 394 of /data/wwwroot/includes/common.inc).

หลังจากการที่ติดตั้ง gforge ไปได้ในระดับนึง ก็พบข้อผิดพลาดจนได้

ทุกครั้งที่เปิดหน้าเว็บ จะมีการ connect ไปยัง database
พบว่าทุกครั้งที่เข้าแต่ละหน้า จะมี idle process เกิดขึ้นดังนี้

# ps ax | grep idle
10422  ??  I      0:00.00 postmaster: gforge gforge 127.0.0.1(64908) idle (postgres)
10426  ??  I      0:00.00 postmaster: gforge gforge 127.0.0.1(64162) idle (postgres)
10436  ??  I      0:00.00 postmaster: gforge gforge 127.0.0.1(57422) idle (postgres)
10463  ??  I      0:00.00 postmaster: gforge gforge 127.0.0.1(54246) idle (postgres)

เมื่อมี idle เกิดขึ้นมากมาย จำทำให้ connection  เต็ม จนกระทั่งไม่สามารถติดต่อกับฐานข้อมูลได้
สาเหตุของการเกิด เนื่องมาจากข้อผิดพลาดในการเขียนโปรแกรมเอง คือเมื่อมีการเปิดการเชื่อมต่อ
แต่ไม่มีการปิดการเชื่อมต่อ หรือมีการทำ transaction โดยเรียก BEGIN WORK แต่ไม่มีการ COMMIT
หรือทำการ ROLLBACK ทำให้เกิดปัญหาดังกล่าว แต่เนื่องจากการ debug โปรแกรมที่ไม่ได้เขียนเอง
ไม่ใช่เรื่องง่าย จึงใช้วิธีแก้ปัญหา โดยปิดการเชื่อมต่อ ไม่ให้มีการเชื่อมต่อถาวร ให้ตัดการเชื่อมต่อทุกครั้ง
เมื่อทำการประมวลผลเสร็จทุกครั้ง โดยแก้ไข php.ini ดังนี้

#vi /usr/local/etc/php.ini
pgsql.allow_persistent = Off  # ปิดการเชื่อมต่อ pgsql  แบบเชื่อมต่อถาวร

จากนั้น restart apache 

#/usr/local/rc.d/apache22 restart

เพียงเท่านี้ก็จะไม่มีปัญหานี้มากวนใจ แต่ถ้าจะให้ดี ควรเขียนโปรแกรมให้ถูกต้องมากกว่าครับ
เพราะไม่แน่ใจว่าตั้งค่าแบบนี้ ทำให้ประสิทธิภาพด้อยลงไปหรือไม่ครับ