使用PHP的cURL,可以确定cURL将使用的IP地址吗?

使用PHP的cURL,可以确定cURL将使用的IP地址吗?,php,curl,Php,Curl,在连接到远程服务器时,是否可以通过编程确定cURL使用的IP地址?我有一个正在使用cURL的共享服务器,我需要发送IP地址作为请求的一部分 我正在与之交谈的服务器需要一个身份验证字符串,该字符串结合了连接IP地址和循环密码(例如,我的$code=SHA1($\u server['server\u ADDR'].$passcode)在其一端与SHA1($\u server['REMOTE\u ADDR'.$passcode)进行比较)。当来自cURL的传出连接使用与存储在$\u SERVER['S

在连接到远程服务器时,是否可以通过编程确定cURL使用的IP地址?我有一个正在使用cURL的共享服务器,我需要发送IP地址作为请求的一部分


我正在与之交谈的服务器需要一个身份验证字符串,该字符串结合了连接IP地址和循环密码(例如,我的$code=SHA1($\u server['server\u ADDR'].$passcode)在其一端与SHA1($\u server['REMOTE\u ADDR'.$passcode)进行比较)。当来自cURL的传出连接使用与存储在$\u SERVER['SERVER\u ADDR']中的IP相同的IP时,这种方法工作得很好,但是cURL使用的IP地址现在不同,并且会定期旋转。

您可以强制cURL使用的IP,而不是检测它

使用的
CURLOPT_接口
选项-将其设置为您希望使用的IP

如果您正在使用具有IP池的服务器(如cloudserver),那么出于安全原因,如果在另一端检测到该接口很重要,则建议选择要使用的接口


就我个人而言,当IP受到限制时,我不得不使用该功能通过cURL进行卡支付数据传输。

有一个名为whatismyip.com的网站。他们有一个公开的API,你可以使用,只要你不超过他们的限制(大约是每小时五个请求??)。试一试也无妨,嗯?

你可以这样做,在打电话之前获得你的公共IP:

$ch = curl_init('http://whatismyip.org/');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
$myIp = curl_exec($ch);
然而:

  • 如果您的公共IP有时在cURL会话之间发生变化,那么可以说它在上述会话和您实际需要此数据的下一个会话之间不会发生变化
  • 它依赖于实际运行的
    whatismyip.org
    (或类似服务)

假设curl总是从同一台服务器上运行,即使它有多个NIC,如果您告诉curl使用哪个IP也不重要

我会使用DaveRandom的技巧获取您当前使用的IP,然后使用

curl_setopt($ch, CURLOPT_INTERFACE, "XXX.XXX.XXX.XXX");

假设这两个调用足够接近,IP仍将绑定到接口的可能性非常高,通过设置它,您告诉curl使用该接口,而不是负载平衡器可能想要使用的接口。

+1为最佳解决方案,但在共享主机上可能不可能。@DaveRandom:大多数共享主机平台至少有一个主机服务器的主IP,可以绑定到该主机服务器上-尽管它并不总是像您所说的那样允许更改。关于这一点,我刚刚想到的另一点是,如果它们有多个IP地址绑定到一个NIC,选择接口可能无法保证特定的IP地址,即使您传递了特定的IP地址。cURL只使用接口引用(如
eth0
),如果传递IP/主机名,它将使用它来获取接口引用。实际上,为数据包分配一个源IP是NIC驱动程序的责任,无法控制它(至少,不是通过PHP)。@DaveRandom:Yee,原则上是正确的。我发现,当我指定IP时,它往往会起作用,但正如您所说,通过接口的路由是在不同的级别上进行的
iptables
可能会有帮助,但除非OP有一个专用服务器,否则没有任何用处。@Wige:Hmm,正如DaveRandom所说的那样-如果有多个IP分配给接口,那么它可以决定使用另一个IP。网络路由的目的是超出用户区应用程序的范围。+1,尽管我不会在没有非常重要的警告的情况下给出它,如果存在池,则无法保证从一个调用到另一个调用的IP相同。不知道一次呼叫中的多个cURL会话是否来自同一IP。目前,这是我正在使用的解决方案,但在我的终端上有一个服务,而不是whatismyip来更快地确定IP地址,并且没有访问限制。不幸的是,每小时3000个连接,这对我来说不是最有效的解决方案,所以我仍然在寻找。