Τεκμηρίωση:

Επιστροφή
Εγχειρίδιο χρήσης του phpchartPlus
Τσιαβός Χρήστος <[email protected]>
Ημερομηνία: 18-Feb-2005
Άδεια Χρήσης: GPL
- Το λάθος "Headers already sent"

     Το πρόβλημα αυτό εντοπίζεται όταν προσπαθήσουμε μέσα από το σενάριο παραγωγής του διαγράμματος να εκτυπώσουμε κείμενο ή κάτι άλλο συναφές. Για να γίνει αντιληπτό γιατί αυτό προκαλεί σφάλμα είναι απαραίτητο να αναφερθούμε στην εσωτερική λειτουργία του πρωτοκόλλου HTTP.
Όταν το διάγραμμα (ας υποθέσουμε σε png φορμάτ) δημιουργείται ο εξυπηρετητής HTTP το στέλνει στον φυλλομετρητή του πελάτη ως ένα HTTP μήνυμα (εικόνα 1).

   Ο φυλλομετρητής προκειμένου να διαβάσει σωστά το μήνυμα, πρέπει να ξέρει τον τύπο των δεδομένων που περιέχονται σε αυτό. Για το σκοπό αυτό παρέχεται η κεφαλίδα Content-Type. Στην περίπτωσή μας τα δεδομένα αντιπροσωπεύουν το παραγόμενο διάγραμμα.
    Η κεφαλίδα Transfer-Encoding καθορίζει τον τρόπο με τον οποίο το παραγόμενο διάγραμμα θα μεταφερθεί διαμέσω του (δια)δικτύου. Όμως προτού αναφερθούμε λεπτομερώς στην λειτουργικότητά του, είναι σκόπιμο να εξηγήσουμε γιατί το ορίζουμε.
     Σε μόνιμες συνδέσεις (πολλές αιτήσεις πελατών ανά σύνδεση), ο πελάτης μπορεί να δεχθεί πολλές απαντήσεις. Εάν στις συνδέσεις αυτές τα HTTP μηνύματα έχουν λανθασμένη τιμή της κεφαλίδας Content-Length, τότε ο πελάτης θα αδυνατεί να αναγνωρίσει το κάθε ξεχωριστό μήνυμα. Στις περιπτώσεις όπου εικόνες παράγονται δυναμικά (όπως στην περίπτωσή μας) δεν ξέρουμε εκ των προτέρων το μέγεθος της εικόνας. Για να αντιμετωπίστει το πρόβλημα αυτό το HTTP χρησιμοποιεί την κεφαλίδα Transfer-Encoding με τιμή chunked η οποία "τεμαχίζει" τα δεδομένα του παραγόμενου διαγράμματος σε μικρά κομμάτια. Το "τεμαχισμένο" μήνυμα με μέγεθος 0 υποδηλώνει το τέλος της μεταφοράς των δεδομένων του διαγράμματος. Έτσι με τον τρόπο αυτό ο πελάτης και κατ' επέκταση ο φυλλομετρητής μπορεί να προσδιορίσει το μέγεθος του μηνύματος και άρα να το προβάλλει σωστά.

Είναι προφανές ότι με το να τοποθετούμε ή να εκτυπώνουμε κείμενο μέσα από το σενάριο παραγωγής του διαγράμματος στην ουσία προσθέτουμε λανθασμένα δεδομένα στο HTTP μήνυμα που μεταφέρει το διάγραμμα το οποίο έχει φορμάτ εικόνας (PNG,JPEG,GIF). Για να αντιμετωπίσουμε το πρόβλημα αυτό πρέπει να τοποθετήσουμε το κείμενο που θέλουμε να εκτυπώσουμε σε ένα δεύτερο ανεξάρτητο HTTP μήνυμα.

ονομάζουμε image_generation_scirpt.php το σενάριο παραγωγής του διαγράμματος και print_image_text.phtml το ακόλουθο τμήμα κώδικα

<html>
<head>
<title>Placing the generated image</title>
</head>
<body>
<img src="image_generation_scirpt.php">
<h2>Our generated image</h2>
</body>
</html>
<?php yourphpcode ?>

Τώρα ο φυλλομετρητής του πελάτη θα παραλάβει το print_image_text.phtml όπως φαίνεται στην εικόνα 2 στην ακόλουθη μορφή


     Είναι προφανές ότι στην περίπτωση αυτή αφήνουμε άθικτο το HTTP μήνυμα παραγωγής διαγράμματος και τοποθετούμε το επιπλέον κείμενο που θέλουμε να εκτυπώσουμε στο print_image_text.phtml. Δύο διαφορετικά http μηνύματα μεταφέρονται, το ένα για το παραγόμενο διάγραμμα (στην ουσία μεταφέρονται πολλά "κομματιασμένα μηνύματα" όπως είδαμε παραπάνω) και το άλλο για τον (επιπλέον) κώδικα php or html. Με τον τρόπο αυτό μπορούμε να συνδυάσουμε την ταυτόχρονη απεικόνηση του διαγράμματος μέσα σε ήδη υπάρχουσες σελίδες HTML ή σενάρια PHP (που εκτυπώνουν κείμενο ή άλλα συναφή) χωρίς τα λάθη κεφαλίδων του http.

 

 
Hosted by www.Geocities.ws

1