如何在 PHP 中通过 cURL 使用代理

本文将介绍如何通过代理在 PHP 中执行 HTTP 请求。代理服务器充当 PHP 应用程序和互联网之间的网关,从而隐藏好你的真实 IP。代理服务器提供的安全性和匿名性,并允许你访问本国无法提供的服务等这些特性使得他大受欢迎。同时代理服务还是是网络爬虫的一大利器,因为它能帮助你避免 真实IP 被封禁.

为什么 PHP 需要代理?

代理服务器是充当客户端和服务器之间中介的服务。当客户端向服务器发送请求时,代理服务器拦截该请求并将其转发给服务器。因此,服务器将看到代理服务器的 IP 地址,而不是您的 IP 地址。这确保了匿名性。

如果您的 PHP 脚本执行 HTTP 请求,您应该在代理服务器后面执行它们,以保护您的 IP 不被封禁。因此,在使用 PHP 构建网络抓取工具或机器人时,代理会派上用场。

此外,PHP 中的代理服务器还可用于:

  • 提高性能:代理服务器通过缓存客户端频繁请求的网页和资源,可以减轻原始服务器的负载,提高网络的整体性能。
  • 过滤内容:代理服务器可以配置为出于审查原因阻止对某些网站的访问。
  • 绕过限制:代理服务器可用于绕过地理或类似限制,允许用户访问原本不可用的内容。

代理服务器支持不同的协议,例如 HTTP、HTTPS 和 SOCKS,PHP 允许您使用所有这些类型的代理。现在让我们学习如何使用 cURL 在纯 PHP 中处理代理服务器。

如何在 PHP 中通过 cURL 使用代理服务器

在本节中,您将逐步了解在 PHP 中使用代理服务器从基本方法到更高级的方法所需的一切知识。

开始前准备工作

在开始学习使用 PHP 代理之前,您需要满足以下要求:

如果您不符合这些要求,请点击上面的链接,按照官方指南下载和配置您所需的内容。请注意,cURL 是 curl-ext PHP 扩展的一部分,通常包含在大多数 PHP 软件包中。如果下载的 PHP 软件包不包含该扩展,请按照官方安装指南安装 curl-ext。

从扩展名就不难猜到,curl-ext在后台使用cURL。因此,了解一下如何使用 cURL 代理服务器可能会对你有所帮助。

此外,请记住,网络代理通常用于网络爬虫等。因此,请跟随 PHP 网络搜索指南学习如何用 PHP 构建网络爬虫。在这里,你将看到如何扩展 PHP 搜索脚本,使其使用 cURL 中的服务器代理。

开始使用 cURL 中的代理

首先,让我们来着重了解一下如何在 cURL 中执行 HTTP 请求:

php 复制代码
// initializing a cURL session
$ch = curl_init();

// setting the HTTP method
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");

// specifying the target URL 
curl_setopt($ch, CURLOPT_URL, "https://www.example.com");

// return the result of the request as a string 
// instead of printing it directly
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// sending the HTTP GET request
// and assigning its response to a variable
$response = curl_exec($ch);

// using the response of the HTTP request...
// close the cURL channel to free up 
// some system resources
curl_close($ch);

正如你所看到的,用cURL执行一个请求只需要几行代码。使用curl_init()初始化cURL会话后,你可以通过curl_setopt()设置请求所需的所有选项。然后,使用curl_exec()执行HTTP请求。最后,当你不再需要当前的cURL会话时,可以用curl_close()关闭它。

需要注意的是,curl_init()返回的对象通常会被分配给一个名为ch的PHP变量,它代表 "cURL句柄",或简单的 "通道"。

现在,让我们扩展这个 cURL 例子,使用服务器代理。首先要记住,要连接到代理,需要指定以下信息:

  • Proxy server address
  • Port
  • Protocol
  • Username (如果需要验证)
  • Password (如果需要验证)

我们假设 HTTP 代理的完整 URL 如下所示:

go 复制代码
`206.189.156.117:8080`

然后:

  • 206.189.156.117是代理服务器地址
  • 8080是端口
  • HTTP是协议

您可以在 cURL 中设置这些参数

bash 复制代码
curl_setopt($curl, CURLOPT_PROXY, "206.189.156.117");
curl_setopt($curl, CURLOPT_PROXYPORT, "8080");
curl_setopt($curl, CURLOPT_PROXYTYPE, "CURLPROXY_HTTP");

请注意,CURLOPT_PROXYTYPE 接受以下值:

  • CURLPROXY_HTTP
  • CURLPROXY_SOCKS4
  • CURLPROXY_SOCKS5
  • CURLPROXY_SOCKS4A
  • CURLPROXY_SOCKS5_HOSTNAME

由于CURLPROXY_HTTP是默认值并且大多数代理都是 HTTP 代理,因此您通常可以省略最后一行。CURLOPT_PROXY此外,您还可以通过提供带有完整代理 URL 的选项 来直接指定代理端口。

换句话说,您可以通过 cURL 在 PHP 中使用代理,并使用以下一行代码:

bash 复制代码
curl_setopt($curl, CURLOPT_PROXY, "206.189.156.117:8080");

连接到需要经过身份验证的代理

某些代理受身份验证保护。如果您想使用它们,您需要指定用户名和密码。要使用 cURL 连接到 PHP 中经过身份验证的代理服务器,请使用:

bash 复制代码
curl_setopt($curl, CURLOPT_PROXYUSERPWD, "<username>:<password>");

请注意,cURL 选项接受的值CURLOPT_PROXYUSERPWD必须采用 : 格式。

