PHP CURL - λειτουργίες και παραδείγματα χρήσης. Προηγμένη χρήση του cURL στις επιλογές γραμμής εντολών PHP Curl

(PHP 4 >= 4.0.2, PHP 5, PHP 7)

curl_setopt — Ορίζει μια παράμετρο για την περίοδο λειτουργίας CURL

Λίστα παραμέτρων

cURL λαβή που λαμβάνεται από curl_init().

Παράμετρος που θα ρυθμιστεί CURLOPT_XXX.

Η τιμή της παραμέτρου επιλογής.

bool:

Παράμετρος Σημειώσεις
CURLOPT_AUTOREFERER ΑΛΗΘΗΣγια αυτόματη ρύθμιση πεδίου Αναφέρων:σε αιτήματα που ανακατευθύνονται κατά κεφαλίδα Τοποθεσία:.
CURLOPT_BINARYTRANSFER ΑΛΗΘΗΣγια να επιστρέψετε την πρωτογενή απόκριση όταν χρησιμοποιείτε μια σταθερά CURLOPT_RETURNTRANSFER. Από την PHP 5.1.3 αυτή η επιλογή δεν απαιτείται πλέον: η ακατέργαστη έξοδος επιστρέφεται πάντα όταν χρησιμοποιείται η επιλογή CURLOPT_RETURNTRANSFER.
CURLOPT_COOKIESESSION ΑΛΗΘΗΣγια να δώσει εντολή στην τρέχουσα συνεδρία να ξεκινήσει μια νέα "συνεδρία" cookies. Αυτό θα αναγκάσει το libcurl να αγνοήσει τυχόν cookies "session" που θα έπρεπε να έχει φορτώσει από την προηγούμενη περίοδο λειτουργίας. Από προεπιλογή, το libcurl αποθηκεύει και φορτώνει πάντα όλα τα cookies, ανεξάρτητα από το αν είναι "session" ή όχι. Τα cookies "Περίοδος λειτουργίας" είναι cookies που δεν λήγουν και πρέπει να υπάρχουν μόνο για την τρέχουσα "συνεδρία".
CURLOPT_CERTINFO ΑΛΗΘΗΣγια έξοδο πληροφοριών πιστοποιητικού SSL για ροή STDERRμε ασφαλείς συνδέσεις. Προστέθηκε στο cURL 7.19.1. Διαθέσιμο από την PHP 5.3.2. Απαιτεί αυτή η επιλογή να είναι ενεργοποιημένη για σωστή λειτουργία CURLOPT_VERBOSE.
CURLOPT_CONNECT_ONLY ΑΛΗΘΗΣλέει στη βιβλιοθήκη να εκτελέσει τον απαραίτητο έλεγχο ταυτότητας διακομιστή μεσολάβησης και ρύθμιση σύνδεσης, αλλά δεν μεταδίδει δεδομένα. Αυτή η επιλογή εφαρμόζεται για HTTP, SMTP και POP3. Προστέθηκε στο 7.15.2. Διατίθεται από την PHP 5.5.0.
CURLOPT_CRLF ΑΛΗΘΗΣγια να μετατρέψετε τις καταλήξεις γραμμών Unix σε CRLF.
CURLOPT_DNS_USE_GLOBAL_CACHE ΑΛΗΘΗΣγια να χρησιμοποιήσετε την καθολική κρυφή μνήμη DNS. Αυτή η επιλογή δεν είναι ασφαλής σε νήματα και είναι ενεργοποιημένη από προεπιλογή.
CURLOPT_FAILONERROR ΑΛΗΘΗΣγια μια λεπτομερή αναφορά αποτυχίας, εάν ο κωδικός HTTP που ελήφθη είναι μεγαλύτερος ή ίσος με 400. Η προεπιλεγμένη συμπεριφορά επιστρέφει τη σελίδα ως κανονική, αγνοώντας τον κωδικό.
CURLOPT_FILETIME ΑΛΗΘΗΣγια να προσπαθήσετε να λάβετε την ημερομηνία τροποποίησης ενός απομακρυσμένου εγγράφου. Αυτή η τιμή μπορεί να ληφθεί χρησιμοποιώντας την παράμετρο CURLINFO_FILETIME από τη συνάρτηση curl_getinfo().
CURLOPT_FOLLOWLOCATION ΑΛΗΘΗΣνα ακολουθήσει οποιαδήποτε επικεφαλίδα "Τοποθεσία: "αποστέλλεται από τον διακομιστή στην απάντησή του (σημειώστε ότι αυτό συμβαίνει αναδρομικά, η PHP θα ακολουθήσει τυχόν κεφαλίδες που αποστέλλονται "Τοποθεσία: ", εκτός εάν έχει οριστεί μια σταθερά CURLOPT_MAXREDIRS).
CURLOPT_FORBID_REUSE ΑΛΗΘΗΣνα αναγκάσει μια σύνδεση να κλείσει μετά την ολοκλήρωση της επεξεργασίας της, ώστε να μην μπορεί να επαναχρησιμοποιηθεί.
CURLOPT_FRESH_CONNECT ΑΛΗΘΗΣγια να αναγκάσετε τη χρήση μιας νέας σύνδεσης αντί μιας προσωρινής αποθήκευσης.
CURLOPT_FTP_USE_EPRT ΑΛΗΘΗΣγια χρήση EPRT (και LPRT) για ενεργές μεταφορτώσεις FTP. Χρήση ΨΕΥΔΗΣγια να απενεργοποιήσετε τα EPRT και LPRT και να χρησιμοποιήσετε μόνο το PORT.
CURLOPT_FTP_USE_EPSV ΑΛΗΘΗΣγια την αρχική δοκιμή της εντολής EPSV κατά τις μεταφορές FTP. Εάν η εντολή αποτύχει, θα επιστρέψει στο PASV. Εγκατάσταση σε ΨΕΥΔΗΣγια να απενεργοποιήσετε το EPSV.
CURLOPT_FTP_CREATE_MISSING_DIRS ΑΛΗΘΗΣγια να δημιουργήσετε καταλόγους που λείπουν εάν μια λειτουργία FTP συναντήσει μια ανύπαρκτη διαδρομή.
CURLOPT_FTPAPPEND ΑΛΗΘΗΣγια να γράψετε ένα απομακρυσμένο αρχείο μέχρι το τέλος, αντί να το αντικαταστήσετε σε ένα υπάρχον αρχείο.
CURLOPT_TCP_NODELAY Καθορίζει μόνιμα εάν η επιλογή TCP_NODELAY θα πρέπει να οριστεί ή να διαγραφεί (1 = ορισμός, 0 = διαγραφή). Από προεπιλογή, η επιλογή διαγράφεται. Διατίθεται από την PHP 5.2.1 για εκδόσεις που έχουν κατασκευαστεί με libcurl 7.11.2 ή νεότερη έκδοση.
CURLOPT_FTPASCII Παρατσούκλι CURLOPT_TRANSFERTEXT. Χρησιμοποιήστε αυτό αντί.
CURLOPT_FTPLISTONLY ΑΛΗΘΗΣγια να επιστρέψετε μόνο μια λίστα ονομάτων από τον κατάλογο FTP.
CURLOPT_HEADER ΑΛΗΘΗΣγια να συμπεριλάβετε κεφαλίδες στην έξοδο.
CURLINFO_HEADER_OUT ΑΛΗΘΗΣγια να παρακολουθείτε τη συμβολοσειρά ερωτήματος λαβής. Διαθέσιμο από την PHP 5.1.3. Πρόθεμα CURLINFO_χρησιμοποιείται ειδικά.
CURLOPT_HTTPGET ΑΛΗΘΗΣγια να επαναφέρετε τη μέθοδο αιτήματος HTTP στη μέθοδο GET. Εφόσον το GET είναι η προεπιλογή, αυτή η παράμετρος χρειάζεται μόνο εάν η μέθοδος αιτήματος έχει προηγουμένως αλλάξει.
CURLOPT_HTTPPROXYTUNNEL ΑΛΗΘΗΣγια σήραγγα μέσω του καθορισμένου διακομιστή μεσολάβησης HTTP.
CURLOPT_MUTE ΑΛΗΘΗΣγια να απενεργοποιήσετε πλήρως τα μηνύματα λειτουργίας cURL. Καταργήθηκε στο cURL 7.15.5 (μπορεί να χρησιμοποιηθεί η επιλογή CURLOPT_RETURNTRANSFER)
CURLOPT_NETRC ΑΛΗΘΗΣγια να διαβάσετε το αρχείο ~/.netrc για τη σύνδεση και τον κωδικό πρόσβασης για την απομακρυσμένη τοποθεσία με την οποία δημιουργείται η σύνδεση.
CURLOPT_NOBODY ΑΛΗΘΗΣγια να αποκλείσει το σώμα απόκρισης από την έξοδο. Η μέθοδος αιτήματος έχει οριστεί σε HEAD. Αλλαγή αυτής της ρύθμισης σε ΨΕΥΔΗΣδεν το αλλάζει ξανά σε GET.
CURLOPT_NOPROGRESS

ΑΛΗΘΗΣγια να απενεργοποιήσετε την ένδειξη προόδου στις μεταφορές cURL.

Σχόλιο:

Η PHP ορίζει αυτόματα αυτήν την παράμετρο σε ΑΛΗΘΗΣ, αλλάξτε το μόνο για σκοπούς εντοπισμού σφαλμάτων.

CURLOPT_NOSIGNAL ΑΛΗΘΗΣνα αγνοήσει οποιαδήποτε συνάρτηση cURL που στέλνει σήματα στη διαδικασία PHP. Αυτή η επιλογή είναι ενεργοποιημένη από προεπιλογή σε SAPI πολλαπλών νημάτων για να επιτρέπεται στις παραμέτρους χρονικού ορίου να λειτουργούν σωστά.
CURLOPT_POST ΑΛΗΘΗΣγια να χρησιμοποιήσετε κανονικό HTTP POST. Αυτή η μέθοδος POST χρησιμοποιεί το κανονικό , που χρησιμοποιείται συνήθως σε φόρμες HTML.
CURLOPT_PUT ΑΛΗΘΗΣγια λήψη ενός αρχείου χρησιμοποιώντας τη μέθοδο HTTP PUT. Το αρχείο που χρησιμοποιείται πρέπει να ρυθμιστεί χρησιμοποιώντας τις επιλογές CURLOPT_INFILEΚαι CURLOPT_INFILESIZE.
CURLOPT_RETURNTRANSFER ΑΛΗΘΗΣγια να επιστρέψετε το αποτέλεσμα της μεταφοράς ως συμβολοσειρά από curl_exec()αντί για άμεση έξοδο στο πρόγραμμα περιήγησης.
CURLOPT_SAFE_UPLOAD ΑΛΗΘΗΣγια να απενεργοποιήσετε την υποστήριξη προθέματος @ για ληφθέντα αρχεία σε CURLOPT_POSTFIELDS, που σημαίνει ότι οι τιμές πέρασαν με @ μπορούν να μεταδοθούν με ασφάλεια ως πεδία. Αντί για πρόθεμα, μπορείτε να χρησιμοποιήσετε την επιλογή CURLFileρε. Προστέθηκε στην PHP 5.5.0 με προεπιλεγμένη τιμή ΨΕΥΔΗΣ. Στην PHP 5.6.0 έγινε ίσο με από προεπιλογή ΑΛΗΘΗΣ.
CURLOPT_SSL_VERIFYPEER ΨΕΥΔΗΣγια να σταματήσει το cURL να ελέγχει το πιστοποιητικό κεντρικού υπολογιστή. Εναλλακτικά πιστοποιητικά προς επαλήθευση μπορούν να καθοριστούν χρησιμοποιώντας την παράμετρο CURLOPT_CAINFOή τον κατάλογο με τα πιστοποιητικά που καθορίζονται από την παράμετρο CURLOPT_CAPATH. Η προεπιλογή είναι ΑΛΗΘΗΣαπό την έκδοση cURL 7.10. Η προεπιλεγμένη διανομή εγκαθίσταται ξεκινώντας από την έκδοση cURL 7.10.
CURLOPT_TRANSFERTEXT ΑΛΗΘΗΣγια να χρησιμοποιήσετε τη λειτουργία ASCII για μεταφορές FTP. Όταν χρησιμοποιείτε LDAP, τα δεδομένα επιστρέφονται σε απλό κείμενο αντί για HTML. Σε συστήματα Windows το νήμα STDOUTδεν ρυθμίζεται σε δυαδική λειτουργία.
CURLOPT_UNRESTRICTED_AUTH ΑΛΗΘΗΣγια να συνεχίσετε την αποστολή στοιχείων σύνδεσης και κωδικού πρόσβασης κατά τις ανακατευθύνσεις (κατά τη χρήση CURLOPT_FOLLOWLOCATION), ακόμα κι αν αλλάξει το όνομα του κεντρικού υπολογιστή.
CURLOPT_UPLOAD ΑΛΗΘΗΣγια να προετοιμαστείτε για τη μεταφόρτωση του αρχείου στον διακομιστή.
CURLOPT_VERBOSE ΑΛΗΘΗΣγια εμφάνιση πρόσθετων πληροφοριών. Γράφει την έξοδο σε μια ροή STDERR, ή το αρχείο που καθορίζεται από την παράμετρο CURLOPT_STDERR.

Για τις ακόλουθες τιμές παραμέτρων επιλογής, η παράμετρος τιμής πρέπει να είναι του τύπου ακέραιος αριθμός:

Παράμετρος Ορισμός τιμής τιμής Σημειώσεις
CURLOPT_BUFFERSIZE Το μέγεθος του buffer που χρησιμοποιείται για κάθε ανάγνωση. Ωστόσο, δεν υπάρχει καμία εγγύηση ότι αυτό το αίτημα θα ολοκληρωθεί. Προστέθηκε στο cURL 7.10.
CURLOPT_CLOSEPOLICY Μία από τις σταθερές CURLCLOSEPOLICY_*.

Σχόλιο:

Αυτή η επιλογή έχει καταργηθεί καθώς δεν εφαρμόστηκε ποτέ στο cURL και δεν λειτούργησε.

Καταργήθηκε στην PHP 5.6.0.
CURLOPT_CONNECTTIMEOUT Ο αριθμός των δευτερολέπτων που πρέπει να περιμένετε όταν προσπαθείτε να συνδεθείτε. Χρησιμοποιήστε το 0 για να περιμένετε επ' αόριστον.
CURLOPT_CONNECTTIMEOUT_MS Ο αριθμός των χιλιοστών του δευτερολέπτου που πρέπει να περιμένετε κατά την προσπάθεια σύνδεσης. Χρησιμοποιήστε το 0 για να περιμένετε επ' αόριστον. Εάν το libcurl έχει μεταγλωττιστεί χρησιμοποιώντας την τυπική ανάλυση ονομάτων του συστήματος, τότε η σύνδεση θα εξακολουθεί να χρησιμοποιεί μια πλήρη δεύτερη αναμονή ως χρονικό όριο, με ελάχιστο επιτρεπόμενο χρονικό όριο 1 δευτερόλεπτο. Προστέθηκε στην έκδοση cURL 7.16.2. Διαθέσιμο από την PHP 5.2.3.
CURLOPT_DNS_CACHE_TIMEOUT Ο αριθμός των δευτερολέπτων που οι εγγραφές DNS αποθηκεύονται στη μνήμη. Από προεπιλογή, αυτή η παράμετρος είναι 120 (2 λεπτά).
CURLOPT_FTPSSLAUTH Μέθοδος ελέγχου ταυτότητας FTP (σε ενεργή λειτουργία): CURLFTPAUTH_SSL(Το SSL ελέγχεται πρώτα), CURLFTPAUTH_TLS(Το TLS ελέγχθηκε πρώτα) ή CURLFTPAUTH_DEFAULT(το cURL αποφασίζει μόνος του). Προστέθηκε στην έκδοση cURL 7.12.2.
CURLOPT_HTTP_VERSION CURL_HTTP_VERSION_NONE (από προεπιλογή, η CURL επιλέγει ποια έκδοση θα χρησιμοποιήσει), CURL_HTTP_VERSION_1_0 (αναγκαστική HTTP/1.0) ή CURL_HTTP_VERSION_1_1 (αναγκαστική HTTP/1.1).
CURLOPT_HTTPAUTH

