Working with APIs or web scraping in PHP often means that you have to deal with blocked IPs, authentication, load balancing, and other problems. Integrating proxies with Guzzle can help alleviate some of these issues.
You’ll learn step-by-step how to set up and use a proxy with the Guzzle client instance in a PHP script.
What Is Guzzle?
Guzzle is a PHP HTTP client library that makes it easy to send HTTP requests. It handles both simple processes like GET calls and more advanced operations like complex request flows.
A proxy server acts like a middleman between your PHP script and the target server. Instead of sending requests directly, your script routes them through a proxy. It helps you bypass IP bans to some extent, manage rate limits, and hide your original IP address, among other things.
Adding proxies with Guzzle is a great method when you’re working with geo-restrictions or scraping tasks that trigger bans often.
Preparation
Before you can even start using Guzzle, you’ll need to set up all the prerequisites. If you’re a Windows or Linux user, you’ll need to install PHP itself first.
You’ll also need the package manager “Composer” that’s specific to PHP. Downloading and installing is easy, but make sure to add the php.exe (or your operating system equivalent) to PATH. All that is needed is to tick the checkbox during installation.
Finally, you’ll need an IDE. Visual Studio Code is a common recommendation as it’s free and has plenty of great features.
Setting Up Guzzle in a PHP Project
To start using proxies with Guzzle, you first need to add Guzzle to your project. To install Guzzle, open your IDE, then create a terminal and run:
composer init
Assuming it’s the first time you run Composer in the project, you’ll get a few prompts asking to put in the author name, license, description, etc. Follow them through, although you can simply skip most of them you just want to test Guzzle.
You’ll then be able to download Guzzle through the same terminal by running:
composer require guzzlehttp/guzzle
It should add Guzzle to your project and update your composer.json file.
Now you can write a basic PHP script that uses a Guzzle client instance to make a GET request:
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client([
'verify' => false, // Disable SSL verification (for testing only!)
'timeout' => 30, // Increase timeout
]);
try {
$response = $client->request('GET', 'https://iproyal.com/blog/industry-news-2/');
echo $response->getBody()->getContents();
} catch (\GuzzleHttp\Exception\RequestException $e) {
echo "Error: " . $e->getMessage();
if ($e->hasResponse()) {
echo "\nResponse: " . $e->getResponse()->getBody();
}
}
On Windows, you may get an error that’s fixable by configuring certificate authority settings. Start by downloading the cURL certificate file and place it somewhere that’s easily accessible through a file manager.
Head back over to your IDE and, in the terminal, type in php --ini (two dashes before ini). The command will output the location of your php.ini file among some other things. Open the file.
Find the following two settings, uncomment them by removing the semicolon and add the location of your cacert.pem file:
curl.cainfo = C:\php\extras\ssl\cacert.pem
openssl.cafile = C:\php\extras\ssl\cacert.pem
The displayed directories are only an example – anywhere will do.

How to Configure Guzzle to Use a Proxy
Once you’ve got the basics down, it’s time to set up proxies with Guzzle, which is useful for hiding your IP, avoiding blocks, and accessing geo-restricted content. To do it, Guzzle allows you to add a “proxy’ option to your request so your HTTP request goes through a proxy:
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client();
$response = $client->request('GET', 'https://iproyal.com/blog/industry-news-2', [
'proxy' => 'http://111.11.11.11:8080',
]);
echo $response->getBody()->getContents();
Once you add your proxy IP and port, the PHP script will send the request through the named proxy server. It’s the most basic form of proxy configuration.
However, some servers require login and then you need to pass your credentials directly in the proxy URL like this:
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client();
$response = $client->request('GET', 'https://iproyal.com/blog/industry-news-2', [
'proxy' => 'http://username:[email protected]:8080',
]);
echo $response->getBody()->getContents();
If you need multiple IPs to avoid bans, you can use rotating proxies and change the proxy address dynamically with every request. It’s going to be more coding, but worth it in the end.
Troubleshooting Guzzle Proxy Issues
Proxies with Guzzle can sometimes result in errors. Here are some of the most common issues developers run into:
- Timeout errors. Your proxy might be down or too slow. You can either try using another one or set a longer timeout limit.
- Authentication errors. Check your proxy authentication details. One typo in the username or password will break the request.
- IP blocks or bans. Some sites detect repeated access and block the IP. Using rotating proxies changes your IP often, which lowers the chance of IP blocking.
Always test your Guzzle proxy integration with a known working endpoint to make debugging easier.
Don’t forget to remain ethical and stay in line with the target website’s terms and conditions. Respect robots.txt, privacy regulations, and make sure you limit your requests to prevent crashing the servers.
