Όχι. Το Guzzle μπορεί να χρησιμοποιήσει οποιονδήποτε χειριστή HTTP για την αποστολή αιτήσεων. Αυτό σημαίνει ότι το Guzzle μπορεί να χρησιμοποιηθεί με το cURL, το stream wrapper της PHP, τις υποδοχές και τις βιβλιοθήκες που δεν μπλοκάρουν. όπως το React. Απλά πρέπει να ρυθμίσετε έναν χειριστή HTTP ώστε να χρησιμοποιεί μια διαφορετική μέθοδο αποστολής αιτημάτων.
Σημείωση
Το Guzzle χρησιμοποιεί ιστορικά μόνο το cURL για την αποστολή αιτημάτων HTTP. ένας καταπληκτικός πελάτης HTTP (αναμφισβήτητα ο καλύτερος), και το Guzzle θα συνεχίσει να χρησιμοποιεί το από προεπιλογή όταν είναι διαθέσιμη. Είναι σπάνιο, αλλά ορισμένοι προγραμματιστές δεν έχουν εγκαταστήσει την cURL στα συστήματά τους ή αντιμετωπίζουν προβλήματα συγκεκριμένης έκδοσης. Επιτρέποντας εναλλασσόμενους χειριστές HTTP, το Guzzle είναι τώρα πολύ πιο προσαρμόσιμο. και μπορεί να προσαρμοστεί ώστε να ταιριάζει στις ανάγκες περισσότερων προγραμματιστών.
Ναι. Μπορείτε να χρησιμοποιήσετε τις requestAsync
, sendAsync
, getAsync
,
headAsync
, putAsync
, postAsync
, deleteAsync
, και patchAsync
μεθόδους ενός πελάτη για την αποστολή μιας ασύγχρονης αίτησης. Ο πελάτης θα επιστρέψει μια
GuzzleHttp\Promise\PromiseInterface
αντικείμενο. Μπορείτε να συνδέσετε αλυσιδωτά then
συναρτήσεις από την υπόσχεση.
$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$promise->then(function ($response) {
echo 'Got a response! ' . $response->getStatusCode();
});
Μπορείτε να αναγκάσετε μια ασύγχρονη απόκριση να ολοκληρωθεί χρησιμοποιώντας τη μέθοδο wait()
της επιστρεφόμενης υπόσχεσης.
$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$response = $promise->wait();
Το cURL προσφέρει έναν τεράστιο αριθμό παραμετροποιήσιμων επιλογών. Ενώ το Guzzle ομαλοποιεί πολλές από αυτές τις επιλογές σε διαφορετικούς χειριστές, υπάρχουν υπάρχουν φορές που χρειάζεται να ορίσετε προσαρμοσμένες επιλογές cURL. Αυτό μπορεί να επιτευχθεί περνώντας έναν συσχετιστικό πίνακα ρυθμίσεων cURL στο κλειδί curl ενός αίτησης.
Για παράδειγμα, ας πούμε ότι πρέπει να προσαρμόσετε τη διασύνδεση εξερχόμενου δικτύου που χρησιμοποιείται με έναν πελάτη.
$client->request('GET', '/', [
'curl' => [
CURLOPT_INTERFACE => 'xxx.xxx.xxx.xxx'
]
]);
Αν χρησιμοποιείτε ασύγχρονες αιτήσεις με τον πολυχειριστή cURL και θέλετε να το τροποποιήσετε,
πρόσθετες επιλογές μπορούν να καθοριστούν ως συσχετιστικός πίνακας στην εντολή
options κλειδί του CurlMultiHandler
κατασκευαστή.
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlMultiHandler;
$client = new Client(['handler' => HandlerStack::create(new CurlMultiHandler([
'options' => [
CURLMOPT_MAX_TOTAL_CONNECTIONS => 50,
CURLMOPT_MAX_HOST_CONNECTIONS => 5,
]
]))]);
Μπορείτε να περάσετε προσαρμοσμένες επιλογές πλαισίου ροής χρησιμοποιώντας το κλειδί stream_context της επιλογής αίτησης. Το stream_context είναι ένας συσχετιστικός πίνακας όπου κάθε κλειδί είναι μια μεταφορά PHP και κάθε τιμή είναι ένας συσχετιστικός πίνακας επιλογών μεταφοράς.
Για παράδειγμα, ας πούμε ότι πρέπει να προσαρμόσετε τη διασύνδεση εξερχόμενου δικτύου που χρησιμοποιείται με έναν πελάτη και να επιτρέψετε αυτο-υπογεγραμμένα πιστοποιητικά.
$client->request('GET', '/', [
'stream' => true,
'stream_context' => [
'ssl' => [
'allow_self_signed' => true
],
'socket' => [
'bindto' => 'xxx.xxx.xxx.xxx'
]
]
]);
Πρέπει να καθορίσετε τη διαδρομή στο δίσκο για τη δέσμη CA που χρησιμοποιείται από το Guzzle για την επαλήθευση του πιστοποιητικού ομότιμου φορέα. Ανατρέξτε στην ενότητα verify.
Maximum function nesting level of '100' reached, aborting
Μπορεί να αντιμετωπίσετε αυτό το σφάλμα εάν έχετε εγκαταστήσει την επέκταση XDebug και εκτελείτε πολλά αιτήματα σε callbacks. Αυτό το μήνυμα σφάλματος έρχεται συγκεκριμένα από την επέκταση XDebug. Η ίδια η PHP δεν διαθέτει μια συνάρτηση όριο φωλιασμού συναρτήσεων. Αλλάξτε αυτή τη ρύθμιση στο php.ini για να αυξήσετε το όριο:
xdebug.max_nesting_level = 1000
Αυτό μπορεί να συμβεί για διάφορους λόγους, αλλά αν στέλνετε PUT, POST ή
PATCH αιτήσεις με μια Expect: 100-Continue
επικεφαλίδα, ένας διακομιστής που δεν
υποστηρίζει αυτή την επικεφαλίδα θα επιστρέψει μια απάντηση 417. Μπορείτε να το παρακάμψετε αυτό
θέτοντας την επιλογή expect
αίτησης σε false
:
$client = new GuzzleHttp\Client();
// Disable the expect header on a single request
$response = $client->request('PUT', '/', ['expect' => false]);
// Disable the expect header on all client requests
$client = new GuzzleHttp\Client(['expect' => false]);
Μπορείτε να ενεργοποιήσετε την παρακολούθηση των URIs και των κωδικών κατάστασης που ανακατευθύνονται μέσω της εντολής
track_redirects επιλογή. Κάθε URI ανακατεύθυνσης και κωδικός κατάστασης θα αποθηκεύεται στο αρχείο
X-Guzzle-Redirect-History
και στο X-Guzzle-Redirect-Status-History
αντίστοιχα.
Το URI της αρχικής αίτησης και ο τελικός κωδικός κατάστασης θα εξαιρεθούν από τα αποτελέσματα. Με αυτό κατά νου θα μπορείτε εύκολα να παρακολουθείτε την πλήρη διαδρομή ανακατεύθυνσης μιας αίτησης.
Για παράδειγμα, ας πούμε ότι πρέπει να παρακολουθείτε τις ανακατευθύνσεις και να παρέχετε και τα δύο αποτελέσματα μαζί σε μια ενιαία αναφορά:
// First you configure Guzzle with redirect tracking and make a request
$client = new Client([
RequestOptions::ALLOW_REDIRECTS => [
'max' => 10, // allow at most 10 redirects.
'strict' => true, // use "strict" RFC compliant redirects.
'referer' => true, // add a Referer header
'track_redirects' => true,
],
]);
$initialRequest = '/redirect/3'; // Store the request URI for later use
$response = $client->request('GET', $initialRequest); // Make your request
// Retrieve both Redirect History headers
$redirectUriHistory = $response->getHeader('X-Guzzle-Redirect-History')[0]; // retrieve Redirect URI history
$redirectCodeHistory = $response->getHeader('X-Guzzle-Redirect-Status-History')[0]; // retrieve Redirect HTTP Status history
// Add the initial URI requested to the (beginning of) URI history
array_unshift($redirectUriHistory, $initialRequest);
// Add the final HTTP status code to the end of HTTP response history
array_push($redirectCodeHistory, $response->getStatusCode());
// (Optional) Combine the items of each array into a single result set
$fullRedirectReport = [];
foreach ($redirectUriHistory as $key => $value) {
$fullRedirectReport[$key] = ['location' => $value, 'code' => $redirectCodeHistory[$key]];
}
echo json_encode($fullRedirectReport);