Μπορείτε να χρησιμοποιήσετε τον τελεστή bitwise | (ή) να συνδυάσουν πολλές μεθόδους μαζί. Σε αυτήν την περίπτωση, το cURL θα ρωτήσει τον διακομιστή για υποστηριζόμενες μεθόδους εξουσιοδότησης και θα επιλέξει την καλύτερη.

Το CURLAUTH_ANY είναι ψευδώνυμο CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSΔΙΑΠΡΑΓΜΑΤΕΥΣΗ | CURLAUTH_NTLM.

Το CURLAUTH_ANYSAFE είναι ψευδώνυμο CURLAUTH_DIGEST | CURLAUTH_GSSΔΙΑΠΡΑΓΜΑΤΕΥΣΗ | CURLAUTH_NTLM.

CURLOPT_INFILESIZE Το αναμενόμενο μέγεθος αρχείου, σε byte, κατά τη μεταφόρτωση ενός αρχείου σε έναν απομακρυσμένο διακομιστή. Λάβετε υπόψη ότι η χρήση αυτής της επιλογής δεν θα σταματήσει την αποστολή περαιτέρω δεδομένων που υπερβαίνουν αυτήν την τιμή, καθώς τα δεδομένα που αποστέλλονται εξαρτώνται από το αποτέλεσμα CURLOPT_READFUNCTION.
CURLOPT_LOW_SPEED_LIMIT Ανώτερο όριο ταχύτητας μεταφοράς δεδομένων, σε byte ανά δευτερόλεπτο. Η επαλήθευση πραγματοποιείται εντός CURLOPT_LOW_SPEED_TIMEδευτερόλεπτα, μετά τα οποία η PHP θεωρεί τη μεταφορά πολύ αργή και τη ματαιώνει.
CURLOPT_LOW_SPEED_TIME Ο μέγιστος αριθμός δευτερολέπτων κατά τη διάρκεια των οποίων ο ρυθμός μεταφοράς δεν πρέπει να υπερβαίνει CURLOPT_LOW_SPEED_LIMIT, διαφορετικά η PHP θα επισημάνει τη μεταφορά ως πολύ αργή και θα τη σταματήσει.
CURLOPT_MAXCONNECTS Μέγιστος αριθμός μόνιμων συνδέσεων. Όταν επιτευχθεί το όριο, η παράμετρος χρησιμοποιείται για να καθορίσει ποια σύνδεση θα κλείσει. CURLOPT_CLOSEPOLICY.
CURLOPT_MAXREDIRS Ο μέγιστος αριθμός αποδεκτών ανακατευθύνσεων. Χρησιμοποιήστε αυτήν την επιλογή μαζί με την επιλογή CURLOPT_FOLLOWLOCATION.
CURLOPT_PORT Εναλλακτική θύρα σύνδεσης.
CURLOPT_POSTREDIR Μια μάσκα bit που περιέχει 1 (301 μετακινήθηκαν μόνιμα), 2 (302 βρέθηκαν) και 4 (303 Δείτε άλλα) για να καθορίσετε εάν η μέθοδος HTTP POST θα πρέπει να υποβάλλεται σε επεξεργασία όταν είναι ενεργοποιημένη η επιλογή CURLOPT_FOLLOWLOCATIONεάν συνέβη ο καθορισμένος τύπος ανακατεύθυνσης. Προστέθηκε στο cURL 7.19.1. Διαθέσιμο από την PHP 5.3.2.
CURLOPT_PROTOCOLS

Λίγη μάσκα αξιών CURLPROTO_*. Αυτή η μάσκα περιορίζει τα πρωτόκολλα που χρησιμοποιούνται από το libcurl. Αυτό σας επιτρέπει να εργάζεστε σε libcurl με μεγάλο αριθμό πρωτοκόλλων και να περιορίζετε τη λειτουργία ορισμένων μεταφορών μόνο σε ένα υποσύνολο από αυτά. Από προεπιλογή, το libcurl χρησιμοποιεί όλα τα υποστηριζόμενα πρωτόκολλα. Δείτε επίσης την παράμετρο CURLOPT_REDIR_PROTOCOLS.

Σωστές τιμές πρωτοκόλλου: CURLPROTO_HTTP , CURLPROTO_HTTPS , CURLPROTO_FTP , CURLPROTO_FTPS , CURLPROTO_SCP , CURLPROTO_SFTP , CURLPROTO_TELNET , CURLPROPROCURL, CURLPROTO_FTPS , CURLPROTO_FILE , CURLP ROTO_TFTP, CURLPROTO_ALL

CURLOPT_PROXYAUTH Μέθοδοι εξουσιοδότησης HTTP που χρησιμοποιούνται κατά τη σύνδεση σε διακομιστή μεσολάβησης. Χρησιμοποιήστε τις ίδιες μάσκες bit που περιγράφηκαν για την παράμετρο CURLOPT_HTTPAUTH. Προς το παρόν, μόνο τα CURLAUTH_BASIC και CURLAUTH_NTLM υποστηρίζονται για εξουσιοδότηση διακομιστή μεσολάβησης. Προστέθηκε στην έκδοση cURL 7.10.7.
CURLOPT_PROXYPORT Ο αριθμός θύρας του διακομιστή μεσολάβησης στον οποίο γίνεται η σύνδεση. Αυτός ο αριθμός μπορεί επίσης να οριστεί χρησιμοποιώντας την παράμετρο CURLOPT_PROXY.
CURLOPT_PROXYTYPE Είτε CURLPROXY_HTTP (προεπιλογή) είτε CURLPROXY_SOCKS5 . Προστέθηκε στο cURL 7.10.
CURLOPT_REDIR_PROTOCOLS Λίγη μάσκα αξιών CURLPROTO_*. Αυτό το bitmask περιορίζει τα πρωτόκολλα που χρησιμοποιούνται από το libcurl κατά την ανακατεύθυνση (με την παράμετρο ενεργοποιημένη CURLOPT_FOLLOWLOCATION). Αυτό σας επιτρέπει να περιορίσετε το σύνολο των πρωτοκόλλων που χρησιμοποιούνται κατά την ανακατεύθυνση για ορισμένες μεταδόσεις. Από προεπιλογή, το libcurl υποστηρίζει όλα τα πρωτόκολλα εκτός από το FILE και το SCP. Σε εκδόσεις πριν από την 7.19.4, η ανακατεύθυνση χρησιμοποιήθηκε για όλα τα πρωτόκολλα χωρίς εξαίρεση. Δείτε επίσης την περιγραφή παραμέτρων CURLOPT_PROTOCOLSγια μια λίστα σταθερών με τιμές πρωτοκόλλου. Προστέθηκε στην έκδοση cURL 7.19.4.
CURLOPT_RESUME_FROM Μετατόπιση έναρξης μετάδοσης, σε byte.
CURLOPT_SSL_VERIFYHOST Χρησιμοποιήστε το 1 για να ελέγξετε την ύπαρξη κοινού ονόματος στο πιστοποιητικό SSL. Χρησιμοποιήστε το 2 για να ελέγξετε ότι υπάρχει το κοινό όνομα και ότι ταιριάζει με τον καθορισμένο κεντρικό υπολογιστή. Σε ένα περιβάλλον μάχης, η τιμή αυτής της παραμέτρου θα πρέπει να είναι 2 (ορίζεται από προεπιλογή). Η υποστήριξη για την τιμή 1 έχει καταργηθεί στο cURL 7.28.1
CURLOPT_SSLVERSION Μία από τις σταθερές CURL_SSLVERSION_DEFAULT (0), CURL_SSLVERSION_TLSv1 (1), CURL_SSLVERSION_SSLv2 (2), CURL_SSLVERSION_SSLv3 (3), CURL_SSLVERSION_TLSv1_0 (4), CURL_SSLVERSION_TLSv1_1(5) ή CURL_SSLVERSION_TLSv1_2 (6).
CURLOPT_TIMECONDITION Μέθοδος ερμηνείας παραμέτρων CURLOPT_TIMEVALUE. Χρησιμοποιήστε CURL_TIMECOND_IFMODSINCE για να επιστρέψετε τη σελίδα μόνο εάν έχει αλλάξει από την ώρα που καθορίζεται στην παράμετρο CURLOPT_TIMEVALUE. Εάν η σελίδα δεν έχει τροποποιηθεί, ο τίτλος θα επιστραφεί "304 Μη Τροποποιημένο", υπονοώντας ότι η παράμετρος CURLOPT_HEADERεγκατεστημένος σε ΑΛΗΘΗΣ. Χρησιμοποιήστε CURL_TIMECOND_IFUNMODSINCE για το αντίθετο αποτέλεσμα. Η προεπιλογή είναι CURL_TIMECOND_IFMODSINCE.
CURLOPT_TIMEOUT Ο μέγιστος αριθμός δευτερολέπτων που επιτρέπεται για την εκτέλεση συναρτήσεων cURL.
CURLOPT_TIMEOUT_MS Ο μέγιστος αριθμός χιλιοστών του δευτερολέπτου που επιτρέπεται για την εκτέλεση συναρτήσεων cURL. Εάν το libcurl έχει δημιουργηθεί με χρήση της κανονικής ανάλυσης ονομάτων συστήματος, τότε αυτό το εύρος σύνδεσης θα εξακολουθεί να χρησιμοποιεί χρονικά όρια δεύτερης στρογγυλοποίησης, με ελάχιστο επιτρεπόμενο χρονικό όριο ένα δευτερόλεπτο. Προστέθηκε στην έκδοση cURL 7.16.2. Διαθέσιμο από την PHP 5.2.3.
CURLOPT_TIMEVALUE Αριθμός δευτερολέπτων από την 1η Ιανουαρίου 1970. Αυτή η φορά θα χρησιμοποιηθεί από την παράμετρο CURLOPT_TIMECONDITION. Από προεπιλογή, χρησιμοποιείται η παράμετρος CURL_TIMECOND_IFMODSINCE.
CURLOPT_MAX_RECV_SPEED_LARGE Εάν η ταχύτητα λήψης υπερβαίνει αυτήν την τιμή (καθορίζεται σε byte ανά δευτερόλεπτο) κατά μέσο όρο σε ολόκληρη τη μεταφορά, η λήψη θα τεθεί σε παύση για να διατηρηθεί η μέση ταχύτητα μικρότερη ή ίση με αυτήν την παράμετρο. Από προεπιλογή, η ταχύτητα δεν είναι περιορισμένη.
CURLOPT_MAX_SEND_SPEED_LARGE Εάν η μεταφόρτωση στον διακομιστή υπερβαίνει αυτήν την τιμή (καθορίζεται σε byte ανά δευτερόλεπτο) κατά μέσο όρο σε ολόκληρη τη μεταφορά, η μεταφόρτωση θα τεθεί σε παύση για να διατηρηθεί μια μέση ταχύτητα μικρότερη ή ίση με αυτήν την παράμετρο. Από προεπιλογή, η ταχύτητα δεν είναι περιορισμένη. Προστέθηκε στην έκδοση cURL 7.15.5. Διαθέσιμο από την PHP 5.4.0.
CURLOPT_SSH_AUTH_TYPES Ένα bitmask που αποτελείται από μία ή περισσότερες σταθερές: CURLSSH_AUTH_PUBLICKEY, CURLSSH_AUTH_PASSWORD, CURLSSH_AUTH_HOST, CURLSSH_AUTH_KEYBOARD. Εγκαθιστώ CURLSSH_AUTH_ANYπροκειμένου το libcurl να επιλέξει ένα από αυτά ανεξάρτητα. Προστέθηκε στο cURL 7.16.1.
CURLOPT_IPRESOLVE Επιτρέπει σε μια εφαρμογή να επιλέξει τον τύπο της διεύθυνσης IP με την οποία καθορίζεται το όνομα κεντρικού υπολογιστή. Αυτό είναι απαραίτητο εάν χρησιμοποιείτε ένα όνομα κεντρικού υπολογιστή που προέρχεται από περισσότερες από μία εκδόσεις της διεύθυνσης IP. Πιθανές τιμές θα μπορούσαν να είναι CURL_IPRESOLVE_WHATEVER, CURL_IPRESOLVE_V4, CURL_IPRESOLVE_V6και από προεπιλογή CURL_IPRESOLVE_WHATEVER. Προστέθηκε στο cURL 7.10.8.

Για τις ακόλουθες τιμές παραμέτρων επιλογής, η παράμετρος τιμής πρέπει να είναι του τύπου σειρά:

Παράμετρος Ορισμός τιμής τιμής Σημειώσεις
CURLOPT_CAINFO Το όνομα ενός αρχείου που περιέχει ένα ή περισσότερα πιστοποιητικά έναντι των οποίων θα ελεγχθούν οι κόμβοι. Αυτή η παράμετρος έχει νόημα μόνο όταν χρησιμοποιείται σε συνδυασμό με CURLOPT_SSL_VERIFYPEER. Απαιτεί μια απόλυτη διαδρομή.
CURLOPT_CAPATH Ένας κατάλογος που περιέχει πολλά πιστοποιητικά CA. Χρησιμοποιήστε αυτήν την επιλογή σε συνδυασμό με CURLOPT_SSL_VERIFYPEER.
CURLOPT_COOKIE Περιεχόμενο κεφαλίδας "Κουλουράκι:", που χρησιμοποιείται στο αίτημα HTTP. Λάβετε υπόψη ότι πολλά cookies χωρίζονται από ένα ερωτηματικό ακολουθούμενο από ένα κενό (για παράδειγμα, " φρούτο=μήλο; χρώμα = κόκκινο")
CURLOPT_COOKIEFILE Το όνομα του αρχείου που περιέχει τα cookies. Αυτό το αρχείο πρέπει να είναι σε μορφή Netscape ή απλώς κεφαλίδες HTTP γραμμένες στο αρχείο. Εάν μια κενή συμβολοσειρά μεταβιβαστεί ως όνομα αρχείου, τότε τα cookies δεν θα αποθηκευτούν, αλλά η επεξεργασία τους θα εξακολουθεί να είναι ενεργοποιημένη.
CURLOPT_COOKIEJAR Το όνομα του αρχείου στο οποίο θα αποθηκευτούν όλα τα εσωτερικά cookie της τρέχουσας μεταφοράς αφού κλείσει η λαβή, για παράδειγμα αφού καλέσετε το curl_close.
CURLOPT_CUSTOMREQUEST

Αντ' αυτού χρησιμοποιήθηκε προσαρμοσμένη μέθοδος αιτήματος "ΠΑΙΡΝΩ"ή "ΚΕΦΑΛΙ"όταν κάνετε ένα αίτημα HTTP. Αυτό είναι χρήσιμο για ερωτήματα "ΔΙΑΓΡΑΦΩ"ή άλλα, πιο σπάνια αιτήματα HTTP. Οι σωστές έννοιες θα ήταν λέξεις όπως "ΠΑΙΡΝΩ", "ΘΕΣΗ", "ΣΥΝΔΕΩ-ΣΥΩΔΕΟΜΑΙ"και ούτω καθεξής; εκείνοι. Μην εισάγετε ολόκληρη τη γραμμή αιτήματος HTTP εδώ. Για παράδειγμα, μια ένδειξη "GET /index.html HTTP/1.0\r\n\r\n"θα είναι λάθος.

Σχόλιο:

Μην χρησιμοποιείτε αυτήν τη δυνατότητα έως ότου βεβαιωθείτε ότι ο διακομιστής υποστηρίζει αυτόν τον τύπο αιτήματος.