因此,假设您的用户名是zty1001,密码是zty1001pw,在 PHP 中使用 cURL 连接到代理服务器的完整示例是:

php 复制代码
<?php

$ch = curl_init();

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_URL, "https://www.example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// setting the proxy server URL
curl_setopt($curl, CURLOPT_PROXY, "206.189.156.117:8080");

// dealing with proxy authentication
curl_setopt($curl, CURLOPT_PROXYUSERPWD, "zty1001:zty1001pw");

$response = curl_exec($ch);

// using the response of the HTTP request...
curl_close($ch);

使用 cURL Rotating Proxies

代理服务器用于保护您的IP地址。您的 Web 爬虫目标站点将看到代理的IP,而非您的真实IP,这意味着若您频繁发起请求,可能会导致目标站点阻止代理服务器的IP。

简言之,依赖单一代理可能并非最佳解决方案。因此,为了使您的网络爬取流程避免被ban,您可以采纳一个轮流代理策略。轮流代理为每项新请求分配一个不同的IP地址。具体来说,轮流代理系统拥有一个备用的代理池,每次请求都可以随机从中选取。

采用这种方式,您的IP更不易被封锁,从而使网络爬取过程得以持续流畅地运行。要实现轮流代理,您需要一组代理。

现在让我们来学习如何在PHP中实现轮流代理策略。首先,您需要将您的代理池存储在一个变量内:

php 复制代码
$proxies = array(
     array(
         "url" => "myproxy.com:8081",
         "username" => null,
         "password" => null
     ),

     array(
         "url" => "myproxy.com:8082",
         "username" => "asdlwdcm18j",
         "password" => "da913ma01dkannah803n"
     ),

     // ...

     array(
         "url" => "myproxy.com:5001",
         "username" => null,
         "password" => null
     ),
);

现在,让我们构建一个函数来处理轮换代理逻辑:

php 复制代码
function proxy_request($proxies, $ch, $max_attemps = 5, $wait = 2) {
        $attemps = 0;

        while ($attemps < $max_attemps) {
                // getting a random proxy from 
                // the pool of proxies
                $random_proxy = $proxies[array_rand($proxies)];

                // if the proxy requires authentication
                if (!is_null($random_proxy["username"]) && !is_null($random_proxy["password"])) {
                        curl_setopt($ch, CURLOPT_PROXYUSERPWD, $random_proxy["username"] . ":" . $random_proxy["password"]);
                }

                // configuring the proxy to use
                curl_setopt($ch, CURLOPT_PROXY, $random_proxy["url"]);

                echo "Performing the request with the proxy: " . $random_proxy["url"] . "\n";

                // performing the request
                $result = curl_exec($ch);

                // if the request failed
                if (curl_errno($ch)){
                        echo "Request failed";
                        echo "Waiting " . $wait . "seconds...";

                        // waiting a number $wait of seconds
                        // before performing a new attempt again
                        sleep($wait);

                        // incrementing the attempt counter
                        $attemps++;

                        echo "Trying again...";
                } else {
                        curl_close($ch);

                        return $result;
                }
        }

        // in case of error
        return false;
}

此函数旨在尝试为最多$max_attemps次请求,在预先定义的cURL handle中执行请求,并随机选取信息池中的代理进行使用。在此我需要再次提醒您,实施如上所述的重试逻辑是绝对必要的。这是因为免费代理往往容易出现故障。

然后您可以proxy_request()按如下方式使用:

php 复制代码
// $proxies = ...

$ch = curl_init();

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_URL, "https://www.example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// performing the HTTP request through a
// rotating proxy
$response = proxy_request($proxies, $ch);

请注意,免费代理服务器速度慢且一般不可靠,最好在生产环境中选择一些商用的。

总结

正如您在此篇文章中所学到的,代理是网络抓取过程中不可或缺的工具。在详细的指导下,您已经掌握了如何在PHP环境中运用Web代理的所有必备技术。通过cURL在Web代理下执行HTTP请求,只需简单的几行代码即可实现。

此外,您还了解到如何在PHP环境中实现轮询代理以及其可能为网络抓取过程带来的诸多益处。然而,我们必须指出,使用免费代理实现轮询代理也许并不理想。因此,对于更高要求的应用场景,一定要从实际的角度出发,选择合适的技术选型.

相关推荐
4***V2028 小时前
PHP在微服务通信中的消息队列
开发语言·微服务·php
亿坊电商8 小时前
PHP框架 vs 原生开发:移动应用后端开发实战对比!
开发语言·php
n***293210 小时前
PHP安全编程实践
开发语言·安全·php
b***748811 小时前
PHP在电子商务系统中的构建
开发语言·php
BingoGo11 小时前
PHP8.6 新的 RFC 提案 Context Managers 优雅管理资源生命周期
后端·php
JaguarJack12 小时前
PHP8.6 新的 RFC 提案 Context Managers 优雅管理资源生命周期
php·服务端
月下的郁王子12 小时前
进阶学习 PHP 中的二进制和位运算
android·学习·php
饭九钦vlog16 小时前
修复重装机kali机器上不了网络域名问题一键脚本
服务器·网络·php
未来之窗软件服务18 小时前
幽冥大陆(二十九)监控平台协议常见地址——东方仙盟练气期
开发语言·php·东方仙盟·东方仙盟sdk·监控协议
拾忆,想起19 小时前
Dubbo网络延迟全链路排查指南:从微服务“快递”到光速传输
网络·网络协议·微服务·架构·php·dubbo