Debugging internal server errors (premature end of script headers) part 8
Die statements
If your script opens files like this:
open (F, "myfile.txt"); @lines=<F>; close (F); |
then you need to do something about it! If at any stage the script can't open the file, this can lead to problems. Either a script can sit there hanging if it can't open and write to a file, or you can spend ages trying to work out exactly why your script isn't doing what it should be.
Change the above code to:
open (F, "myfile.txt") || die "cannot open myfile.txt"; @lines=<F>; close (F); |
The script will then error with the message:
cannot open myfile.txt at test.cgi line 31. |
If you use '$!' in your statement:
open (F, "myfile.txt") || die "cannot open myfile.txt $!"; @lines=<F>; close (F); |
...it will print out why it died
cannot open myfile.txt No such file or directory at test.cgi line 31. |
$! contains the error returned by the server and you use it in your die statement to print the error out.
Use the same die statement with sendmail as well - if there's problems, it will stop the script hanging and return the error.
open(MAIL, "| /usr/bin/sendmail -t") || die "Unable to open sendmail. $!"; |
If there's a problem with sendmail, or the path to sendmail is wrong - it will end the script and return the error:
Unable to open sendmail. No such file or directory at test.cgi line 311. |
It is recommended that you go right through your script and put 'die' statements in wherever the script tries to open up a file. It does two things: lets you know that there's a problem, as well as killing off the execution of the script instead of letting it keep trying forever to open a file that doesn't exist.