CURLOPT_EGDSOCKET Αρέσει CURLOPT_RANDOM_FILE, εκτός από το ότι το όνομα αρχείου έχει οριστεί στην υποδοχή Entropy Gathering Daemon.
CURLOPT_ENCODING Περιεχόμενο κεφαλίδας "Αποδοχή-Κωδικοποίηση:". Αυτό επιτρέπει την αποκωδικοποίηση του αιτήματος. Οι υποστηριζόμενες κωδικοποιήσεις είναι "Ταυτότητα", "υποτιμώ"Και "gzip". Εάν περάσει μια κενή συμβολοσειρά, "" , αποστέλλεται μια κεφαλίδα που περιέχει όλους τους υποστηριζόμενους τύπους κωδικοποίησης. Προστέθηκε στο cURL 7.10.
CURLOPT_FTPPORT Η τιμή που θα χρησιμοποιηθεί για τον προσδιορισμό της διεύθυνσης IP για την εντολή FTP "PORT". Η εντολή "PORT" λέει στον διακομιστή με ποια διεύθυνση IP πρέπει να συνδεθεί. Αυτό μπορεί να είναι διεύθυνση IP, όνομα κεντρικού υπολογιστή, όνομα διεπαφής δικτύου (υπό το Unix) ή απλά "-" για χρήση της προεπιλεγμένης διεύθυνσης IP του συστήματος.
CURLOPT_INTERFACE Το όνομα της διεπαφής δικτύου που θα χρησιμοποιηθεί. Μπορεί να είναι ένα όνομα διεπαφής, μια διεύθυνση IP ή ένα όνομα κεντρικού υπολογιστή.
CURLOPT_KEYPASSWD Απαιτείται κωδικός πρόσβασης για τη χρήση του ιδιωτικού κλειδιού CURLOPT_SSLKEYή CURLOPT_SSH_PRIVATE_KEYFILE. Προστέθηκε στο cURL 7.16.1.
CURLOPT_KRB4LEVEL Επίπεδο ασφαλείας KRB4 (Kerberos 4). Οποιαδήποτε από τις ακόλουθες τιμές (κατά σειρά από την πιο αδύναμη στην ισχυρότερη) είναι σωστή: "Σαφή", "ασφαλής", "εμπιστευτικός", "ιδιωτικός".. Εάν η καθορισμένη συμβολοσειρά διαφέρει από τις δεδομένες τιμές, θα χρησιμοποιηθεί η τιμή "ιδιωτικός". Ρύθμιση αυτής της επιλογής σε ΜΗΔΕΝΙΚΟθα απενεργοποιήσει εντελώς την ασφάλεια KRB4. Προς το παρόν, η ασφάλεια KRB4 λειτουργεί μόνο με συναλλαγές FTP.
CURLOPT_POSTFIELDS Όλα τα δεδομένα που μεταδίδονται σε ένα αίτημα HTTP POST. Για να μεταφέρετε ένα αρχείο, καθορίστε πριν από το όνομα του αρχείου @ και χρησιμοποιήστε επίσης την πλήρη διαδρομή προς το αρχείο. Ο τύπος αρχείου μπορεί επίσης να καθοριστεί χρησιμοποιώντας τη μορφή " ;type=mimettype" ακολουθώντας το όνομα του αρχείου. Αυτή η παράμετρος μπορεί να μεταβιβαστεί ως συμβολοσειρά με κωδικοποίηση url, όπως " para1=val1¶2=val2&...", και με τη μορφή πίνακα, τα κλειδιά του οποίου θα είναι τα ονόματα των πεδίων και οι τιμές θα είναι το περιεχόμενό τους. Εάν η τιμή είναι πίνακας, η κεφαλίδα Τύπος περιεχομένουθα οριστεί σε πολυμερών/μορφών-δεδομένων. Ξεκινώντας από την PHP 5.2.0, κατά τη μεταφορά αρχείων με το πρόθεμα @ , η τιμή πρέπει να είναι πίνακας. Από την PHP 5.5.0, πρόθεμα @ έχει καταργηθεί και τα αρχεία μπορούν να σταλούν χρησιμοποιώντας CURLFile. Πρόθεμα @ μπορεί να απενεργοποιηθεί για να επιτραπούν τιμές που ξεκινούν με @ ορίζοντας την επιλογή CURLOPT_SAFE_UPLOADστο νόημα ΑΛΗΘΗΣ.
CURLOPT_PROXY Διακομιστής μεσολάβησης HTTP μέσω του οποίου θα δρομολογούνται τα αιτήματα.
CURLOPT_PROXYUSERPWD Σύνδεση και κωδικός γραμμένο στη φόρμα ":" , χρησιμοποιείται κατά τη σύνδεση μέσω διακομιστή μεσολάβησης.
CURLOPT_RANDOM_FILE Το όνομα του αρχείου που χρησιμοποιείται για την προετοιμασία της γεννήτριας τυχαίων αριθμών για SSL.
CURLOPT_RANGE Εύρος δεδομένων προς λήψη, σε μορφή "Χ-Υ", και είτε το X είτε το Y μπορούν να παραληφθούν. Το πρωτόκολλο HTTP υποστηρίζει επίσης τη μετάδοση πολλαπλών περιοχών που χωρίζονται με κόμματα, καθορίζονται στη μορφή "X-Y, N-M".
CURLOPT_REFERER Περιεχόμενο κεφαλίδας "Αναφέρων:", το οποίο θα χρησιμοποιηθεί στο αίτημα HTTP.
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 Μια συμβολοσειρά που περιέχει 32 δεκαεξαδικά ψηφία. Η συμβολοσειρά πρέπει να είναι ένα άθροισμα ελέγχου MD5 του δημόσιου κλειδιού του απομακρυσμένου υπολογιστή και το libcurl θα επαναφέρει τη σύνδεση με τον απομακρυσμένο κεντρικό υπολογιστή έως ότου το άθροισμα ελέγχου ταιριάζει με το δημόσιο κλειδί. Αυτή η επιλογή είναι μόνο για μεταφορά δεδομένων χρησιμοποιώντας SCP και SFTP. Προστέθηκε στο cURL 7.17.1.
CURLOPT_SSH_PUBLIC_KEYFILE Το όνομα αρχείου για το δημόσιο κλειδί σας. Εάν δεν έχει καθοριστεί, το libcurl ορίζει ως προεπιλογή το αρχείο $HOME/.ssh/id_dsa.pub εάν έχει οριστεί η μεταβλητή περιβάλλοντος HOME και το αρχείο "id_dsa.pub" στον τρέχοντα κατάλογο εάν δεν έχει οριστεί η μεταβλητή περιβάλλοντος HOME. Προστέθηκε στο cURL 7.16.1.
CURLOPT_SSH_PRIVATE_KEYFILE Το όνομα αρχείου για το ιδιωτικό κλειδί σας. Εάν δεν έχει καθοριστεί, το libcurl ορίζει ως προεπιλογή το αρχείο $HOME/.ssh/id_dsa εάν έχει οριστεί η μεταβλητή περιβάλλοντος HOME και το αρχείο "id_dsa" στον τρέχοντα κατάλογο εάν δεν έχει οριστεί η μεταβλητή περιβάλλοντος HOME. Εάν το αρχείο προστατεύεται με κωδικό πρόσβασης, ορίστε τον κωδικό πρόσβασης χρησιμοποιώντας CURLOPT_KEYPASSWD. Προστέθηκε στο cURL 7.16.1.
CURLOPT_SSL_CIPHER_LIST Λίστα κρυπτογράφησης που χρησιμοποιούνται στις μεταφορές SSL. Για παράδειγμα, RC4-SHAΚαι TLSv1είναι έγκυρες λίστες κρυπτογράφησης.
CURLOPT_SSLCERT Το όνομα ενός αρχείου με σωστά διαμορφωμένο πιστοποιητικό PEM.
CURLOPT_SSLCERTPASSWD Απαιτείται κωδικός πρόσβασης για τη χρήση του πιστοποιητικού CURLOPT_SSLCERT.
CURLOPT_SSLCERTTYPE Μορφή πιστοποιητικού. Υποστηριζόμενες μορφές "PEM"(Προκαθορισμένο), "DER"Και "ENG". Προστέθηκε στην έκδοση cURL 7.9.3.
CURLOPT_SSLENGINE Το αναγνωριστικό μηχανής κρυπτογράφησης για το ιδιωτικό κλειδί SSL που καθορίζεται στην παράμετρο CURLOPT_SSLKEY.
CURLOPT_SSLENGINE_DEFAULT Το αναγνωριστικό του μηχανισμού κρυπτογράφησης που χρησιμοποιείται για λειτουργίες ασύμμετρης κρυπτογράφησης.
CURLOPT_SSLKEY Το όνομα του αρχείου ιδιωτικού κλειδιού SSL.
CURLOPT_SSLKEYPASSWD

Ο μυστικός κωδικός πρόσβασης που απαιτείται για τη χρήση του ιδιωτικού κλειδιού SSL που καθορίζεται από την παράμετρο CURLOPT_SSLKEY.

Σχόλιο:

Δεδομένου ότι αυτή η παράμετρος περιέχει έναν πολύτιμο κωδικό πρόσβασης, θυμηθείτε να διατηρήσετε αυτό το σενάριο PHP σε ασφαλές μέρος.

CURLOPT_SSLKEYTYPE Ο τύπος του ιδιωτικού κλειδιού SSL που καθορίζεται στην παράμετρο CURLOPT_SSLKEY. Υποστηρίζονται οι ακόλουθοι τύποι κλειδιών: "PEM"(Προκαθορισμένο), "DER"Και "ENG".
CURLOPT_URL URL με δυνατότητα λήψης. Αυτή η παράμετρος μπορεί επίσης να οριστεί κατά την προετοιμασία μιας συνεδρίας χρησιμοποιώντας curl_init().
CURLOPT_USERAGENT Περιεχόμενο κεφαλίδας "User-Agent:", αποστέλλεται σε αίτημα HTTP.
CURLOPT_USERPWD Σύνδεση και κωδικός πρόσβασης που χρησιμοποιούνται κατά τη σύνδεση, που καθορίζονται στη μορφή ":" .

Για τις ακόλουθες τιμές παραμέτρων επιλογής, η παράμετρος τιμής πρέπει να είναι πίνακας:

Παράμετρος Ορισμός τιμής τιμής Σημειώσεις
CURLOPT_HTTP200LIASES Μια σειρά από απαντήσεις HTTP 200 που θα αντιμετωπίζονται ως σωστές απαντήσεις και όχι ως λανθασμένες. Προστέθηκε στην έκδοση cURL 7.10.3.
CURLOPT_HTTPHEADER Μια συστοιχία κεφαλίδων HTTP, σε πίνακα μορφής ("Τύπος περιεχομένου: κείμενο/απλό", "Μήκος περιεχομένου: 100")
CURLOPT_POSTQUOTE Μια σειρά από εντολές FTP που εκτελούνται στον διακομιστή μετά την ολοκλήρωση ενός αιτήματος FTP.
CURLOPT_QUOTE Μια σειρά από εντολές FTP που εκτελούνται στον διακομιστή πριν από την υποβολή αιτήματος FTP.

Για τις ακόλουθες τιμές παραμέτρων επιλογής, η παράμετρος τιμής πρέπει να είναι μια λαβή ροής (που επιστρέφεται, για παράδειγμα, από τη συνάρτηση fopen()):

Παράμετρος Ορισμός τιμής τιμής
CURLOPT_FILE Το αρχείο στο οποίο θα γραφτεί το αποτέλεσμα της μεταφοράς. Προεπιλεγμένη ροή εξόδου STDOUT(παράθυρο προγράμματος περιήγησης).
CURLOPT_INFILE Το αρχείο από το οποίο πρέπει να διαβάζονται τα δεδομένα κατά τη μεταφόρτωση στον διακομιστή.
CURLOPT_STDERR Εναλλακτικό αρχείο εξόδου σφάλματος που χρησιμοποιείται στη θέση της ροής σφαλμάτων STDERR.
CURLOPT_WRITEHEADER Το αρχείο στο οποίο θα γραφτούν οι κεφαλίδες της τρέχουσας λειτουργίας.

Για τις ακόλουθες τιμές παραμέτρων επιλογής, η παράμετρος τιμής πρέπει να είναι έγκυρο όνομα συνάρτησης ή κλείσιμο:

Παράμετρος Ορισμός τιμής τιμής
CURLOPT_HEADERFUNCTION Η λειτουργία επανάκλησης λαμβάνει δύο παραμέτρους. Η πρώτη παράμετρος είναι η λαβή cURL, η δεύτερη παράμετρος είναι μια συμβολοσειρά που περιέχει τις κεφαλίδες που πρέπει να γραφτούν. Οι κεφαλίδες πρέπει να γράφονται χρησιμοποιώντας αυτήν τη συνάρτηση επανάκλησης. Θα πρέπει να επιστρέψει τον αριθμό των byte που γράφτηκαν.
CURLOPT_PASSWDFUNCTION Η λειτουργία επανάκλησης λαμβάνει τρεις παραμέτρους. Η πρώτη παράμετρος είναι η λαβή cURL, η δεύτερη παράμετρος είναι η συμβολοσειρά προτροπής κωδικού πρόσβασης και η τρίτη παράμετρος είναι το μέγιστο μήκος κωδικού πρόσβασης. Θα πρέπει να επιστρέψει μια συμβολοσειρά που περιέχει τον κωδικό πρόσβασης.
CURLOPT_PROGRESSFUNCTION

Η λειτουργία επανάκλησης λαμβάνει πέντε παραμέτρους. Το πρώτο είναι ο περιγραφέας cURL, το δεύτερο είναι ο συνολικός αριθμός των byte που αναμένεται να ληφθούν από τον διακομιστή, το τρίτο είναι ο αριθμός των byte που έχουν ήδη ληφθεί, το τέταρτο είναι ο συνολικός αριθμός των byte που αναμένεται να σταλούν στον διακομιστή και το πέμπτο είναι ο αριθμός των byte που έχουν ήδη σταλεί.

Σχόλιο:

Η λειτουργία επανάκλησης καλείται μόνο εάν η επιλογή CURLOPT_NOPROGRESSοριστεί σε τιμή ΨΕΥΔΗΣ.

Μπορείτε να επιστρέψετε μια μη μηδενική τιμή για να ακυρώσετε τη μεταφορά. Σε αυτή την περίπτωση θα εμφανιστεί ένα σφάλμα CURLE_ABORTED_BY_CALLBACK.

CURLOPT_READFUNCTION Η λειτουργία επανάκλησης λαμβάνει τρεις παραμέτρους. Η πρώτη παράμετρος είναι η λαβή cURL, η δεύτερη παράμετρος είναι ο πόρος ροής που μεταβιβάστηκε στο cURL μέσω της επιλογής CURLOPT_INFILE, και η τρίτη παράμετρος είναι η μέγιστη επιτρεπόμενη ποσότητα δεδομένων προς ανάγνωση. Η συνάρτηση επανάκλησης πρέπει να επιστρέφει μια συμβολοσειρά μήκους όχι μεγαλύτερη από την απαιτούμενη ποσότητα δεδομένων, συνήθως με ανάγνωση από τον πόρο ροής που έχει περάσει. Θα πρέπει να επιστρέψει μια κενή συμβολοσειρά για να σηματοδοτήσει το τέλος του αρχείου ΕΟΦ.
CURLOPT_WRITEFUNCTION Η λειτουργία επανάκλησης λαμβάνει δύο παραμέτρους. Η πρώτη παράμετρος είναι η λαβή cURL και η δεύτερη παράμετρος είναι η συμβολοσειρά που περιέχει τα δεδομένα που πρέπει να γραφτούν. Τα δεδομένα πρέπει να αποθηκεύονται χρησιμοποιώντας αυτήν τη λειτουργία. Πρέπει να επιστρέψει τον ακριβή αριθμό των γραμμένων byte, διαφορετικά η λήψη θα ματαιωθεί με σφάλμα.

Άλλες έννοιες:

Επιστρεφόμενες τιμές

