Php 无论如何,到';间谍';关于curl_init()的活动;curl_exec()?

Php 无论如何,到';间谍';关于curl_init()的活动;curl_exec()?,php,curl,Php,Curl,我有一些PHP代码,曾经运行得很好。它调用了一个外部API,该API根本没有更改。PHP代码也没有任何变化。但是突然,我没有得到这个函数的结果: if (!function_exists(setFieldsAndCallURL)) { function setFieldsAndCallURL($url,$fields) { //url-ify the data for the POST $fields_string='';

我有一些PHP代码,曾经运行得很好。它调用了一个外部API,该API根本没有更改。PHP代码也没有任何变化。但是突然,我没有得到这个函数的结果:

if (!function_exists(setFieldsAndCallURL))
{ 
    function setFieldsAndCallURL($url,$fields)
    {

        //url-ify the data for the POST
        $fields_string='';
              foreach($fields as $key=>$value) 
                { $fields_string .= $key.'='.$value.'&'; }
        rtrim($fields_string,'&');

        //open connection
        $ch = curl_init();

        //set the url, number of POST vars, POST data
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_POST,count($fields));
        curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

        //execute the jump
        $result = '';
        $result = curl_exec($ch);

        //close connection
        curl_close($ch);

        return $result;
      }
}
之前,调用时将返回文本GUID:

$userURL ='https://api.nottherealendpointurl.net/public/user/authenticate';

$userFields = array(
     'username'=>$username,
     'lastName'=>$lastname,
     'firstName'=>$firstname,
     'email'=>$email,
     'token'=>urlencode($adminKey),
);

//Login this particular user
$userKey = setFieldsAndCallURL($userURL,$userFields);
但突然它开始返回“”(空字符串),我不知道为什么

有没有办法获得更多的信息并监视这件事的内部运作?查看它正在使用HTTP头日志记录软件进行的调用?还是别的什么


注意:我已经手动测试了API的POST,它正在按预期工作,我仍在返回正确的GUID。出于某种原因,通过卷曲的方式来做只是突然停止了正确的做。没有人知道现在会有什么不同。

根据您所处的平台,您可以查看原始数据包,仅限linux命令行,这将是适用于widows/其他您可以使用wireshark的tcpdump

tcpdump -i eth1 tcp port 80


很可能服务器的ip现在已被阻止,而您的本地ip没有被阻止

您可能需要添加

 $headerFile = fopen(filepath_to_header_file);
 $errorFile = fopen(filepath_to_error_file);    

 curl_setopt($ch, CURLOPT_VERBOSE, 1); 
 curl_setopt($ch, CURLOPT_HEADER, 1); 
 curl_setopt($ch, CURLOPT_WRITEHEADER, $headerFile ); 
 curl_setopt($ch, CURLOPT_STDERR, $errorFile );
将响应的标题和错误放入文件并查找其内容

编辑: 要验证服务器的ip是否被阻止,可以尝试以下方法

$host = "ssl://api.nottherealendpointurl.net/";
$port = 443;
$url = "/public/user/authenticate";

$timeout = 30;
$errno = "";
$errstr= "";

$fp = fsockopen($host, $port, $errno, $errstr, $timeout);
if($fp)
{
    $request = "GET ".$url." HTTP/1.1\r\n";
    $request.= "Host: ".$host."\r\n";
    $request.= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.12) Gecko/20050919 Firefox/1.0.7\r\n";
    $request.= "Connection: Close\r\n\r\n";

    fwrite($fp, $request);
    while (!feof($fp))
    {
        $data .= fgets($fp, 128);
    }
    fclose($fp);
    echo $data;
}
else
{
    echo "ERROR: ".$errstr;
}

其中$data包含来自远程服务器的响应-

@profitphp OK,那么这是否意味着我将在登录到服务器操作系统时运行它?是的,您将从运行cUrl脚本的服务器上运行它。+1因为我提到了wireshark,它是一个真正的野兽工具,但在右手中非常有用-管理员拯救!是的,谢谢。显然,他想解决他的问题,而不是他问的实际问题的答案,所以我的答案被遗忘了。hehe@profitphp实际上,Benjamin提供的答案更为具体,因为它提供了使用curl选项查看文件详细HTTP信息和错误日志的方法。这使我能够“侦察”curl,正如我所希望的那样。我认为WiReHARK或类似的工具是一个次要的解决方案,相比于我使用的对象的内置冗长/日志记录功能,如果你知道我的意思。谢谢,我会给你一个机会。到目前为止,我们只在不同的客户机上尝试了POST,而不是服务器本身。这可能是一个SSL问题(通过您提供的代码从日志中读取),我将CURLOPT_SSL_VERIFYHOST=FALSE,然后它开始工作。我无法访问服务器,因此您的方法非常有效,允许我读取文件中的错误。@Ryan:很高兴听到这个消息。但是我仍然想知道为什么你的代码突然停止工作了——你不是从一开始就通过ssl/https连接的吗?还有一点需要注意:您确实应该保持主机验证处于激活状态。看看这里,它实际上可能会帮助您做到这一点:事实上,我们刚刚更新了API端的SSL证书,我认为GeoTrust有了新的根链证书,客户端服务器对此并不知情,至少这是我的理论。刚刚查看了链接,谢谢你给我看这个。@Ryan:啊,这可能就是它一开始就停止工作的原因。希望最后一切顺利。