Η δημιουργία ενός συμβάντος σε PHP, περιμένοντας το περιεχόμενο XML




Θα πρέπει να δημιουργήσετε έναν ακροατή εκδήλωση. Είμαι αρχάριος, ώστε να είναι είδος :)


Βασικά είμαι σε page1.php (αρχείο php)? Θέλω μέσα σε ένα βρόχο για να πάει ελέγξετε page2.xml (αρχείο xml) για κάποιες πληροφορίες που θα πρέπει να λαμβάνονται σε κάποιο σημείο. Είτε το δείτε όλη την ώρα, ή να περιμένει και κάθε 5 λεπτά ή έτσι για να δούμε αν κάποιες πληροφορίες έχει λάβει εκεί. Είτε από αυτούς εργάζονται για μένα.


Αν δεν info έχει ληφθεί μετά από λίγα λεπτά, στη συνέχεια θέλω να εκτελέσετε ξανά το βρόχο (μέχρι να εισπραχθούν), διαφορετικά, να προχωρήσουμε και να κάνουμε κάτι με πρόσφατα έλαβε τις πληροφορίες μου. Αυτό το μέρος δεν έχω κανένα πρόβλημα με, μόνο η εκδήλωση ίδια ακροατή. Δεν μπόρεσα να βρω τη λειτουργία θα πρέπει να χρησιμοποιείτε οπουδήποτε. :( Το μόνο που πρέπει να ελέγξετε και να ανακτήσετε το περιεχόμενο του αρχείου xml κάθε τόσο.


Δεν είμαι τόσο σίγουρος πώς θα πρέπει να πάει για αυτό, αν δεν υπάρχει μόνο μια λειτουργία που το κάνει αυτό, αλλά δεν μπόρεσα να βρω πολύ όταν έψαξα για «εκδήλωση ακροατή php». 


Οποιαδήποτε βοήθεια θα εκτιμηθεί: αναφορά στον κώδικα σεμινάρια / δείγμα / ακόμα και απλά να μου λέει τι λέξεις-κλειδιά που θα πρέπει να ψάχνετε ή ό, τι πρέπει να μάθουν πρώτα για να γίνει αυτό.


Ευχαριστώ!
Έκανα τα εξής:


Αποθηκεύεται αυτόματα στη βάση δεδομένων κάθε φορά που κάτι νέο ήρθε.


Στη συνέχεια έτρεξε ένα php βρόχο που κάθε λίγα λεπτά ελέγχονται για να διαπιστωθεί αν υπάρχει κάτι νέο στη βάση δεδομένων που ταιριάζει με τις παραμέτρους του νέου αυτού συμβάντος (συμπεριλαμβανομένων ότι happenned εντός του χρονικού πλαισίου των τελευταίων λεπτών). Θα χρησιμοποιηθεί `flush();`και στη συνέχεια `sleep(120);`στο βρόχο για να πάρει το βρόχο για να συνεχίσει να τρέχει κάθε λίγα λεπτά, έως ότου η νέα info ήρθε στην οποία περίπτωση θα `break();`ή `die();`.
Προσωπικά, έχω παίξει με αρκετές από τις ενσωματωμένες επιλογές σε XML-βαρύ έργο και έχουν εγκατασταθεί σε [pulldom](http://docs.python.org/lib/module-xml.dom.pulldom.html) ως η καλύτερη επιλογή για λιγότερο πολύπλοκα έγγραφα.


Ειδικά για τα μικρά απλά πράγματα, μου αρέσει το γεγονός με γνώμονα τη θεωρία της ανάλυσης αντί για τη δημιουργία μια αρμαθιά από επιστροφές κλήσεων για μια σχετικά απλή δομή. [Εδώ είναι μια καλή γρήγορη συζήτηση για το πώς να χρησιμοποιήσετε το API](http://www.prescod.net/python/pulldom.html) .


Αυτό που μου αρέσει: μπορείτε να χειριστείτε το parsing σε ένα `for`βρόχο και όχι με τη χρήση επιστροφές κλήσεων. Μπορείτε επίσης να καθυστερήσουν την πλήρη συντακτική ανάλυση (η «τραβήξει» κομμάτι) και να πάρει μόνο πρόσθετες λεπτομέρειες όταν καλείτε `expandNode()`. Αυτό ικανοποιεί γενική απαίτηση μου για «υπεύθυνη» απόδοση χωρίς να θυσιάζει την ευκολία χρήσης και την απλότητα. **Εκφράσεις XPath δεν μπορούν να αξιολογηθούν agaist μη wellformed έγγραφο XML** , η οποία είναι ακριβώς η περιγραφόμενη περίπτωση.


Είναι δυνατόν να γίνει αυτό σε δύο αλυσοδεμένος στάδια, το πρώτο εκ των οποίων είναι να μετατρέψει τον κώδικα HTML για να wellformed XML και στη συνέχεια το δεύτερο - να εφαρμόσει την έκφραση XPath.


Ως εκ τούτου, το ερώτημα θα μπορούσε να αναφέρεται ακριβέστερα ως «Πώς να μετατρέψετε HTML σε XML, έτσι ώστε οι εκφράσεις XPath μπορούν να αξιολογούνται με βάση το».


Εδώ είναι δύο καλά εργαλεία:


1. **[TagSoup](http://home.ccil.org/~cowan/XML/tagsoup/) , ένα πρόγραμμα ανοιχτού κώδικα** , είναι ένα Java και SAX - based εργαλείο, που αναπτύχθηκε από [**τον John Cowan**](http://home.ccil.org/~cowan/) . Αυτό είναι ένα SAX-συμβατό πρόγραμμα ανάλυσης γραμμένο σε Java που, αντί για την ανάλυση καλοσχηματισμένα ή έγκυρη XML, αναλύει HTML καθώς βρίσκεται σε άγρια κατάσταση: φτωχή, άσχημη και βίαιη, αν και αρκετά συχνά μακριά από σύντομη. TagSoup είναι σχεδιασμένο για ανθρώπους που έχουν να επεξεργάζονται αυτά τα πράγματα χρησιμοποιώντας κάποια ομοιότητα ενός ορθολογικού σχεδιασμού της εφαρμογής. Παρέχοντας μια διεπαφή SAX, επιτρέπει τυποποιημένα εργαλεία XML για να εφαρμοστεί ακόμη και το χειρότερο HTML. TagSoup περιλαμβάνει επίσης έναν επεξεργαστή γραμμής εντολών που διαβάζει αρχεία HTML και μπορεί να παράγει είτε καθαρά HTML ή καλοσχηματισμένα XML που είναι μια στενή προσέγγιση με XHTML. Taggle είναι ένα εμπορικό λιμάνι C ++ της TagSoup.
2. **[SgmlReader](http://code.msdn.microsoft.com/SgmlReader)** είναι ένα εργαλείο που αναπτύχθηκε από τη Microsoft για [**Chris Lovett**](http://www.lovettsoftware.com/) . SgmlReader είναι ένα XmlReader API σε οποιοδήποτε έγγραφο SGML (συμπεριλαμβανομένων ενσωματωμένη υποστήριξη για HTML). Ένα βοηθητικό πρόγραμμα γραμμής εντολών Παρέχεται επίσης η οποία εξάγει το καλά σχηματισμένες αποτέλεσμα XML. Κατεβάστε το αρχείο zip, συμπεριλαμβανομένης της αυτόνομο εκτελέσιμο και τον πλήρη πηγαίο κώδικα: [**SgmlReader.zip**](http://code.msdn.microsoft.com/SgmlReader/Release/ProjectReleases.aspx?ReleaseId=1442)
3. **[Το καθαρό XSLT 2.0 Αναλυτής της HTML](http://www.dcarlisle.demon.co.uk/htmlparse.xsl)** γραμμένο από [**τον David Καρλάιλ**](http://dpcarlisle.blogspot.com/) . Η ανάγνωση του κώδικα θα είναι μια μεγάλη άσκηση μάθησης για τον καθένα από εμάς.


Από την περιγραφή:


«D: htmlparse (συμβολοσειρά) δ: htmlparse (συμβολοσειρά, namespace, html-mode)


Η μορφή ένα επιχείρημα είναι ισοδύναμη με) δ: htmlparse (συμβολοσειρά, ' <http://ww.w3.org/1999/xhtml> ', true ()))


Αναλύει τη συμβολοσειρά ως HTML ή / και XML χρησιμοποιώντας κάποια ενσωματωμένη heuristics να) ελέγχου σιωπηρή άνοιγμα και το κλείσιμο των στοιχείων.


Δεν έχει πλήρη γνώση της HTML DTD, αλλά δεν έχει τον πλήρη κατάλογο των κενών στοιχεία και πλήρη κατάλογο των ορισμών οντότητας. Οι HTML οντότητες, και αναφορές χαρακτήρα δεκαδικό και δεκαεξαδικό όλες δεκτές. Οι σημείωση html-φορείς αναγνωρίζεται ακόμα κι αν html-mode = false ().


Τα ονόματα των στοιχείων lowercased (αν html-mode είναι αλήθεια ()) και τοποθετείται στο χώρο ονομάτων που καθορίζεται από την παράμετρο ονομάτων (που μπορεί να είναι «» για να υποδηλώσει όχι-ονομάτων, εκτός αν η είσοδος έχει explict δηλώσεις namespace, οπότε αυτά θα τιμηθεί .


Τα ονόματα ιδιοτήτων lowercased αν html-mode = true ()»


Διαβάστε μια πιο λεπτομερή περιγραφή [**εδώ**](http://www.dcarlisle.demon.co.uk/htmlparse.xsl) . Η τεχνική που περιγράφεται φαίνεται ωραίο, αλλά έχει πολλές παγίδες:


1) ο χρόνος μεταξύ της έναρξης PHP script και άκρο είναι μικρή σε σύγκριση με το χρόνο μετάδοσης? Επίσης, αυτό σώζει το χρήστη για 0,5 δευτερόλεπτα, σύμφωνα με την πηγή σας. Είναι αυτό ένα σημαντικό χρονικό διάστημα για εσάς;


2) αυτή η τεχνική δεν λειτουργεί με gzip buffering εξόδου


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


4) Μόλις ξεπλύνετε, δεν μπορείτε να στείλετε πια κεφαλίδες


5) (δευτερεύον θέμα) η απόκριση του server θα έρθει στην κατατμημένη κωδικοποίηση, που σημαίνει ότι ο πελάτης δεν θα γνωρίζει το μέγεθος των προτέρων (ως εκ τούτου δεν θα εμφανίσει «x% γίνεται» κατά τη λήψη ενός αρχείου).


Από την άλλη πλευρά, αν περιμένετε το σενάριο σας να τρέχει για ένα τραγικό βαθμό (20+ δευτερόλεπτα), μπορεί να χρειαστεί να στείλει κάποια δεδομένα (χώροι, για παράδειγμα) για να κρατήσει το πρόγραμμα περιήγησης από το χρονοδιάγραμμα από τη σύνδεση. Αυτό το αρχείο είναι αντικατασταθούν όταν έχουμε νέα χαρακτηριστικά που θα πρέπει να εκφράζονται εκεί π.χ. νέοι στόχοι κατασκευής κ.λπ.


Πριν αντικατάσταση θα ζητήσει από το χρήστη. Έτσι, αυτό θα συμβεί όταν ανοίγετε Codename Ένα ρυθμίσεις και να σώσει. Μπορείτε πάντα να πει «Όχι». Προτείνω τη δημιουργία αντιγράφων ασφαλείας του αρχείου και να κάνει σχετικά απλές αλλαγές.


Μια μελλοντική αλλαγή σκοπεύουμε να κάνουμε είναι απογύμνωση του αρχείου των περισσοτέρων είναι το περιεχόμενο παρόμοια με το build.xml / κατασκευή-impl.xml σχέση με το NetBeans. Αυτό θα μας επιτρέψει να ενημερώσετε το αρχείο impl XML απρόσκοπτα και σας επιτρέπουν να προσαρμόσετε το αρχείο XML. Θα πρέπει να εξετάσουμε DBUnit, ή να προσπαθήσει να βρει μια ισοδύναμη PHP (πρέπει να υπάρχει κανείς εκεί έξω). Μπορείτε να το χρησιμοποιήσετε για να προετοιμάσουν τη βάση δεδομένων με ένα συγκεκριμένο σύνολο δεδομένων που αντιπροσωπεύει τα δεδομένα δοκιμών σας, και έτσι κάθε δοκιμή θα εξαρτάται πλέον από τη βάση δεδομένων και κάποια υπάρχουσα κατάσταση. Με αυτό τον τρόπο, κάθε δοκιμή είναι αυτόνομη και δεν θα σπάσει κατά τη διάρκεια της περαιτέρω χρήσης της βάσης δεδομένων.


Ενημέρωση: Μια γρήγορη αναζήτηση στο Google παρουσίασε μια [επέκταση μονάδας DB](http://www.ds-o.com/archives/63-PHPUnit-Database-Extension-DBUnit-Port.html) για phpunit. Αν θέλετε το επιλεγμένο στοιχείο του αναπτυσσόμενου μενού που θα επιλεγεί αυτόματα από viewstate για postbacks θα πρέπει να έχει όλα τα στοιχεία στην αναπτυσσόμενη λίστα από τις πυρκαγιές Page\_PreLoad χρόνο. Για να το κάνετε αυτό, θα θέλετε να βάλετε τον κωδικό σας σε Page\_Init, σε αυτό το σημείο οι έλεγχοι που δημιουργούνται, αλλά viewstate δεν έχει εγχυθεί σε αυτά.


Ρίξτε μια ματιά εδώ [ASP.NET Σελίδα Κύκλου Ζωής Επισκόπηση](http://msdn.microsoft.com/en-us/library/ms178472.aspx) για πληροφορίες σχετικά με τον κύκλο ζωής της σελίδας.


Βλέπω ότι αναπτυσσόμενο σας είναι σε ένα γονικό κοντέινερ, μπορεί να χρειαστεί να καλέσετε info.EnsureChildControls () προτού χρησιμοποιήσετε το Find () αν δεν είναι σε θέση να πάρετε μια αναφορά από τον έλεγχό σας. Θα μπορούσατε να δημιουργήσει ένα XSLT για να κάνω αυτή τη δουλειά για σας. XSLT έχει σχεδιαστεί ειδικά για τη μετάφραση των δεδομένων XML σε κάποια άλλη μορφή κειμένου, συμπεριλαμβανομένων των XML. Για περισσότερες πληροφορίες σχετικά με XSLT, συστήνω [W3 σχολεία](http://www.w3schools.com/xsl/default.asp) . Υπάρχει ένα [plugin Eclipse σε εξέλιξη](http://www.eclipse.org/egit/) . Χρησιμοποιήστε [lxml](http://lxml.de/) η οποία είναι η καλύτερη βιβλιοθήκη xml / html για python.



```
import lxml.html
t = lxml.html.fromstring("...")
t.text_content()

```

Και αν απλά θέλετε να απολυμάνετε το βλέμμα html στο lxml.html.clean [μονάδα](http://lxml.de/lxmlhtml.html#cleaning-up-html) Δεν έχω χρησιμοποιήσει PHP για να γίνει αυτό, αλλά έχουν εμπειρία στη χρήση C # για να επιτευχθεί το ίδιο πράγμα.


Το API του Outlook είναι ένας τρόπος για την αυτοματοποίηση του Outlook και όχι τη σύνδεση με Exchange άμεσα. Έχω λάβει στο παρελθόν αυτή την προσέγγιση σε C # εφαρμογή και λειτουργεί, αν και μπορεί να είναι προβληματικό.


Αν θέλετε να συνδεθείτε απευθείας με το διακομιστή του Exchange που θα χρειαστεί για την έρευνα επεκτάθηκε MAPI.


Στο παρελθόν έχω χρησιμοποιήσει αυτό το περιτύλιγμα [MAPIEx: Επέκταση MAPI περιτύλιγμα](http://www.codeproject.com/KB/IP/CMapiEx.aspx) .


Πρόκειται για ένα C # έργο, αλλά πιστεύω ότι μπορείτε να χρησιμοποιήσετε κάποιο κώδικα .NET στον σέρβερ PHP5 των Windows. Εναλλακτικά έχει ένα C ++ πυρήνα DLL που μπορεί να είναι σε θέση να χρησιμοποιήσει. Έχω διαπιστώσει ότι είναι πολύ καλή και υπάρχουν κάποιες καλό παράδειγμα εφαρμογές.


 Εκσυγχρονίζω:


Συγγνώμη για την καθυστέρηση κανένα τρέχον τρόπος για να παρακολουθείτε θέσεις ακόμα.


Συμφωνώ προσθέτοντας περισσότερο στρώμα για να την αίτησή σας, θα στηρίζεται στην 3η κωδικό κόμμα μπορεί να είναι τρομακτικό (και δικαίως έτσι.)


Σήμερα διάβασα μια άλλη [ενδιαφέρουσα θέση](https://stackoverflow.com/questions/4508/mapi-and-managed-code-experiences) με ετικέτα ως MAPI που βρίσκεται σε ένα διαφορετικό θέμα. Το βασικό πράγμα εδώ όμως είναι ότι έχει συνδεθεί με [αυτό το σημαντικό άρθρο MS](http://blogs.msdn.com/mstehle/archive/2007/10/03/fyi-why-are-mapi-and-cdo-1-21-not-supported-in-managed-net-code.aspx) . Έχω αγνοεί τα ζητήματα που μέχρι τώρα σχετικά με τη χρήση του διαχειριζόμενου κώδικα για διεπαφή με MAPI αν και η C ++ κώδικα στο στοιχείο πρέπει να είναι ανεπηρέαστη από αυτό το σφάλμα, όπως είναι χωρίς έλεγχο.


Αυτή η καταχώρηση στο blog προτείνει επίσης άλλοι τρόποι για να συνδεθείτε στο διακομιστή MAPI / Exchange. Σε αυτή την περίπτωση, λόγω αυτών των νέων στοιχείων <http://us3.php.net/imap> μπορεί να είναι η απάντηση, όπως προτείνεται από τον άλλο χρήστη.