Επιστροφές ΑΛΗΘΗΣμετά την επιτυχή ολοκλήρωση ή ΨΕΥΔΗΣσε περίπτωση λάθους.

Λίστα αλλαγών

Εκδοχή Περιγραφή
5.6.0 Επιλογή CURL_SAFE_UPLOADτώρα έχει μια προεπιλεγμένη τιμή ΑΛΗΘΗΣ.
5.6.0 Καταργήθηκε η επιλογή CURLOPT_CLOSEPOLICYκαι τις σχετικές έννοιές του.
5.5.0 Ο πόρος cURL προστίθεται ως το πρώτο όρισμα στη συνάρτηση επανάκλησης CURLOPT_PROGRESSFUNCTION.
5.5.0 Προστέθηκε επιλογή CURLOPT_SHARE.
5.3.0 Προστέθηκε επιλογή CURLOPT_PROGRESSFUNCTION.
5.2.10 Προστέθηκαν επιλογές CURLOPT_PROTOCOLSΚαι CURLOPT_REDIR_PROTOCOLS.
5.1.0 Προστέθηκαν επιλογές CURLOPT_AUTOREFERER, CURLOPT_BINARYTRANSFER, CURLOPT_FTPSSLAUTH, CURLOPT_PROXYAUTHΚαι CURLOPT_TIMECONDITION.
5.0.0 Προστέθηκαν επιλογές CURLOPT_FTP_USE_EPRT, CURLOPT_NOSIGNAL, CURLOPT_UNRESTRICTED_AUTH, CURLOPT_BUFFERSIZE, CURLOPT_HTTPAUTH, CURLOPT_PROXYPORT, CURLOPT_PROXYTYPE, CURLOPT_SSLCERTTYPEΚαι CURLOPT_HTTP200LIASES.

Παραδείγματα

Παράδειγμα #1 Εκκίνηση μιας περιόδου λειτουργίας CURL και φόρτωση μιας ιστοσελίδας

// Δημιουργία νέου πόρου cURL
$ch = curl_init();

/* http://localhost/upload.php:
print_r($_POST);
print_r($_FILES);
*/

$ch = curl_init();

$data = array("name" => "Foo" , "file" => "@/home/user/test.png" );

Curl_setopt($ch, CURLOPT_URL, "http://localhost/upload.php");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

Curl_exec($ch);
?>

Το αποτέλεσμα της εκτέλεσης αυτού του παραδείγματος:

Πίνακας ( => Foo) Πίνακας ( => Πίνακας ( => test.png => εικόνα/png => /tmp/phpcpjNeQ => 0 => 279))

Σημειώσεις

Σχόλιο:

Μεταβίβαση πίνακα σε CURLOPT_POSTFIELDSκωδικοποιεί τα δεδομένα ως πολυμερών/μορφών-δεδομένων, ενώ η μετάδοση μιας συμβολοσειράς με κωδικοποίηση URL θα κωδικοποιήσει τα δεδομένα ως application/x-www-form-urlencoded.

Το cURL είναι ένα εργαλείο που σας επιτρέπει να αλληλεπιδράτε με διάφορους διακομιστές και υποστηρίζει πολλά πρωτόκολλα: HTTP, FTP, TELNET κ.λπ. Το cURL είναι αρχικά ένα βοηθητικό πρόγραμμα γραμμής εντολών. Αλλά, ευτυχώς για εμάς, η PHP υποστηρίζει την εργασία με τη βιβλιοθήκη cURL. Σε αυτό το άρθρο θα δούμε μη τετριμμένα παραδείγματα εργασίας με το cURL.

Γιατί cURL;

Στην πραγματικότητα, υπάρχουν πολλοί άλλοι τρόποι για να στείλετε ένα αίτημα σε άλλο διακομιστή, για παράδειγμα, να ανακτήσετε το περιεχόμενο μιας σελίδας. Πολλοί άνθρωποι, κυρίως από τεμπελιά, χρησιμοποιούν απλές συναρτήσεις PHP αντί για cURL:

$content = file_get_contents("http://www.example.com"); // ή $lines = file("http://www.example.com"); // ή readfile("http://www.example.com");

Ωστόσο, δεν επιτρέπουν τον αποτελεσματικό χειρισμό σφαλμάτων. Υπάρχει επίσης μια σειρά από εργασίες που δεν μπορούν να κάνουν καθόλου - για παράδειγμα, εργασία με cookies, εξουσιοδότηση, δημοσίευση αιτημάτων, λήψη αρχείων.

Το cUrl είναι ένα ισχυρό εργαλείο που υποστηρίζει πολλαπλά πρωτόκολλα και παρέχει πλήρεις πληροφορίες αιτημάτων.

Βασικά στοιχεία cUrl

Πριν προχωρήσουμε σε πολύπλοκα παραδείγματα, ας δούμε τη βασική δομή ενός αιτήματος cURL στην PHP. Για να εκτελέσετε ένα αίτημα cURL στην PHP, πρέπει να ακολουθήσετε 4 βασικά βήματα:

  1. Αρχικοποίηση.
  2. Ρύθμιση επιλογών.
  3. Εκτέλεση του αιτήματος.
  4. Πόροι καθαρισμού.
// 1. αρχικοποίηση $ch = curl_init(); // 2. ορίστε επιλογές, συμπεριλαμβανομένης της διεύθυνσης URL curl_setopt($ch, CURLOPT_URL, "http://www.google.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. εκτέλεση της αίτησης και λήψη της απάντησης $output = curl_exec($ch); // 4. καθαρισμός πόρων curl_close($ch);

Θα εξετάσουμε κυρίως το βήμα #2 σε αυτό το άρθρο, καθώς εκεί συμβαίνει η μαγεία. Η λίστα των επιλογών cURL είναι πολύ μεγάλη, επομένως δεν θα εξετάσουμε όλες τις επιλογές σήμερα, αλλά θα χρησιμοποιήσουμε αυτές που είναι χρήσιμες για την επίλυση συγκεκριμένων προβλημάτων.

Παρακολούθηση σφαλμάτων

Εάν είναι απαραίτητο, μπορείτε να προσθέσετε τις ακόλουθες γραμμές για την παρακολούθηση σφαλμάτων:

// ... $output = curl_exec($ch); if ($output === FALSE) ( echo "cURL Error: " . curl_error($ch); ) // ...

Λάβετε υπόψη ότι χρησιμοποιούμε "===" αντί για "==" επειδή Είναι απαραίτητο να γίνει διάκριση μεταξύ μιας κενής απόκρισης διακομιστή και της τιμής Boole FALSE, η οποία επιστρέφεται σε περίπτωση σφάλματος.

Λήψη πληροφοριών σχετικά με ένα αίτημα

Ένα άλλο προαιρετικό βήμα είναι να λάβετε πληροφορίες σχετικά με το αίτημα cURL μετά την εκτέλεσή του.

// ... curl_exec($ch); $πληροφορίες = curl_getinfo($ch); ηχώ "Πήρε" . $info["total_time"] . "δευτερόλεπτα για url". $info["url"]; //...

Ως αποτέλεσμα, θα λάβετε έναν πίνακα με τις ακόλουθες πληροφορίες:

  • "url"
  • "Τύπος περιεχομένου"
  • "http_code"
  • "header_size"
  • "request_size"
  • "χρόνος αρχείου"
  • "ssl_verify_result"
  • "redirect_count"
  • "συνολικός χρόνος"
  • "namelookup_time"
  • "connect_time"
  • "pretransfer_time"
  • "size_upload"
  • "size_download"
  • "speed_download"
  • "speed_upload"
  • "download_content_length"
  • "upload_content_length"
  • "starttransfer_time"
  • "redirect_time"

Ανακατεύθυνση παρακολούθησης, ανάλογα με το πρόγραμμα περιήγησης

Σε αυτό το παράδειγμα, θα γράψουμε ένα σενάριο που θα ανιχνεύει ανακατευθύνσεις με βάση διαφορετικές ρυθμίσεις του προγράμματος περιήγησης. Για παράδειγμα, ορισμένοι ιστότοποι ανακατευθύνουν επισκέπτες από κινητές συσκευές σε επισκέπτες από άλλες χώρες.

Θα χρησιμοποιήσουμε την επιλογή CURLOPT_HTTPHEADER για να ορίσουμε τις δικές μας κεφαλίδες, συμπεριλαμβανομένων των User-Agent και Language, και να δούμε πού μας ανακατευθύνουν οι ιστότοποι.

// URLs $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // browsers $browsers = array("standard" => array ("user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5. 6 (.NET CLR 3.5.30729)", "language" => "en-us,en;q=0.5"), "iphone" => πίνακας ("user_agent" => "Mozilla/5.0 (iPhone; U; CPU όπως το Mac OS X, en) AppleWebKit/420+ (KHTML, όπως Gecko) Έκδοση/3.0 Mobile/1A537a Safari/419.3", "language" => "en"), "γαλλικά" => πίνακας ("user_agent" = > "Mozilla/4.0 (συμβατό; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "language" => "fr,fr-FR;q=0.5")); foreach ($urls ως $url) ( echo "URL: $url\n"; foreach ($browsers ως $test_name => $browser) ( $ch = curl_init(); // ορίστε τη διεύθυνση curl_setopt($ch, CURLOPT_URL , $url); // υποδεικνύουν το πρόγραμμα περιήγησης και τη γλώσσα που χρησιμοποιείται curl_setopt($ch, CURLOPT_HTTPHEADER, array("User-Agent: ($browser["user_agent"])", "Accept-Language: ($browser["language" ]) ")); // δεν χρειαζόμαστε τα περιεχόμενα της σελίδας curl_setopt($ch, CURLOPT_NOBODY, 1); // χρειαζόμαστε μόνο κεφαλίδες curl_setopt($ch, CURLOPT_HEADER, 1); // αντ' αυτού επιστρέψτε το αποτέλεσμα της εξόδου του curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1); $output = curl_exec($ch); curl_close($ch); // ορίζει ανακατευθύνσεις στις κεφαλίδες HTTP; if (preg_match("!Τοποθεσία: (.*)!" , $output, $matches)) ( echo "$test_name: ανακατευθύνει σε $matches\n"; ) else (echo "$test_name: χωρίς ανακατεύθυνση\n"; ) ) echo "\n\n"; )

Σε έναν βρόχο ελέγχουμε τα προγράμματα περιήγησης για κάθε URL. Πρώτα ορίζουμε τις επιλογές για το αίτημά μας: URL και πρόγραμμα περιήγησης και γλώσσα προς δοκιμή.

Επειδή Έχουμε ορίσει μια ειδική επιλογή· το αποτέλεσμα του αιτήματος θα περιέχει μόνο κεφαλίδες HTTP. Χρησιμοποιώντας μια απλή τυπική έκφραση, μπορούμε να ελέγξουμε αν η απάντηση περιέχει τη συμβολοσειρά "Τοποθεσία:".

Αποτέλεσμα εκτέλεσης σεναρίου:

URL: http://www.cnn.com standard: ανακατευθύνσεις στο http://edition.cnn.com/ iphone: ανακατευθύνσεις στο http://edition.cnn.com/ Γαλλικά: ανακατευθύνσεις στο http://edition.cnn .com/ URL: http://www.mozilla.com standard: ανακατευθύνσεις σε https://www.mozilla.org/firefox/ iphone: ανακατευθύνσεις σε https://www.mozilla.org/firefox/ γαλλικά: ανακατευθύνσεις σε https://www.mozilla.org/firefox/ URL: http://www.facebook.com standard: ανακατευθύνσεις στο https://www.facebook.com/ iphone: ανακατευθύνσεις στο http://m.facebook.com /?refsrc=http%3A%2F%2Fwww.facebook.com%2F&_rdr Γαλλικά: χωρίς ανακατεύθυνση

Αποστολή αιτημάτων POST

Κατά την εκτέλεση αιτημάτων GET, τα δεδομένα μπορούν να μεταβιβαστούν στη συμβολοσειρά ερωτήματος. Για παράδειγμα, όταν κάνετε αναζήτηση στο Google, το ερώτημά σας μεταφράζεται σε μια διεύθυνση URL:

http://www.google.com/search?q=google

Για να λάβετε το αποτέλεσμα αυτού του ερωτήματος δεν χρειάζεστε καν cURL, μπορείτε να είστε τεμπέλης και να χρησιμοποιήσετε το "file_get_contents()".

Αλλά ορισμένες φόρμες HTML χρησιμοποιούν τη μέθοδο POST. Σε αυτήν την περίπτωση, τα δεδομένα αποστέλλονται στο σώμα του μηνύματος αιτήματος και όχι στο ίδιο το URL.

Ας γράψουμε ένα σενάριο που θα στέλνει αιτήματα POST. Αρχικά, ας δημιουργήσουμε ένα απλό αρχείο PHP που θα δέχεται αυτά τα αιτήματα και θα επιστρέφει τα δεδομένα που αποστέλλονται σε αυτό. Ας το ονομάσουμε post_output.php :

