เมื่อ CGI มีข้อผิดพลาด

เมื่อ CGI มีข้อผิดพลาด ไม่ทำงานตามปกติ

คราวนี้เราจะมากล่าวถึงปัญหา ข้อผิดพลาดต่างๆ ที่มักจะเกิดขึ้นให้พบเห็นกันอยู่บ่อยๆ เวลาที่เราจะติดตั้งหรือเขียน หรือนำ CGI Script มาใช้งาน (ไม่ว่าจะเขียนขึ้นเอง หรือ โหลด script สำเร็จรูปมาก็ตาม) ซึ่งปกติที่เราจะพบเห็น ก็มักจะเป็น Error message สั้นๆ ที่ไม่สื่อความหมายให้คาดเดาได้ซักเท่าไหร่ (เช่น 'Internal Server Errot 500') แล้วก็บอกให้ติดต่อกับผู้ดูแลระบบท่าเดียว โดยเราจะอ้างอิงถึงโปรแกรมที่เขียนด้วย ภาษา Perl เป็นหลัก แต่ก็สามารถจะนำไปใช้เป็นความรู้ กับภาษาอื่นๆได้ด้วยเช่นกัน

Error 500

ข้อความแสดงข้อผิดพลาดว่า 'Error 500' หรือ 'internal server error' มีสาเหตุ มาจากปัญหาหลายๆอย่าง มากจนไม่อาจจะคาดเดาได้ง่ายๆ ซึ่งปัญหาที่มักจะเจอกันบ่อยๆ ก็จะมีดังต่อไปนี้ ให้ตรวจสอบดูให้ดีว่ามีจุดไหนที่เราทำผิดพลาดหรือไม่

กำหนดสิทธิในการรันโปรแกรมไม่ถูกต้อง (Execute permission)

ในระบบ Unix ถ้าจะให้ script ไหนเรียกใช้งาน (execute) ได้ จะต้องมีการ กำหนด permission (จะไม่กล่าวเรื่องของ permission ในบทความนี้มากนักนะครับ หาความรู้เพิ่มเติมเกี่ยวกับเรื่อง permission ได้จากหนังสือ หรือบทความ เกี่ยวกับการใช้งาน unix นะครับ) ให้สามารถเรียกใช้งานได้ โดยใช้คำสั่ง chmod ในระบบ Unix เพื่อกำหนด permission ให้ script นั้นๆสามารถใช้งานได้โดยใครก็ได้ โดยใช้คำสั่งว่า

chmod 755 myprog.pl

จะเป็นการกำหนด permission มีค่าเท่ากับ 755 ให้กับแฟ้มข้อมูล script ชื่อว่า myprog.pl ซึ่งเลข 755 นี้จะมีความหมายถึงให้ใครก็ได้เรียกใช้ script ของเราได้ ซึ่งก็จะใช้ได้กับ web server โดยทั่วๆไป

ระบุที่อยู่ของตัวแปรภาษาผิด (Bad interpreter line)

ในระบบ Unix โปรแกรมภาษาที่เป็นลักษณะใช้ตัวแปรภาษา (เช่น Perl หรือ Shell script) บรรทัดแรกของ script นั้นๆจะต้องมีการระบุ ที่อยู่ของโปรแกรมตัวแปรภาษา เช่น

#!/usr/local/bin/perl

ถ้าหากว่าไม่ได้กำหนด หรือกำหนดผิด หรือที่ๆเรากำหนดไปนั้นมันไม่มีอยู่ ก็อาจจะเป็นสาเหตุให้โปรแกรม CGI Script เราทำงานผิดพลาดได้ครับผม โดยปกติในระบบ unix คุณสามารถหาที่อยู่ของโปรแกรมตัวแปรภาษา เช่น perl ได้โดยการใช้คำสั่งดังนี้

which perl หรือ whereis perl

ที่อยู่ของโปรแกรมตัวแปรภาษาจะต้องอยู่ที่บรรทัดแรก และเริ่มต้นด้วย #! ซึ่งการกำหนดนี้จะเหมือนกันทั้ง perl script, shell script ต่างๆ

เขียนโปรแกรมใน script ผิดพลาด (Syntax error)

การเขียนโปรแกรมที่ผิดข้อกำหนด ผิดรูปแบบ หรือทำงานผิด จะส่งผลให้ เกิดข้อผิดพลาดแบบ 'Error 500' ได้เช่นกัน สำหรับภาษา perl คุณสามารถ จะตรวจสอบ script ได้โดยใช้คำสั่ง

perl -c myprog.pl

