Συχνές ερωτήσεις

Απαιτεί το Guzzle cURL;

Όχι. Το Guzzle μπορεί να χρησιμοποιήσει οποιονδήποτε χειριστή HTTP για την αποστολή αιτήσεων. Αυτό σημαίνει ότι το Guzzle μπορεί να χρησιμοποιηθεί με το cURL, το stream wrapper της PHP, τις υποδοχές και τις βιβλιοθήκες που δεν μπλοκάρουν. όπως το React. Απλά πρέπει να ρυθμίσετε έναν χειριστή HTTP ώστε να χρησιμοποιεί μια διαφορετική μέθοδο αποστολής αιτημάτων.

Σημείωση

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

Μπορεί το 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;

Το 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'
        ]
    ]
]);

Γιατί λαμβάνω σφάλμα επαλήθευσης SSL;

Πρέπει να καθορίσετε τη διαδρομή στο δίσκο για τη δέσμη CA που χρησιμοποιείται από το Guzzle για την επαλήθευση του πιστοποιητικού ομότιμου φορέα. Ανατρέξτε στην ενότητα verify.

Τι είναι αυτό το σφάλμα φωλιάσματος μέγιστης συνάρτησης;

Maximum function nesting level of '100' reached, aborting

Μπορεί να αντιμετωπίσετε αυτό το σφάλμα εάν έχετε εγκαταστήσει την επέκταση XDebug και εκτελείτε πολλά αιτήματα σε callbacks. Αυτό το μήνυμα σφάλματος έρχεται συγκεκριμένα από την επέκταση XDebug. Η ίδια η PHP δεν διαθέτει μια συνάρτηση όριο φωλιασμού συναρτήσεων. Αλλάξτε αυτή τη ρύθμιση στο php.ini για να αυξήσετε το όριο:

xdebug.max_nesting_level = 1000

Γιατί λαμβάνω απάντηση σφάλματος 417;

Αυτό μπορεί να συμβεί για διάφορους λόγους, αλλά αν στέλνετε 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);