$url = "http://localhost/post_output.php"; $post_data = πίνακας ("foo" => "bar", "query" => "FooBar", "action" => "Υποβολή"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // κάντε ένα αίτημα POST curl_setopt($ch, CURLOPT_POST, 1); // προσθήκη δεδομένων curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $output;

Αυτό το σενάριο θα βγει:

Πίνακας ( => γραμμή => FooBar => Υποβολή)

Αυτό το σενάριο έστειλε ένα αίτημα POST στο αρχείο post_output.php. που εξήγαγε τα περιεχόμενα του πίνακα $_POST και λάβαμε αυτήν την απάντηση χρησιμοποιώντας το cURL.

Μεταφόρτωση αρχείων

Όπως και στο προηγούμενο παράδειγμα, ας δημιουργήσουμε ένα αρχείο που θα δέχεται αιτήματα, upload_output.php :

Print_r($_FILES);

Και το ίδιο το σενάριο που κατεβάζει τα αρχεία:

$url = "http://localhost/upload_output.php"; $post_data = πίνακας ("foo" => "bar", // αρχείο για μεταφόρτωση "upload" => "@/tmp/desert.jpg"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $output;

Εάν θέλετε να ανεβάσετε ένα αρχείο, το μόνο που χρειάζεται να κάνετε είναι να περάσετε τη διαδρομή προς αυτό, ακριβώς όπως μια κανονική παράμετρος αιτήματος POST, με πρόθεμα "@". Το αποτέλεσμα του σεναρίου:

Πίνακας ( => Πίνακας ( => desert.jpg => application/octet-stream => /tmp/phpAhEvXy => 0 => 845941))

Multi cURL

Ένα από τα προηγμένα χαρακτηριστικά του cURL στην PHP είναι η δυνατότητα εκτέλεσης πολλαπλών αιτημάτων ταυτόχρονα και ασύγχρονα.

Υπό κανονικές συνθήκες, το σενάριο σταματά και περιμένει να ολοκληρωθεί το αίτημα. Και αν χρειαστεί να εκτελέσετε πολλά ερωτήματα, μπορεί να χρειαστεί πολύς χρόνος, γιατί... θα εκτελέσετε διαδοχικά. Αυτός ο περιορισμός μπορεί να παρακαμφθεί:

// δημιουργία χειριστών $ch1 = curl_init(); $ch2 = curl_init(); // ορίστε επιλογές curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/"); curl_setopt($ch1, CURLOPT_HEADER, 0); curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/"); curl_setopt($ch2, CURLOPT_HEADER, 0); //δημιουργία της πολλαπλής λαβής cURL $mh = curl_multi_init(); // προσθήκη χειριστών curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $running = null; // εκτελέστε τα αιτήματα do ( curl_multi_exec($mh, $running); ) while ($running > 0); // ελευθερώστε πόρους curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);

Η ιδέα είναι ότι μπορείτε να δημιουργήσετε πολλαπλές λαβές cURL, να τις συνδυάσετε κάτω από μια πολλαπλή λαβή και να τις εκτελέσετε ασύγχρονα.

Πρώτον, όλα είναι ίδια όπως με ένα κανονικό αίτημα cURL - δημιουργείται ένας περιγραφέας ( curl_init() ), ορίζονται οι παράμετροι ( curl_setopt() ). Στη συνέχεια, δημιουργείται ένας πολλαπλός περιγραφέας ( curl_multi_init() ) και προστίθενται οι κανονικοί περιγραφείς που δημιουργήθηκαν προηγουμένως ( curl_multi_add_handle() ). Αντί να καλέσουμε κανονικά τη curl_exec(), θα καλέσουμε curl_multi_exec() αυτή η συνάρτηση μας ενημερώνει για τον αριθμό των ενεργών συνδέσεων χρησιμοποιώντας τη δεύτερη παράμετρο - $running. Επομένως, ο βρόχος τρέχει έως ότου το $running γίνει ίσο με 0. Και, φυσικά, μετά την ολοκλήρωση της εργασίας, είναι απαραίτητο να απελευθερωθούν πόροι.

Σε αυτό το παράδειγμα, απλώς εξάγουμε το αποτέλεσμα των ερωτημάτων στο STDOUT. Ας εξετάσουμε μια μη τετριμμένη περίπτωση χρήσης multi cURL.

Έλεγχος εξωτερικών συνδέσμων στο WordPress

Φανταστείτε ένα blog με πολλές αναρτήσεις που περιέχουν συνδέσμους προς εξωτερικούς ιστότοπους. Ορισμένοι από αυτούς τους συνδέσμους ενδέχεται να μην λειτουργούν.

Ας γράψουμε ένα σενάριο που θα βρίσκει όλους τους κατεστραμμένους συνδέσμους και θα μας τους δείχνει.

Αρχικά, πρέπει να τραβήξουμε όλους τους εξωτερικούς συνδέσμους από τη βάση δεδομένων:

// CONFIG $db_host = "localhost"; $db_user = "root"; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "site"); $max_connections = 10; $url_list = array(); $working_urls = array(); $dead_urls = array(); $not_found_urls = array(); $active = null; // συνδεθείτε στο MySQL if (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Δεν ήταν δυνατή η σύνδεση: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Could να μην επιλέξετε db: " . mysql_error()); ) // λάβετε όλες τις αναρτήσεις με συνδέσμους στο κείμενο $q = "SELECT post_content FROM wp_posts WHERE post_content LIKE "%href=%" AND post_status = "publish" AND post_type = "post " "; $r = mysql_query($q) ή die(mysql_error()); ενώ ($d = mysql_fetch_assoc($r)) ( // συλλέγει όλους τους συνδέσμους χρησιμοποιώντας κανονική έκφραση if (preg_match_all("/href=\"(.*?)\"/", $d["post_content"], $match )) ( foreach ($ταιριάζει ως $url) ( // φιλτράρετε τους περιττούς τομείς $tmp = parse_url($url); if (isset($tmp["host"]) && in_array($tmp["host"], $ excluded_domains)) ( συνέχεια; ) // βάλτε μαζί $url_list = $url; ) ) ) // αφαίρεση επαναλήψεων $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Δεν υπάρχει URL για έλεγχο"); )

Σε αυτό το μέρος του σεναρίου, απλώς βγάζουμε όλους τους εξωτερικούς συνδέσμους από τη βάση δεδομένων. Ας τα ελέγξουμε:

$mh = curl_multi_init(); // 1. προσθέστε συνδέσμους για ($i = 0; $i< $max_connections; $i++) { add_url_to_multi_handle($mh, $url_list); } // основной цикл do { curl_multi_exec($mh, $curRunning); // 2. один из потоков завершил работу if ($curRunning != $running) { $mhinfo = curl_multi_info_read($mh); if (is_array($mhinfo) && ($ch = $mhinfo["handle"])) { // 3. один из запросов выполнен, можно получить информацию о нем $info = curl_getinfo($ch); // 4. нерабочая ссылка if (!$info["http_code"]) { $dead_urls = $info["url"]; // 5. 404? } else if ($info["http_code"] == 404) { $not_found_urls = $info["url"]; // 6. верная ссылка } else { $working_urls = $info["url"]; } // 7. удаляем отработавший дескриптор curl_multi_remove_handle($mh, $mhinfo["handle"]); curl_close($mhinfo["handle"]); // 8. добавим новый урл add_url_to_multi_handle($mh, $url_list); $running = $curRunning; } } } while ($curRunning >0); curl_multi_close($mh); echo "==Νεκρές διευθύνσεις URL==\n"; echo implode("\n", $dead_urls) . "\n\n"; echo "==404 URLs==\n"; echo implode("\n", $not_found_urls) . "\n\n"; echo "==Διευθύνσεις URL εργασίας==\n"; echo implode("\n", $working_urls); ηχώ "\n\n"; // 9. προσθέτει μια λαβή με τη δεδομένη συνάρτηση URL add_url_to_multi_handle($mh, $url_list) ( στατικό $index = 0; // εάν υπάρχουν ακόμα σύνδεσμοι if (isset($url_list[$index])) ( // Everything είναι ως συνήθως $ ch = curl_init(); // ορίστε επιλογές curl_setopt($ch, CURLOPT_URL, $url_list[$index]); // επιστρέφει αντί να εμφανίζει το αποτέλεσμα curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // επιτρέπω ανακατευθύνει curl_setopt($ ch, CURLOPT_FOLLOWLOCATION, 1); // λάβετε μόνο κεφαλίδες για εξοικονόμηση χρόνου curl_setopt($ch, CURLOPT_NOBODY, 1); // προσθήκη στο multi-handle curl_multi_add_handle($mh, $ch); $index++; )

Ας δούμε τον κωδικό πιο αναλυτικά (η αρίθμηση αντιστοιχεί στα σχόλια στον κώδικα):

  1. Προσθέτουμε έναν αρχικό αριθμό περιγραφέων για να μην υπερφορτώνουμε το σύστημα με νήματα. Ο αριθμός ελέγχεται από τη μεταβλητή $max_connections.
  2. Η μεταβλητή $curRunning αποθηκεύει τον αριθμό των νημάτων που εκτελούνται, η $running αποθηκεύει την προηγούμενη τιμή· εάν γίνουν άνισες, τότε ένα από τα νήματα έχει ολοκληρώσει την εργασία.
  3. Λαμβάνουμε πληροφορίες σχετικά με το ολοκληρωμένο αίτημα.
  4. Εάν δεν υπάρχει απάντηση από τον διακομιστή, ο σύνδεσμος δεν λειτουργεί.
  5. Η απόκριση του διακομιστή είναι 404.
  6. Διαφορετικά ο σύνδεσμος λειτουργεί.
  7. Το αίτημα ολοκληρώθηκε, απελευθερώνουμε πόρους.
  8. Ας προσθέσουμε μια νέα διεύθυνση URL στον multi descriptor.
  9. Λειτουργία add_url_to_multi_handle() προσθέτει μια νέα λαβή με τη δεδομένη διεύθυνση URL στον multi-descriptor.

Ας τρέξουμε το σενάριο:

Νεκρές διευθύνσεις URL== xample1234.com/ ==404 διευθύνσεις URL== www.google.com/dsfasdfafd ==Διευθύνσεις URL εργασίας== ru.php.net/manual/ru/function.time.php www.cssbuttongenerator.com/ csslint. net/ codex.wordpress.org/Plugin_API/Action_Reference fortawesome.github.io/Font-Awesome/ fortawesome.github.io/Font-Awesome/ www.oracle.com/technetwork/java/javafx/downloads/index.html κώδικας. wordpress.org/Plugin_API/Filter_Reference codex.wordpress.org/Roles_and_Capabilities code.google.com/p/google-api-php-client/wiki/OAuth2#Google_APIs_Console jplayer.org/ code.google.com/p/google-api -php-client/ developers.google.com/+/ accounts.google.com/ServiceLogin?service=devconsole&passive=1209600&continue=https%3A%2F%2Fcode.google.com%2Fapis%2Fconsole%2F&followup=https%3A%2F %2Fcode.google.com%2Fapis%2Fconsole%2F daneden.github.io/animate.css/ github.com/daneden/animate.css ru2.php.net/manual/ru/function.autoload.php www.google. com/recaptcha/api/verify phpunit.de/phpunit.de/manual/current/en/phpunit-book.html

Ο έλεγχος κράτησε περίπου 2 δευτερόλεπτα. Εκτελώντας 10 νήματα ταυτόχρονα, η απόδοση αυξάνεται 10 φορές σε σύγκριση με τα κανονικά αιτήματα cURL. Για να λάβετε τα περιεχόμενα της απόκρισης του διακομιστή, χρησιμοποιήστε τη συνάρτηση curl_multi_getcontent($ch) , όπου το $ch είναι ένας περιγραφέας που λαμβάνεται από curl_multi_info_read() .

Άλλες δυνατότητες cURL στην PHP

Έλεγχος ταυτότητας HTTP

Εάν το αίτημα HTTP απαιτεί έλεγχο ταυτότητας, χρησιμοποιήστε τον ακόλουθο κώδικα:

$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // αποστολή ονόματος χρήστη και κωδικού πρόσβασης curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // εάν επιτρέπονται οι ανακατευθύνσεις curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // Το cURL θα στείλει τον κωδικό πρόσβασης μετά τις ανακατευθύνσεις curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); curl_close($ch);

Μεταφόρτωση μέσω FTP

Η PHP έχει τη δική της βιβλιοθήκη για εργασία με FTP, αλλά μπορείτε επίσης να χρησιμοποιήσετε το cURL:

// διαβάστε το αρχείο $file = fopen("/path/to/file", "r"); // url περιέχει ήδη τα απαραίτητα δεδομένα $url = "ftp://username: [email προστατευμένο]:21/path/to/new/file"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // επιλογές curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, μέγεθος αρχείου("/path/to/file")); curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec($ ch); curl_close($ch);

Χρήση διακομιστή μεσολάβησης

Τα αιτήματα μπορούν να υποβληθούν μέσω ενός συγκεκριμένου πληρεξούσιου:

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // διεύθυνση διακομιστή μεσολάβησης curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // εάν απαιτείται εξουσιοδότηση curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $output = curl_exec($ch); curl_close($ch);

Λειτουργίες επανάκλησης

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

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://example.com"); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function"); curl_exec($ch); curl_close($ch); συνάρτηση progress_function($ch,$str) (echo $str; return strlen($str); )

Η συνάρτηση επανάκλησης πρέπει να επιστρέψει το μήκος της συμβολοσειράς για να λειτουργήσει σωστά το αίτημα.

Κάθε φορά που λαμβάνεται το επόμενο μέρος της απάντησης διακομιστή, θα καλείται μια επανάκληση.

συμπέρασμα

Σε αυτό το άρθρο, εξετάσαμε τις προηγμένες δυνατότητες του cURL στην PHP. Την επόμενη φορά που θα χρειαστεί να κάνετε αιτήματα URL, χρησιμοποιήστε το cURL.

Συχνά πρέπει να κατεβάσουμε διάφορα αρχεία από το Διαδίκτυο, για παράδειγμα, εκτελέσιμα αρχεία προγράμματος, αρχεία σεναρίων, αρχειοθήκες προέλευσης. Αλλά αυτό δεν χρειάζεται πάντα να γίνεται μέσω του προγράμματος περιήγησης. Σε πολλές περιπτώσεις είναι πολύ πιο εύκολο να εκτελέσετε όλες τις ενέργειες μέσω του τερματικού. Γιατί με αυτόν τον τρόπο μπορείτε να αυτοματοποιήσετε τη διαδικασία. Από την άλλη πλευρά, οι webmasters πρέπει από καιρό σε καιρό να ελέγχουν την προσβασιμότητα του ιστότοπου, να ελέγχουν τις κεφαλίδες που έχουν αποσταλεί και ληφθεί και πολλά άλλα.

Για να επιλύσετε τέτοια προβλήματα και προβλήματα παρόμοιου εύρους, μπορείτε να χρησιμοποιήσετε το βοηθητικό πρόγραμμα curl. Σας επιτρέπει να λύσετε ένα πολύ ευρύτερο φάσμα προβλημάτων, συμπεριλαμβανομένης ακόμη και της προσομοίωσης ενεργειών χρήστη στον ιστότοπο. Σε αυτό το άρθρο θα δούμε πώς να χρησιμοποιήσετε το curl, τι είναι και γιατί χρειάζεται αυτό το πρόγραμμα.

Στην πραγματικότητα, το curl είναι κάτι περισσότερο από ένα απλό βοηθητικό πρόγραμμα γραμμής εντολών για Linux ή Windows. Αυτό είναι ένα σύνολο βιβλιοθηκών που υλοποιούν τις βασικές δυνατότητες εργασίας με σελίδες URL και μεταφοράς αρχείων. Η βιβλιοθήκη υποστηρίζει εργασία με πρωτόκολλα: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, καθώς και POP3, IMAP και SMTP. Είναι εξαιρετικό για την προσομοίωση ενεργειών χρήστη σε σελίδες και άλλες λειτουργίες με διευθύνσεις URL.

Η υποστήριξη για τη βιβλιοθήκη curl έχει προστεθεί σε πολλές διαφορετικές γλώσσες προγραμματισμού και πλατφόρμες. Το βοηθητικό πρόγραμμα curl είναι ένα ανεξάρτητο περιτύλιγμα για αυτήν τη βιβλιοθήκη. Σε αυτό το βοηθητικό πρόγραμμα θα επικεντρωθούμε σε αυτό το άρθρο.

εντολή μπούκλας

Πριν προχωρήσουμε σε μια περιγραφή του τρόπου χρήσης της εντολής curl linux, ας δούμε το ίδιο το βοηθητικό πρόγραμμα και τις κύριες επιλογές του που θα χρειαστούμε. Η σύνταξη του βοηθητικού προγράμματος είναι πολύ απλή:

Σύνδεσμος επιλογών για μπούκλες $

Τώρα ας δούμε τις κύριες επιλογές:

  • -# - εμφάνιση μιας απλής γραμμής προόδου κατά τη φόρτωση.
  • -0 - χρησιμοποιήστε το πρωτόκολλο http 1.0.
  • -1 - χρησιμοποιήστε το πρωτόκολλο κρυπτογράφησης tlsv1.
  • -2 - χρήση sslv2.
  • -3 - χρήση sslv3.
  • -4 - χρήση ipv4.
  • -6 - χρήση ipv6.
  • -ΕΝΑ- υποδείξτε το USER_AGENT σας.
  • -σι- αποθήκευση cookie σε ένα αρχείο.
  • -ντο- αποστολή Cookie στον διακομιστή από ένα αρχείο.
  • -ΝΤΟ- συνεχίστε τη λήψη του αρχείου από το σημείο διακοπής ή την καθορισμένη μετατόπιση.
  • - μέγιστος χρόνος αναμονής για απάντηση από τον διακομιστή.
  • -ρε- αποστολή δεδομένων χρησιμοποιώντας τη μέθοδο POST.
  • -ΡΕ- αποθήκευση κεφαλίδων που επιστρέφονται από τον διακομιστή σε ένα αρχείο.
  • -μι- ορίστε το πεδίο Referer-uri, υποδεικνύοντας από ποιον ιστότοπο προήλθε ο χρήστης.
  • -ΜΙ- χρήση εξωτερικού πιστοποιητικού SSL.
  • -φά- Μην εμφανίζετε μηνύματα σφάλματος.
  • -ΦΑ- αποστολή δεδομένων με τη μορφή φόρμας.
  • -ΣΟΛ- εάν αυτή η επιλογή είναι ενεργοποιημένη, τότε όλα τα δεδομένα που καθορίζονται στην επιλογή -d θα μεταδοθούν χρησιμοποιώντας τη μέθοδο GET.
  • - μεταφορά κεφαλίδων στον διακομιστή.
  • -ΕΓΩ- λάβετε μόνο την κεφαλίδα HTTP και αγνοήστε ολόκληρο το περιεχόμενο της σελίδας.
  • -j- ανάγνωση και αποστολή cookies από ένα αρχείο.
  • -Τζ- αφαιρέστε την κεφαλίδα από το αίτημα.
  • -ΜΕΓΑΛΟ- αποδοχή και επεξεργασία ανακατευθύνσεων.
  • -μικρό- μέγιστος αριθμός ανακατευθύνσεων χρησιμοποιώντας την τοποθεσία.
  • -ο- εξαγωγή περιεχομένου σελίδας σε αρχείο.
  • - αποθήκευση περιεχομένου σε ένα αρχείο με το όνομα της σελίδας ή του αρχείου στο διακομιστή.
  • - χρήση διακομιστή μεσολάβησης.
  • --πρωτ- υποδείξτε το πρωτόκολλο που θα χρησιμοποιηθεί.
  • - αποθήκευση του χρόνου τελευταίας τροποποίησης ενός απομακρυσμένου αρχείου.
  • -μικρό- εμφάνιση ελάχιστων πληροφοριών σχετικά με σφάλματα.
  • -ΜΙΚΡΟ- Εμφάνιση μηνυμάτων σφάλματος.
  • - ανεβάστε το αρχείο στον διακομιστή.
  • -v- το πιο λεπτομερές αποτέλεσμα.
  • - ελάχιστη ταχύτητα λήψης.
  • - μέγιστη ταχύτητα λήψης
  • -z- λήψη του αρχείου μόνο εάν τροποποιήθηκε αργότερα από την καθορισμένη ώρα.
  • -V- εμφάνιση της έκδοσης.

Αυτό δεν είναι σε καμία περίπτωση όλες οι επιλογές για το curl linux, αλλά παραθέτει τα βασικά που θα χρειαστεί να χρησιμοποιήσετε.

Πώς να χρησιμοποιήσετε το curl;

Καλύψαμε τα πάντα σχετικά με τη θεωρία της εργασίας με το βοηθητικό πρόγραμμα curl, τώρα ήρθε η ώρα να προχωρήσουμε στην πρακτική και να δούμε παραδείγματα της εντολής curl.

Η πιο συνηθισμένη εργασία είναι αυτή. Η λήψη του αρχείου είναι πολύ απλή. Για να το κάνετε αυτό, απλώς περάστε το όνομα αρχείου ή τη σελίδα html στο βοηθητικό πρόγραμμα στις παραμέτρους:

μπούκλα https://raw.githubusercontent.com/curl/curl/master/README.md

Αλλά εδώ σας περιμένει μια έκπληξη: ολόκληρο το περιεχόμενο του αρχείου θα σταλεί στην τυπική έξοδο. Για να το γράψετε σε οποιοδήποτε αρχείο χρησιμοποιήστε:

curl -o readme.txt https://raw.githubusercontent.com/curl/curl/master/README.md

Και αν θέλετε το αρχείο που προκύπτει να έχει το ίδιο όνομα με το αρχείο στον διακομιστή, χρησιμοποιήστε την επιλογή -O:

curl -O https://raw.githubusercontent.com/curl/curl/master/README.md

curl -# -C - -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz

Εάν είναι απαραίτητο, μπορείτε να κάνετε λήψη πολλών αρχείων με μία εντολή:

curl -O https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README

Ένα άλλο πράγμα που μπορεί να είναι χρήσιμο για έναν διαχειριστή είναι η λήψη ενός αρχείου μόνο εάν έχει τροποποιηθεί:

curl -z 21-Δεκ-17 https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README

Όριο ταχύτητας

Μπορείτε να περιορίσετε την ταχύτητα λήψης στο απαιτούμενο όριο, ώστε να μην υπερφορτώνετε το δίκτυο χρησιμοποιώντας την επιλογή -Y:

curl --limit-rate 50K -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz

Εδώ πρέπει να καθορίσετε τον αριθμό των kilobyte ανά δευτερόλεπτο που μπορούν να ληφθούν. Μπορείτε επίσης να τερματίσετε τη σύνδεση εάν η ταχύτητα δεν είναι αρκετή, χρησιμοποιήστε την επιλογή -Y για να το κάνετε αυτό:

curl -Y 100 -O https://raw.githubusercontent.com/curl/curl/master/README.md

Μεταφορά αρχείων

curl -T login.txt ftp://speedtest.tele2.net/upload/

Ή ας ελέγξουμε ότι το αρχείο αποστέλλεται μέσω HTTP· υπάρχει μια ειδική υπηρεσία για αυτό:

curl -T ~/login.txt http://posttestserver.com/post.php

Στην απάντηση, το βοηθητικό πρόγραμμα θα σας πει πού μπορείτε να βρείτε το ληφθέν αρχείο.

Αποστολή δεδομένων POST

Μπορείτε να στείλετε όχι μόνο αρχεία, αλλά και οποιαδήποτε δεδομένα χρησιμοποιώντας τη μέθοδο POST. Επιτρέψτε μου να σας υπενθυμίσω ότι αυτή η μέθοδος χρησιμοποιείται για την αποστολή δεδομένων διαφόρων μορφών. Για να στείλετε ένα τέτοιο αίτημα, χρησιμοποιήστε την επιλογή -d. Για τη δοκιμή θα χρησιμοποιήσουμε την ίδια υπηρεσία:

curl -d "field1=val&fileld2=val1"http://posttestserver.com/post.php

Εάν δεν είστε ικανοποιημένοι με αυτήν την επιλογή υποβολής, μπορείτε να προσποιηθείτε ότι υποβάλατε τη φόρμα. Υπάρχει μια επιλογή για αυτό -F:

curl -F "password=@pass;type=text/plain" http://posttestserver.com/post.php

Εδώ περνάμε το πεδίο κωδικού πρόσβασης με τη φόρμα ως απλό κείμενο, με τον ίδιο τρόπο μπορείτε να περάσετε πολλές παραμέτρους.

Αποστολή και λήψη cookies

Τα cookies χρησιμοποιούνται από ιστότοπους για την αποθήκευση ορισμένων πληροφοριών από την πλευρά του χρήστη. Αυτό μπορεί να είναι απαραίτητο, για παράδειγμα, για έλεγχο ταυτότητας. Μπορείτε να στείλετε και να λάβετε Cookies χρησιμοποιώντας το curl. Για να αποθηκεύσετε τα Cookies που λάβατε σε ένα αρχείο, χρησιμοποιήστε την επιλογή -c:

curl -c cookie.txt http://posttestserver.com/post.php

Στη συνέχεια, μπορείτε να στείλετε πίσω το cookie curl:

curl -b cookie.txt http://posttestserver.com/post.php

Μετάδοση και ανάλυση κεφαλίδας

Δεν χρειαζόμαστε πάντα απαραίτητα το περιεχόμενο της σελίδας. Μερικές φορές μόνο οι τίτλοι μπορεί να είναι ενδιαφέροντες. Για να εμφανιστούν μόνο αυτά υπάρχει η επιλογή -I:

μπούκλα -I https://site

Και η επιλογή -H σάς επιτρέπει να στείλετε πολλά ή περισσότερα στον διακομιστή, για παράδειγμα, μπορείτε να περάσετε την κεφαλίδα If-Modified-Since έτσι ώστε η σελίδα να επιστραφεί μόνο εάν έχει τροποποιηθεί:

έλεγχος ταυτότητας μπούκλας

Εάν ο διακομιστής απαιτεί έναν από τους συνήθεις τύπους ελέγχου ταυτότητας, όπως HTTP Basic ή FTP, τότε το curl μπορεί να χειριστεί αυτή την εργασία πολύ εύκολα. Για να καθορίσετε λεπτομέρειες ελέγχου ταυτότητας, απλώς καθορίστε τις διαχωρισμένες με άνω και κάτω τελεία στην επιλογή -u:

curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt

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

Χρήση διακομιστή μεσολάβησης

Εάν χρειάζεται να χρησιμοποιήσετε έναν διακομιστή μεσολάβησης για τη λήψη αρχείων, τότε αυτό είναι επίσης πολύ απλό. Αρκεί να καθορίσετε τη διεύθυνση διακομιστή μεσολάβησης στην επιλογή -x:

curl -x proxysever.test.com:3128 http://google.co.in

συμπεράσματα

Σε αυτό το άρθρο, εξετάσαμε πώς να χρησιμοποιήσετε το curl, γιατί χρειάζεται αυτό το βοηθητικό πρόγραμμα και τις κύριες δυνατότητές του. Παρά την ομοιότητά τους, είναι πολύ διαφορετικά. Η εντολή curl linux έχει σχεδιαστεί περισσότερο για την ανάλυση και την προσομοίωση διαφόρων ενεργειών στον διακομιστή, ενώ το wget είναι πιο κατάλληλο για λήψη αρχείων και ανίχνευση τοποθεσιών.

Αυτό το άρθρο θα μιλήσει για ένα τόσο ισχυρό εργαλείο όπως το cURL, καθώς και για τη βιβλιοθήκη για την PHP που παρέχει πρόσβαση σε αυτό το εργαλείο - libcurl. Προς τι όλα αυτά; Για να επικοινωνήσετε με το διακομιστή χρησιμοποιώντας πρωτόκολλα μεταφοράς δεδομένων, για παράδειγμα, http ή ftp. Τα υπόλοιπα πρωτόκολλα δεν μας ενδιαφέρουν ιδιαίτερα· αν κάποιος θέλει να εμβαθύνει σε αυτό το θέμα, θα πρέπει να βρει αγγλόφωνους πόρους και αυτό το άρθρο θα περιέχει τα βασικά και παραδείγματα χρήσης.

Τι ακριβώς είναι το cURL και το libcurl; Γενικά σημεία

Έτσι, η βιβλιοθήκη libcurl μας παρέχει τη δυνατότητα να μεταδίδουμε δεδομένα στον διακομιστή και να λαμβάνουμε απαντήσεις από αυτόν. Τι μας δίνει αυτό; Η δυνατότητα μίμησης της συμπεριφοράς των χρηστών ή ! Μπορείτε να λαμβάνετε τα περιεχόμενα των σελίδων για επακόλουθη ανάλυση, μπορείτε να λαμβάνετε κεφαλίδες απόκρισης υπηρεσιών και να συνδεθείτε μέσω προγραμματισμού σε ιστότοπους, να δημιουργήσετε σενάρια για δημοσίευση μηνυμάτων (για παράδειγμα, στο Twitter ή σε φόρουμ) ή πληροφορίες. Όλα περιορίζονται μόνο από τη φαντασία σας!

Εγκατάσταση του cURL στο Denwer (Denver). Πώς να ξεκινήσετε να χρησιμοποιείτε το libcurl;

Το πρώτο πράγμα που πρέπει να κάνουμε είναι να εγκαταστήσουμε τη βιβλιοθήκη. Στον τοπικό μου υπολογιστή χρησιμοποιώ την έκδοση Denwer, όπως η συντριπτική πλειοψηφία των αρχαρίων webmasters, για τους οποίους προορίζεται το άρθρο. Οι έμπειροι χρήστες που εγκαθιστούν ανεξάρτητα τον συνδυασμό php+apache+mysql θα μπορούν να εγκαταστήσουν το cURL, δεν εναπόκειται σε εμένα να τους εξηγήσω πώς γίνεται αυτό;) Και εμείς, οι αρχάριοι, χρησιμοποιούμε έτοιμες λύσεις για να το κάνουμε πιο εύκολο. Επομένως, εγκαταστήστε το libcurl ως εξής:

  • Κατεβάστε το έτοιμο πακέτο επέκτασης «PHP5: πρόσθετες ενότητες».
  • Αντίστοιχα, το εγκαθιστούμε. Τίποτα περίπλοκο, συμφωνώ :)
  • Ανοίξτε το αρχείο στο Σημειωματάριο (Συνιστώ πάντα το Notepad++): X:/webservers/usr/local/php5/php.ini //όπου X είναι η μονάδα δίσκου όπου είναι εγκατεστημένος ο διακομιστής web

    και αφαιρέστε το ερωτηματικό στην αρχή των όρων:

    ;extension=php_curl.dll

  • Κάνουμε επανεκκίνηση του διακομιστή του Ντένβερ.