จะเป็นการสั่งให้ perl นั้นตรวจสอบ โปรแกรม script ที่ชื่อว่า myprog.pl ซึ่งจะต้องไปสั่งที่ shell นะครับผม อีกคำสั่งนึงที่มีประโยชน์ก็คือ

perl -w myprog.pl

ซึ่งจะมีผลให้ตัวแปรภาษาแจ้งเตือน ข้อผิดพลาดที่อาจจะเกิดขึ้นได้เมื่อมีการ เรียกใช้งานโปรแกรม (จะไม่เหมือนกับข้อผิดพลาดที่เกิดจากการเขียนรูปแบบ โปรแกรมผิด พวกนั้นสามารถตรวจสอบได้ง่ายกว่า แต่ข้อผิดพลาดที่อาจจะเกิด ขึ้นเมื่อมีการเรียกใช้งานโปรแกรมนี้ อาจจะไม่เกิดก็ได้ และอาจจะเกิดเมื่อไหร่ ก็ได้ที่มีการเรียกใช้งานโปรแกรม นอกจากที่จะใช้ perl ทำการ debug โปรแกรม script แล้ว อีกวิธีนึงที่จะตรวจสอบข้อผิดพลาดได้ (แต่ไม่ค่อยจะดีนัก เพราะไม่ค่อยบอกอะไรเท่าไหร่เหมือนกัน) สามารถตรวจสอบได้จาก error log ของ server ของคุณเอง

แฟ้มข้อมูลที่ต้องการไม่ครบถ้วน (Missing required file)

โดยมากปัญหานี้จะเจอกับ script ที่มีการเรียกใช้ library อื่นๆอีกที โดยใช้คำสั่ง 'require' หรือ 'use' แล้วถ้าหากว่าแฟ้มข้อมูลที่จะเรียกใช้นั้นไม่มีอยู่ ก็จะเกิด 'Error 500' ขึ้น.. ที่มักจะพบปัญหานี้ก็คือ การนำเอา script ที่เขาเขียนแจกๆกัน มาใช้งาน ซึ่งบาง script จะใช้ library ที่ไม่มีในระบบที่เราเอามาใช้ ทางแก้ก็คือ หา library ต่างๆเหล่านั้นมาติดตั้งครับผม ไม่งั้นก็ต้องแก้ไขโปรแกรมให้ใช้ ทางอื่นเลี่ยงแทน และอันดับสุดท้าย ถ้าทำอะไรไม่ได้แล้วก็คือ...ทำใจครับผม

ข้อผิดพลาดที่เกิดขึ้นเมื่อมีการเรียกใช้โปรแกรม (Runtime error)

ถ้าหากว่าโปรแกรม script ที่เราเรียกใช้มีปัญหาขณะที่โปรแกรมทำงาน หรือที่เรียกว่า Runtime ก็มีผลให้เกิด 'Error 500' เช่นกัน ซึ่งปัญหานี้เองก็ค่อนข้างจะมีต้นเหตุ อยู่หลายอย่าง เช่นมีการเรียกเปิดแฟ้มข้อมูลที่ไม่มีอยู่ในระบบ หรือมีการเขียนข้อมูล ลงในที่ๆไม่สามารถเขียนได้ และไม่ได้มีการเขียนโปรแกรมรองรับ ไว้เมื่อมีข้อผิดพลาด เกิดขึ้น.. ก็จะทำให้เกิดข้อผิดพลาดขึ้นมาได้

ส่ง HTTP Header ผิดพลาด

สิ่งแรกสุดของผลลัพธ์จาก script ที่จะต้องส่งไปยัง CGI ก็คือ HTTP header ซึ่งมีรูปแบบคล้ายๆอย่างนี้

Content-type: text/html

หลังจาก HTTP header แล้วจะต้องตามด้วยบรรทัดว่าง 1 บรรทัดด้วยนะครับ เพราะฉนั้นเวลาเขาใช้คำสั่ง print เพื่อพิมพ์ header จึงมักจะเห็นเขาใส่ \n\n ไว้ด้วย นั่นคือให้มีบรรทัดว่าง 1 บรรทัดเกิดขึ้น ให้ตรวจสอบในโปรแกรมให้ดีว่า มีการพิมพ์ header ที่ว่านี้ออกมาถูกต้องหรือไม่ บางคนมักจะหลงลืม พิมพ์ผลลัพธ์ ออกไปเป็น <HTML> เลย ไม่ได้เริ่มด้วย HTTP header ก่อน ซึ่งก็จะทำให้ โปรแกรมเกิด error ขึ้น

ใช้ตัวแปรภาษา Perl ผิด version

ปัญหานี้ไม่ค่อยพบกันบ่อย แต่ก็อาจจะเป็นไปได้ เพราะคำสั่งบางอย่างของ version ต่างๆของ Perl อาจจะใช้งานไม่เหมือนกัน

Error 404

ข้อผิดพลาดรหัส 404 หมายถึงว่า หาเอกสารที่เราเรียกใช้ไม่พบ เราก็มักจะพบกับคำว่า Not found ซึ่งจะพบได้ทั้งกับเอกสาร HTML และ CGI Script ได้เช่นกัน วิธีแก้ไข ก็คือให้ตรวจสอบ URL ที่คุณเรียกใช้โปรแกรม และ path ที่คุณเรียกใช้โปรแกรม ที่เจอกันบ่อยๆก็คือมักจะสับสนในการเรียกใช้ ระหว่าง path ของโปรแกรมใน server และ path ของโปรแกรมที่จะนำมาใช้เป็น URL สำหรับเรียกใช้โปรแกรม

Document contains no data

บางครั้งคุณอาจจะเจอข้อผิดพลาดแจ้งมาว่า 'Document contains no data' ให้ตรวจสอบว่า script ของคุณให้ผลลัพธ์ของ content-header ถูกต้องหรือไม่ นอกจากนี้อาจจะเกิดจากปัญหาอื่นได้ด้วย เช่น การ time out อาจจะเป็นเพราะโปรแกรม ของคุณ ใช้เวลาในการประมวลผลนานเกินไป จนทำให้การติดต่อขอข้อมูลของ HTTP นั้นหยุดลง เพราะว่าเกินเวลา (time out) เช่นอาจจะมีการประมวลผลเยอะจริงๆ หรือมีวงรอบการทำงานที่ไม่มีวันสิ้นสุดเกิดขึ้น หรืออาจจะเกิดเพราะว่าโปรแกรมทำงาน ได้ถูกต้องจริงๆ แต่ว่าผลลัพธ์นั้นไม่ได้ถูกแจ้งออกมาทาง STDOUT ที่ถูกต้อง ซึ่งก็ จะไม่มีข้อมูลส่งไปยัง Browser ที่เรียกใช้งานโปรแกรม cgi script นั้นๆ ทางที่ดี ถ้าคุณสามารถใช้ shell ได้ ให้คุณเข้า shell แล้วลองเรียกโปรแกรม cgi script ขึ้นมาใช้งาน ตรวจสอบว่าผลลัพธ์นั้นออกมาทาง STDOUT ถูกต้องหรือไม่

โปรแกรมไม่ทำงานแต่โชว์ Source code ออกมาหมดเลย

ส่วนมากมักจะเกิดจากการใส่ script ไว้ผิดที่ ซึ่งใน sub directory ที่ใส่ไว้นั้น ไม่ได้กำหนดให้นำเอกสารไปทำงาน (execute) หรือเกิดจากการที่ระบุนามสกุล ของแฟ้มข้อมูลโปรแกรมไม่ถูกต้อง (บางที่ต้องกำหนดเป็น .pl บางที่ต้องกำหนดเป็น .cgi บางที่ได้ทั้งสองแบบ ฯลฯ) ซึ่งโดยปกติถ้าโปรแกรมไม่ได้กำหนดให้เรียกทำงาน มันก็จะถูกเรียกเหมือนกับเป็นเอกสารหนึ่งใน web server ซึ่งก็จะส่งผลลัพธ์ ออกมาเป็น Source code นั่นเอง

เรื่องของรูปแบบการ Upload (ASCII/BINARY)

ปัญหานี้เกิดขึ้นเพราะว่าความแตกต่างกัน ของรหัสที่นำมาใช้เป็นรหัส ขึ้นบรรทัดใหม่ในระบบปฎิบัติการ DOS/Windows และ Unix ในระบบ DOS/Windows จะใช้ตัวอักษรรหัสสองตัวคือ CR และ LF (Line Feed) เพื่อเป็นรหัสขึ้นบรรทัดใหม่ ในขณะที่ระบบปฎิบัติการ Unix ใช้ตัวอักษรรหัส ตัวเดียวคือ LF เป็นรหัสขึ้นบรรทัดใหม่ ซึ่งเมื่อเราเขียนโปรแกรม script และจัดเก็บแบบ DOS/Windows แล้วนำไปเรียกใช้ในระบบ Unix จะมีตัว อักษรรหัส CR เกินมาอีก 1 ตัว อาจจะมีผลให้โปรแกรมทำงานผิดพลาดได้ ในการ Upload ใน FTP เวลาที่จะ Upload เอกสารที่เป็นโปรแกรม Script จึงต้อง Upload แบบ ASCII จึงจะทำงานได้ถูกต้อง

 

<- - - -  กลับหน้าหลัก.