Php 无论如何,到';间谍';关于curl_init()的活动;curl_exec()?
我有一些PHP代码,曾经运行得很好。它调用了一个外部API,该API根本没有更改。PHP代码也没有任何变化。但是突然,我没有得到这个函数的结果: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='';
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:啊,这可能就是它一开始就停止工作的原因。希望最后一切顺利。