Ετοιμος. Για να ελέγξετε τη λειτουργικότητα της βιβλιοθήκης, μπορείτε να καλέσετε τη συνάρτηση phpinfo() και να βρείτε τη γραμμή εκεί: η υποστήριξη cURL ενεργοποιημένη. Συγχαρητήρια για την πρώτη σου νίκη.

Περιγραφή του cURL και τα πρώτα βήματα

Για να ξεκινήσετε να εργάζεστε με το εργαλείο, πρέπει να αρχικοποιηθεί. Αυτό γίνεται ως εξής:

$ch = curl_init();

Χρησιμοποιήσαμε τη συνάρτηση προετοιμασίας συνεδρίας cURL. Σε αυτήν την περίπτωση, μπορείτε να ορίσετε τη διεύθυνση URL αμέσως, ως εξής:

$ch = curl_init("https://site");

Και μπορείτε να το κάνετε αργότερα, στις επιλογές. Η σειρά με την οποία εγκαθίστανται οι επιλογές δεν έχει σημασία. Αυτό γίνεται με μια άλλη λειτουργία:

Curl_setopt (κ πόρων, επιλογή συμβολοσειράς, μικτή τιμή)

Έχουμε ήδη δημιουργήσει την πρώτη παράμετρο αυτής της συνάρτησης, δηλαδή τον πόρο ch, ακριβώς από πάνω, αλλά υπάρχουν πολλές παραμέτρους επιλογής και τιμής. Νομίζω ότι δεν πρέπει να τα κάνετε copy-paste όλα εδώ, αλλά απλώς δώστε έναν σύνδεσμο για μια λεπτομερή περιγραφή της λειτουργίας, ελπίζω να μην προσβληθεί κανείς: curl_setopt.

Θα δώσω ένα παράδειγμα ρύθμισης επιλογών χρησιμοποιώντας μια διεύθυνση URL ως παράδειγμα:

$url = "https://site"; curl_setopt($ch, CURLOPT_URL,$url);

Μερικά ακόμη παραδείγματα επιλογών ρύθμισης: ας λάβουμε την κεφαλίδα απόκρισης διακομιστή, χωρίς να λάβουμε την ίδια τη σελίδα:

Curl_setopt($ch, CURLOPT_HEADER, 1); // διαβάστε την κεφαλίδα curl_setopt($ch, CURLOPT_NOBODY, 1); // διαβάστε ΜΟΝΟ την κεφαλίδα χωρίς το σώμα

Έτσι, αρχικοποιήσαμε τη συνεδρία, ορίσαμε τις παραμέτρους που χρειαζόμαστε, τώρα εκτελούμε το αίτημα που προκύπτει, κλείνουμε τη συνεδρία και εμφανίζουμε το αποτέλεσμα:

$result = curl_exec($ch); curl_close($ch); echo $result;

Ως αποτέλεσμα, λαμβάνουμε το πρώτο μας πλήρως λειτουργικό παράδειγμα χρήσης της βιβλιοθήκης libcurl:

$ch = curl_init(); $url = "https://site"; curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HEADER, 1); // διαβάστε την κεφαλίδα curl_setopt($ch, CURLOPT_NOBODY, 1); // διαβάστε ΜΟΝΟ την κεφαλίδα χωρίς το σώμα $result = curl_exec($ch); curl_close($ch); echo $result;

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

HTTP/1.1 200 OK Διακομιστής: nginx/1.2..php 1

Υπέροχο! Λάβαμε την κεφαλίδα απόκρισης από τον διακομιστή και δοκιμάσαμε τη βιβλιοθήκη σε δράση. Πόσο χρήσιμο είναι αυτό για εμάς; Επειδή τώρα μπορείτε να φανταστείτε κατά προσέγγιση την ακολουθία των ενεργειών όταν εργάζεστε με το cURL:

  • Αρχικοποίηση συνεδρίας (curl_init)
  • Ορίστε τις επιλογές που χρειαζόμαστε (curl_setopt)
  • Εκτελέστε το ληφθέν αίτημα (curl_exec)
  • Λήξη συνεδρίας (curl_close)

Δομή κεφαλίδας αιτήματος HTTP

Για παράδειγμα, γύρισα στη σελίδα ya.ru και εξέτασα το αίτημα του προγράμματος περιήγησης που δημιουργήθηκε και την απάντηση που ελήφθη από τον διακομιστή. Εδώ είναι:
Αίτηση
GET / HTTP/1.1 - Προσπαθούμε να πάρουμε τη σελίδα στο /, δηλαδή στην κύρια σελίδα που βρίσκεται στη ρίζα του φακέλου. Χρησιμοποιούμε την έκδοση πρωτοκόλλου 1.1.
User-Agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Έκδοση/12.14— Συστηνόμαστε στον διακομιστή, είμαστε το πρόγραμμα περιήγησης Opera.
Κεντρικός υπολογιστής: ya.ru — Όνομα τομέα του ζητούμενου πόρου.
Αποδοχή: text/html, application/xml;q=0,9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1— Κατάλογος αποδεκτών μορφών πόρων.
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8— Λίστα υποστηριζόμενων γλωσσών.
Αποδοχή-Κωδικοποίηση: gzip, deflate— Υποστηριζόμενες μέθοδοι κωδικοποίησης.
Cookie: yandexuid=ХХХХХ - Cookies, εάν είναι απαραίτητο.
Σύνδεση: Keep-Alive - Μην διακόψετε τη σύνδεση και μείνετε σε επαφή.
Απάντηση
HTTP/1.1 200 Ok - Λαμβάνουμε μια απάντηση με κωδικό 200, που σημαίνει ότι όλα είναι εντάξει.
Διακομιστής: nginx - Ο διακομιστής παρουσιάστηκε - αυτός είναι ο nginx.
Ημερομηνία: Κυριακή, 10 Μαρτίου 2013 14:10:50 GMT— Τρέχουσα ημερομηνία και ώρα στον διακομιστή.
Τύπος περιεχομένου: text/html; σύνολο χαρακτήρων=UTF-8— Τύπος περιεχομένου και κωδικοποίηση.
Σύνδεση: κλείσιμο - Ο διακομιστής δεν θέλει να διατηρήσει μόνιμη σύνδεση μαζί μας, επομένως τον κλείνει αμέσως. Μια νέα σύνδεση θα δημιουργηθεί για το επόμενο αίτημα.
Cache-Control: no-cache,no-store,max-age=0,must-revalidate— Διαχείριση κρυφής μνήμης. Σε αυτή την περίπτωση είναι απενεργοποιημένο.
Λήξη: Κυριακή, 10 Μαρτίου 2013 14:10:50 GMT— Ημερομηνία αναμενόμενης λήξης της συνεδρίας. Στην περίπτωσή μας συμπίπτει με τον χρόνο ανοίγματος, αφού ο διακομιστής το έκλεισε αμέσως, αμέσως μετά την επεξεργασία.
Τελευταία Τροποποίηση: Κυρ, 10 Μαρτίου 2013 14:10:50 GMT— Ώρα τελευταίας τροποποίησης.
Content-Encoding: gzip - Μέθοδος κωδικοποίησης πληροφοριών.
Μια πλήρης λίστα με όλες τις παραμέτρους που μπορούν να βρεθούν στην κεφαλίδα αιτήματος HTTP μπορεί να βρεθεί στη Wikipedia.
Τώρα έχετε μια πρόχειρη ιδέα για το πώς το πρόγραμμα περιήγησής σας και ο διακομιστής Ιστού επικοινωνούν μεταξύ τους. Αυτό είναι πολύ χρήσιμο να το γνωρίζουμε και να το κατανοήσουμε, γιατί θα προσπαθήσουμε να μιμηθούν τις ενέργειες του προγράμματος περιήγησης χρησιμοποιώντας τη βιβλιοθήκη libcurl. Προχώρα.

Παράδειγμα εργασίας με τη βιβλιοθήκη

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

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

Συνάρτηση get_web_page($url) ( $uagent = "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Έκδοση/12.14"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETRANS); // επιστρέφει την ιστοσελίδα curl_setopt($ch, CURLOPT_HEADER, 0); // δεν επιστρέφει κεφαλίδες curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // ακολουθεί τις ανακατευθύνσεις curl_setopt($ch, CURLOPT_ENCODING, ""); // διεργασίες όλες οι κωδικοποιήσεις curl_setopt($ch, CURLOPT_USERAGENT, $uagent); // useragent curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // timeout σύνδεσης curl_setopt($ch, CURLOPT_TIMEOUT, 120); //setopt_TIMEOUT, 120); , 10); // διακοπή μετά την 10η ανακατεύθυνση $content = curl_exec($ch); $err = curl_errno($ch); $errmsg = curl_error($ch); $header = curl_getinfo($ch); curl_close( $ ch); $header["errno"] = $err; $header["errmsg"] = $errmsg; $header["content"] = $content; επιστροφή $header; )

Παράμετροι εισαγωγής:
url — διεύθυνση σελίδας ή ιστότοπου.
Τιμές παραμέτρων εξόδου (πίνακας με τρία στοιχεία):
header['errno'] - εάν κάτι πήγε στραβά, θα υπάρχει κωδικός σφάλματος εδώ.
header['errmsg'] – το κείμενο σφάλματος θα εμφανιστεί εδώ.
header['content'] - η πραγματική σελίδα\αρχείο\εικόνα, κ.λπ.

Χρησιμοποιούμε τη συνάρτηση, για παράδειγμα, ως εξής:

$result = get_web_page ("https://ya.ru"); if (($result["errno"] != 0)||($result["http_code"] != 200)) (echo $result["errmsg"]; ) else ($page = $result["content "]; echo $page;)

Όλα θα πρέπει να πάνε χωρίς σφάλματα και θα λάβετε τον κώδικα σελίδας στη μεταβλητή $page. Αν προσπαθήσουμε να λάβουμε την ανύπαρκτη σελίδα yaaaaaaaaaaaa.ru, θα λάβουμε το σφάλμα:

Δεν ήταν δυνατή η επίλυση του κεντρικού υπολογιστή: yaaaaaaaaaaaa.ru; Ο κεντρικός υπολογιστής δεν βρέθηκε

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

Η JavaScript είναι αποκλεισμένη στο πρόγραμμα περιήγησής σας. Ενεργοποιήστε την JavaScript για να λειτουργήσει ο ιστότοπος!

Μπούκλα

Η PHP υποστηρίζει το libcurl, μια βιβλιοθήκη που δημιουργήθηκε από τον Daniel Stenberg και σας επιτρέπει να συνδεθείτε με διαφορετικούς τύπους διακομιστών και πρωτοκόλλων.
Το libcurl υποστηρίζει επί του παρόντος πρωτόκολλα http, https, ftp, gopher, telnet, dict, αρχείου και ldap.
Το libcurl υποστηρίζει επίσης πιστοποιητικά HTTPS, HTTP POST, HTTP PUT, μεταφόρτωση FTP (αυτό μπορεί επίσης να γίνει με την επέκταση PHP ftp), μεταφόρτωση βάσει φόρμας HTTP, διακομιστή μεσολάβησης, cookie και έλεγχο ταυτότητας χρήστη+κωδικού πρόσβασης.

Αυτές οι λειτουργίες εισήχθησαν στην PHP 4.0.2.

curl_init

curl_init - αρχικοποιεί μια περίοδο λειτουργίας CURL.

Περιγραφή

πόρος curl_init()

Λειτουργία curl_init()αρχικοποιεί μια νέα περίοδο λειτουργίας και επιστρέφει μια λαβή CURL για χρήση στις συναρτήσεις και. Εάν η προαιρετική παράμετρος urlπαρέχεται, τότε η επιλογή CURLOPT_URL θα λάβει την τιμή αυτής της παραμέτρου. Μπορείτε να το εγκαταστήσετε χειροκίνητα χρησιμοποιώντας το .

curl_setopt

curl_setopt - ορίζει επιλογές για μεταφορά/μεταφορά CURL.

Περιγραφή

bool curl_setopt(πόρων ch, επιλογή συμβολοσειράς, μικτή τιμή)

Λειτουργία curl_setopt()ορίζει επιλογές για την περίοδο λειτουργίας CURL που προσδιορίζεται από την παράμετρο κεφ. Παράμετρος επιλογήείναι η επιλογή που θέλετε να ορίσετε και αξίααυτή είναι η τιμή της επιλογής επιλογή .

Παράμετρος αξίαπρέπει να είναι μεγάλη για τις ακόλουθες επιλογές (καθορίζονται ανά παράμετρο επιλογή):

  • CURLOPT_INFILESIZE: Εάν ανεβάζετε ένα αρχείο σε μια απομακρυσμένη τοποθεσία, αυτή η επιλογή θα πρέπει να χρησιμοποιηθεί για να πείτε στην PHP ποιο θα είναι το αναμενόμενο μέγεθος αρχείου.
  • CURLOPT_VERBOSE: Ορίστε αυτήν την επιλογή σε μια μη μηδενική τιμή εάν θέλετε το CURL να αναφέρει όλες τις ενέργειες.
  • CURLOPT_HEADER: Ορίστε αυτήν την επιλογή σε μια μη μηδενική τιμή εάν θέλετε η κεφαλίδα να συμπεριληφθεί στην έξοδο.
  • CURLOPT_NOPROGRESS: Ορίστε αυτήν την επιλογή σε μια μη μηδενική τιμή εάν δεν θέλετε η PHP να εμφανίζει μια ένδειξη προόδου μεταφοράς CURL. (Η PHP ορίζει αυτόματα αυτήν την επιλογή σε μια μη μηδενική τιμή· χρειάζεται μόνο να την αλλάξετε κατά τον εντοπισμό σφαλμάτων.)
  • CURLOPT_NOBODY: Ορίστε αυτήν την επιλογή σε μια μη μηδενική τιμή εάν δεν θέλετε το σώμα να συμπεριληφθεί στην έξοδο.
  • CURLOPT_FAILONERROR: Ορίστε αυτήν την επιλογή σε μια μη μηδενική τιμή εάν θέλετε η PHP να βγαίνει αθόρυβα εάν ο επιστρεφόμενος κωδικός HTTP είναι μεγαλύτερος από 300. Από προεπιλογή, η σελίδα επιστρέφεται κανονικά με τον κώδικα να αγνοείται.
  • CURLOPT_UPLOAD: Ορίστε αυτήν την επιλογή σε μια μη μηδενική τιμή εάν θέλετε η PHP να προετοιμάσει το αρχείο για μεταφόρτωση.
  • CURLOPT_POST: Ορίστε αυτήν την επιλογή σε μια μη μηδενική τιμή εάν θέλετε η PHP να εκτελεί κανονικό HTTP POST. Αυτό το POST είναι στην κανονική μορφή εφαρμογής/x-www-form-urlencoded, που χρησιμοποιείται πιο συχνά από φόρμες HTML.
  • CURLOPT_FTPLISTONLY: Ορίστε αυτήν την επιλογή σε μια μη μηδενική τιμή και η PHP θα εμφανίσει ονόματα καταλόγου FTP.
  • CURLOPT_FTPAPPEND: Ορίστε αυτήν την επιλογή σε μια μη μηδενική τιμή και η PHP θα προσαρτηθεί στο απομακρυσμένο αρχείο αντί να το αντικαταστήσει.
  • CURLOPT_NETRC: Ορίστε αυτήν την επιλογή σε μια μη μηδενική τιμή και η PHP θα σαρώσει το αρχείο ~./netrc για να βρει το όνομα χρήστη και τον κωδικό πρόσβασής σας για τον απομακρυσμένο ιστότοπο στον οποίο συνδέεστε.
  • CURLOPT_FOLLOWLOCATION: Ορίστε αυτήν την επιλογή σε μια μη μηδενική τιμή για να ακολουθεί οποιαδήποτε κεφαλίδα "Τοποθεσία:" που στέλνει ο διακομιστής ως μέρος μιας κεφαλίδας HTTP (σημειώστε ότι πρόκειται για αναδρομή, η PHP θα ακολουθεί όλες τις "Τοποθεσία: " -κεφαλίδες" που αποστέλλονται. )
  • CURLOPT_PUT: Ορίστε αυτήν την επιλογή σε μια μη μηδενική τιμή σε HTTP PUT το αρχείο. Το αρχείο για το PUT πρέπει να οριστεί χρησιμοποιώντας CURLOPT_INFILE και CURLOPT_INFILESIZE.
  • CURLOPT_MUTE: Ορίστε αυτήν την επιλογή σε μια μη μηδενική τιμή και η PHP θα λειτουργεί κρυφά σε σχέση με τις συναρτήσεις CURL.
  • CURLOPT_TIMEOUT: Μεταβιβάστε ένα long ως παράμετρο που περιέχει τον μέγιστο χρόνο σε δευτερόλεπτα που επιτρέπετε την εκτέλεση των συναρτήσεων CURL.
  • CURLOPT_CONNECTTIMEOUT: Περάστε μια παράμετρο που περιέχει το μέγιστο χρόνο, σε δευτερόλεπτα, που αφήνετε να περιμένετε όταν επιχειρείτε να συνδεθείτε. Χρησιμοποιήστε το 0 για να περιμένετε για πάντα.
  • CURLOPT_LOW_SPEED_LIMIT: Περάστε μια παράμετρο που περιέχει την ταχύτητα μεταφοράς, σε byte ανά δευτερόλεπτο, κάτω από την οποία η μεταφορά πρέπει να εκτελεστεί κατά την εκτέλεση CURLOPT_LOW_SPEED_TIME, σε δευτερόλεπτα, ώστε η PHP να τη θεωρήσει πολύ αργή και να τη ματαιώσει.
  • CURLOPT_LOW_SPEED_TIME: Περάστε μια παράμετρο που περιέχει το χρόνο σε δευτερόλεπτα κάτω από τον οποίο πρέπει να εκτελεστεί η μεταφορά κατά την εκτέλεση CURLOPT_LOW_SPEED_LIMIT ώστε η PHP να τη θεωρήσει πολύ αργή και να τη ματαιώσει.
  • CURLOPT_RESUME_FROM: Περνάτε ως παράμετρο που περιέχει τη μετατόπιση byte από την οποία πρέπει να ξεκινήσει η μεταφορά.
  • CURLOPT_SSLVERSION: Μεταβιβάστε μια παράμετρο που περιέχει την έκδοση SSL προς χρήση (2 ή 3). Από προεπιλογή, η PHP προσπαθεί να το προσδιορίσει από μόνη της, αν και σε ορισμένες περιπτώσεις απαιτείται να το ρυθμίσετε με μη αυτόματο τρόπο.
  • CURLOPT_SSL_VERIFYHOST: Περάστε παρατεταμένα εάν το CURL πρέπει να ελέγξει το κοινό όνομα του ομότιμου πιστοποιητικού σε μια χειραψία SSL. Η τιμή 1 υποδηλώνει ότι πρέπει να ελέγξουμε την ύπαρξη ενός κοινού /κοινού ονόματος, η τιμή 2 υποδηλώνει ότι πρέπει να διασφαλίσουμε ότι ταιριάζει με το παρεχόμενο όνομα κεντρικού υπολογιστή.
  • CURLOPT_TIMECONDITION: Περάστε ένα long ως παράμετρος που καθορίζει τον τρόπο με τον οποίο αντιμετωπίζεται το CURLOPT_TIMEVALUE. Μπορείτε να ορίσετε αυτήν την παράμετρο σε TIMECOND_IFMODSINCE ή TIMECOND_ISUNMODSINCE. Αυτό λειτουργεί μόνο για HTTP.
  • CURLOPT_TIMEVALUE: Περάστε μια παράμετρο ως παράμετρο, που είναι ο χρόνος σε δευτερόλεπτα από την 1η Ιανουαρίου 1970. Αυτή η ώρα χρησιμοποιείται όπως καθορίζεται από την επιλογή CURLOPT_TIMEVALUE ή θα χρησιμοποιηθεί το προεπιλεγμένο TIMECOND_IFMODSINCE.
  • CURLOPT_RETURNTRANSFER: Περάστε μια μη μηδενική τιμή εάν θέλετε το CURL να επιστρέφει απευθείας τις πληροφορίες που έλαβε αντί να τις εκτυπώσει απευθείας.

Παράμετρος αξίαπρέπει να είναι μια συμβολοσειρά για τις ακόλουθες τιμές παραμέτρων επιλογή :

Οι ακόλουθες επιλογές αναμένουν έναν περιγραφέα αρχείου, ο οποίος λαμβάνεται χρησιμοποιώντας τη συνάρτηση fopen() :

  • CURLOPT_FILE: Το αρχείο όπου πρέπει να τοποθετηθεί η έξοδος της μεταφοράς σας, από προεπιλογή είναι STDOUT.
  • CURLOPT_INFILE: Το αρχείο από το οποίο προέρχεται η είσοδος μεταφοράς.
  • CURLOPT_WRITEHEADER: Αρχείο για την εγγραφή του τμήματος κεφαλίδας της εξόδου.
  • CURLOPT_STDERR: Αρχείο για καταγραφή σφαλμάτων, αντί για stderr.

Παράμετρος αξία long write_callback (πόρων ch, δεδομένα συμβολοσειράς)( ... return strlen($data);) επιλογή :

  • CURLOPT_WRITEFUNCTION: .
  • CURLOPT_HEADERFUNCTION: .

Παράμετρος αξίαπρέπει να είναι συνάρτηση της παρακάτω φόρμας string read_callback (πόρος ch, πόρος fd, μεγάλο μήκος)()για τις ακόλουθες τιμές παραμέτρων επιλογή :

  • CURLOPT_READFUNCTION: .

curl_exec

curl_exec - εκτελεί μια περίοδο λειτουργίας CURL.

Περιγραφή

bool curl_exec(πόρων ch)

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

curl_close

curl_close - κλείνει την περίοδο λειτουργίας CURL.

Περιγραφή

κενός curl_close(πόρων ch)

Αυτή η συνάρτηση κλείνει την περίοδο λειτουργίας CURL και απελευθερώνει όλους τους πόρους. CURL λαβή κεφδιαγράφεται επίσης.

curl_errno

curl_errno - επιστρέφει έναν ακέραιο που περιέχει τον τελευταίο αριθμό σφάλματος.

Περιγραφή

Παράδειγμα 1: Εκκίνηση μιας νέας περιόδου λειτουργίας CURL και ανάκτηση μιας ιστοσελίδας.
Παράδειγμα 2: Χρήση της λειτουργικής μονάδας CURL της PHP για λήψη του example.com
Παράδειγμα 3: Έλεγχος προσβασιμότητας URL με χρήση του CURL της PHP
Παράδειγμα 4: Διαχωρισμός της κεφαλίδας από το σώμα που λήφθηκε χρησιμοποιώντας το CURL της PHP
Παράδειγμα 5: Προσδιορισμός διεύθυνσης URL παραπομπής με χρήση του CURL της PHP
το πρόβλημα: curl_setopt($ch,FOLLOW_LOCATION,1); το σφάλμα: πρόβλημα με το open_basedir και το safe_mode η λύση: μια συνάρτηση που έχει ήδη αναπτυχθεί από κάποιον η λύση n 2: η ίδια συνάρτηση, τροποποιημένη, λειτουργεί τέλεια για μένα..= $curl_max_loops) ( $curl_loops = 0; επιστροφή FALSE; ) curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $data = curl_exec($ch); list($header, $data) = explode("\n\n", $data, 2); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($http_code == 301 || $http_code == 302) ( $matches = ; preg_match("/Location:(.*?)\n/", $header, $matches); $url = @parse_url(trim (array_pop($matches))); εάν (!$url) ( //δεν μπορούσε να επεξεργαστεί τη διεύθυνση url για ανακατεύθυνση σε $curl_loops = 0; επιστροφή $data; ) $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL) ; if (!$url["scheme"]) $url["scheme"] = $last_url["scheme"]; if (!$url["host"]) $url["host"] = $last_url[ "host"]; if (!$url["path"]) $url["path"] = $last_url["path"]; $new_url = $url["scheme"] . "://" . $ url["host"] . $url["διαδρομή"] . ($url["query"]?"?".$url["query"]:""); curl_setopt($ch, CURLOPT_URL, $new_url) ; debug("Ανακατεύθυνση σε", $new_url); return curl_redir_exec($ch); ) else ( $curl_loops=0; επιστροφή $data; ) ) ?>
Απλώς χρησιμοποιήστε αυτήν τη λειτουργία χωρίς την τοποθεσία FOLLOW_LOCATION και θα πρέπει να λειτουργεί. το πρόβλημα ήταν ότι όταν φτάσετε στη γραμμή όπου επιστρέφετε τα δεδομένα εάν το http_code ήταν διαφορετικό από το 301 oe 302, το $data έχει παρωχημένες πληροφορίες ή καμία. οπότε το $debbbb κάνει τη δουλειά.
Παράδειγμα 6: Ανάλυση ενός cookie από την κεφαλίδα χρησιμοποιώντας CURL PHP
Μερικές φορές δεν μπορείτε να χρησιμοποιήσετε CURLOPT_COOKIEJAR και CURLOPT_COOKIEFILE becoz των ρυθμίσεων php του διακομιστή (Λένε ότι μπορείτε να πάρετε αρχεία από τον διακομιστή χρησιμοποιώντας αυτές τις επιλογές). Εδώ είναι η λύση 1) Μην χρησιμοποιείτε CURLOPT_FOLLOWLOCATION 2) Χρησιμοποιήστε curl_setopt($ch, CURLOPT_HEADER, 1) 3)Πραγματοποιήστε λήψη από τα cookie κεφαλίδας ως εξής: preg_match_all("|Set-Cookie: (.*);|U", $content, $results); $cookies = implode(";", $results); 4)Ρυθμίστε τα χρησιμοποιώντας curl_setopt($ch, CURLOPT_COOKIE, $cookies);
Παράδειγμα 7: Ανάλυση ενός cookie από την κεφαλίδα χρησιμοποιώντας CURL PHP
Όπως ανέφερε νωρίτερα ο Yevgen μερικές φορές δεν μπορούμε να χρησιμοποιήσουμε CURLOPT_COOKIEJAR και CURLOPT_COOKIEFILE. Παρακάτω είναι μια συνάρτηση επιστροφής κλήσης κεφαλίδας που έγραψα τον Ιανουάριο και σας επιτρέπει να διατηρείτε cookie μεταξύ των αιτημάτων cURL. Τα cookies προστίθενται στο $ch κατά τη διάρκεια όλων των αιτημάτων, ακόμη και κατά την ανακατεύθυνση, ώστε να μπορείτε χρησιμοποιήστε το μαζί με το CURLOPT_FOLLOWLOCATION. Εδώ είναι ο κώδικας: συνάρτηση read_header($ch, $string) ( καθολική $location; #keep track of location/redirects global $cookiearr; #store cookies here global $ch; # ^παρακάμπτει την παράμετρο συνάρτησης $ch # αυτό είναι εντάξει γιατί πρέπει να # ενημερώσουμε το καθολικό $ch με # νέα cookies $length = strlen($string); if(!strncmp($string, "Location:", 9)) ( #keep track of τελευταία ανακατεύθυνση $location = trim(substr($string, 9, -1)); ) if(!strncmp($string, "Set-Cookie:", 11)) ( #get the cookie $cookiestr = trim(substr( $string, 11, -1)); $cookie = explode(";", $cookistr); $cookie = explode("=", $cookie); $cookiename = trim(array_shift($cookie)); $cookiearr [$cookiename] = trim(implode("=", $cookie)); ) $cookie = ""; if(trim($string) == "") ( #execute μόνο στο τέλος της κεφαλίδας foreach ($cookiearr ως $key=>$value) ($cookie .= "$key=$value; "; ) curl_setopt ($ ch, CURLOPT_COOKIE, $cookie); ) επιστροφή $length; ) curl_setopt($ch, CURLOPT_HEADERFUNCTION, "read_header"); Αυτός ο κώδικας προϋποθέτει ότι θα επαναχρησιμοποιήσετε το $ch χωρίς να το αρχικοποιείτε κάθε φορά (καλέστε το curl_init μόνο μία φορά, στην αρχή). Αν χρειαστεί να αρχικοποιήσετε ξανά το $ch σε οποιοδήποτε σημείο του κώδικά σας, μπορείτε να αποκτήσετε πρόσβαση στα τρέχοντα αποθηκευμένα cookies στο $cookiearr και να τα συμπεριλάβετε στο νέο $ch. Έγραψα αυτήν τη συνάρτηση πριν είχα αρκετή εμπειρία με κανονικές εκφράσεις, οπότε δεν θα βρείτε κλήσεις preg_match εδώ. Χρησιμοποιώ αυτόν τον κωδικό για αρκετό καιρό και χωρίς κανένα πρόβλημα στην πρόσβαση στο gmail, yahoo, hotmail, aol κ.λπ. περάστε από τη σύνδεση και μερικές σελίδες πριν φτάσετε σε αυτό που έψαχνα.
Παράδειγμα 8: Ρύθμιση ενός προγράμματος χειρισμού φορτίου κεφαλίδας χρησιμοποιώντας CURL PHP
Χρησιμοποιώντας το cURL, χρειάστηκε να καλέσω ένα σενάριο τρίτου μέρους που επέστρεφε δυαδικά δεδομένα ως συνημμένο για να μεταβιβάσω τα ανακτημένα δεδομένα ξανά ως συνημμένο. Το πρόβλημα ήταν ότι το σενάριο τρίτου μέρους επέστρεφε περιστασιακά σφάλματα HTTP και ήθελα να αποφύγω τη μετάδοση επισύναψης μηδενικού μήκους σε τέτοιες περιπτώσεις. Ο συνδυασμός χρήσης CURLOPT_FAILONERROR και επανάκλησης CURLOPT_HEADERFUNCTION βοήθησε στην επεξεργασία των σφαλμάτων HTTP σεναρίου τρίτου μέρους: συνάρτηση curlHeaderCallback($resURL, $strHeader) ( if (preg_match("/^HTTP/i", $strHeader($str) ); header("Content-Disposition: attachment; filename="file-name.zip""); ) return strlen($strHeader); ) $resURL = curl_init("http://site/"); curl_setopt($resURL, CURLOPT_BINARYTRANSFER, 1); curl_setopt($resURL, CURLOPT_HEADERFUNCTION, "curlHeaderCallback"); curl_setopt($resURL, CURLOPT_FAILONERROR, 1); curl_exec($resURL); $intReturnCode = curl_getinfo($resURL, CURLINFO_HTTP_CODE); curl_close($resURL); if ($intReturnCode != 200) (εκτυπώστε "Σφάλμα με τον κωδικό: " . $intReturnCode; )
Παράδειγμα 9. Αποθήκευση σελίδας σε αρχείο και υπολογισμός του ρυθμού μεταφοράς χρησιμοποιώντας CURL PHP
WritePageToFile("http://es.php.net", "es.php.net.txt"); συνάρτηση WritePageToFile($sHTMLpage, $sTxtfile) ( $sh = curl_init($sHTMLpage); $hFile = FOpen($sTxtfile, "w"); curl_setopt($sh, CURLOPT_FILE, $hFile); curl_setopt($sh, CURLOPT_ 0); curl_exec ($sh); $sAverageSpeedDownload = curl_getInfo($sh, CURLINFO_SPEED_DOWNLOAD); $sAverageSpeedUpload = curl_getInfo($sh, CURLINFO_SPEED_UPLOAD); ηχώ "
"; echo "Μέση ταχύτητα λήψης == " . $sAverageSpeedDownload. " 
"; echo "Μέση ταχύτητα μεταφόρτωσης == " . $sAverageSpeedUpload."
"; ηχώ "
"; $aCURLinfo = curl_getInfo($sh); print_r($aCURLinfo); echo "
"; curl_close($sh); FClose ($hFile); echo "( Δείτε το αρχείο "".$sTxtfile."" στην ίδια διαδρομή της φιλοξενίας." " όπου αυτό το σενάριο PHP).
"; }
Παράδειγμα 9. Λήψη σελίδας μέσω σύνδεσης SSL (https)
$ch=curl_init("https://site"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Απενεργοποιήστε το σφάλμα "Πρόβλημα πιστοποιητικού SSL, βεβαιωθείτε ότι το πιστοποιητικό CA είναι εντάξει" curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Απενεργοποιήστε το σφάλμα "SSL: όνομα θέματος πιστοποιητικού "hostname.ru" δεν ταιριάζει με το όνομα κεντρικού υπολογιστή προορισμού "123.123"" curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); $out=curl_exec($ch); //$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //echo "http_code=".$http_code,", err=".curl_error($ch); curl_close($ch);
Παράδειγμα 10: Χρήση περιόδων σύνδεσης και cookie σε μπούκλα
$cookie_filename=sys_get_temp_dir()+"/cookie.tmp"; $curl=curl_init("http://site"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_filename);//αποθήκευση ληφθέντων COOKIE σε ένα αρχείο curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_filename); //στείλτε στον διακομιστή τα COOKIE που ελήφθησαν από αυτόν κατά την εξουσιοδότηση $out=curl_exec($curl);
Παράδειγμα 11: Μεταφόρτωση αρχείων και πολυδιάστατος πίνακας σε Curl. CURLOPT_POSTFIELDS + CurlFile

Εάν χρειαστεί να στείλετε έναν πολυδιάστατο πίνακα και ένα αρχείο σε ένα αίτημα POST, θα αντιμετωπίσετε ένα άλυτο πρόβλημα. Εάν περάσετε έναν πολυδιάστατο πίνακα στο CURLOPT_POSTFIELDS, το δεύτερο επίπεδο θα περάσει ως συμβολοσειρά "Πίνακας". Εάν κάνετε μετατροπή χρησιμοποιώντας το http_build_query, δεν θα μπορείτε να μεταφέρετε το αρχείο.

Παρακάτω είναι μια συνάρτηση για την κωδικοποίηση ενός δισδιάστατου πίνακα με φόρτωση αρχείων για το Curl, ο οποίος θα λειτουργεί και στις δύο παλαιότερες εκδόσεις των PHP 5.3, PHP 5.4 και PHP 5.6

/** μετατρέπει έναν πολυδιάστατο πίνακα σε έναν μονοδιάστατο πίνακα χρησιμοποιώντας σύνθετους δείκτες και αντικαθιστά το @ στο πρόθεμα με CurlFile για χρήση στο Curl * @param $inputArray * @param string $inputKey * @return πίνακας $requestVars = πίνακας ("id" => πίνακας( 1, 2,"id"=>1234), "name" => "log", "logfile" => "@/tmp/test.log"); παίρνουμε: ["id"]=> int(1) ["id"]=> int(2) ["id"]=> int(1234) ["name"]=> string(3) "log" [ "logfile"]=> string(13) "/tmp/test.log" ) */ function convertToStringArray($inputArray, $inputKey="") ( $resultArray=; foreach ($inputArray ως $key => $value ) ( $tmpKey = (bool)$inputKey ? $inputKey."[$key]" : $key; if (is_array($value)) ( $resultArray+=convertToStringArray($value, $tmpKey); ) elseif ($value = = "@")( $resultArray[$tmpKey] = (class_exists(" CURLFile ", false)) ? new CurlFile(ltrim($value, "@")) : $value; ) else ( $resultArray[$tmpKey ] = $value; ) ) return $resultArray; ) // έλεγχος $requestVars = array("id" => array(1, 2,"id"=>1234), "name" => "log", "logfile" " => "@/tmp/test.log"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "site"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, convertToStringArray($requestVars)); $res = curl_exec($ch); curl_close($ch); Παραδείγματα εφαρμογών χρήσης Curl