php cURL有时有效,有时无效';T

php cURL有时有效,有时无效';T,php,curl,Php,Curl,我有一个奇怪的情况 我正在尝试用php进行curl请求。有时它返回有效响应,有时它返回“HTTP/1.1 401 Unauthorized。一种常见模式是,如果我等待很长时间,请求之间的间隔为5分钟。如果我在每次请求之后立即发出请求,则请求失败。(此模式也不一致)但有时我可以一个接一个地提出成功的请求 如果我使用curl命令发出相同的请求,它会一直工作。两者之间的详细程度完全相同 <?php $api = new ApiRestTest(URL,LOGIN,APIKEY); $result

我有一个奇怪的情况

我正在尝试用php进行curl请求。有时它返回有效响应,有时它返回
“HTTP/1.1 401 Unauthorized
。一种常见模式是,如果我等待很长时间,请求之间的间隔为5分钟。如果我在每次请求之后立即发出请求,则请求失败。(此模式也不一致)但有时我可以一个接一个地提出成功的请求

如果我使用curl命令发出相同的请求,它会一直工作。两者之间的详细程度完全相同

<?php
$api = new ApiRestTest(URL,LOGIN,APIKEY);
$result = $api->curl_req(CONTACT_TEST);
var_dump($result);

class ApiRestTest
{
protected $_url;
protected $_username;
protected $_apiKey;

public function __construct($url, $username, $apiUserKey) {
    $this->_url = $url;
    $this->_username = $username;
    $this->_apiKey = $apiUserKey;
}

private function getHeader() {
    $nonce = base64_encode(substr(md5(uniqid()), 0, 16));;
    $created = date('c');
    $digest = base64_encode(sha1(base64_decode($nonce) . $created . $this->_apiKey, true));

    $wsseHeader[] = "Content-type:application/vnd.api+json";
    $wsseHeader[] = "Accept: application/json";
    $wsseHeader[] = "Authorization: WSSE profile=\"UsernameToken\"";
    $wsseHeader[]= sprintf(
        'X-WSSE: UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"', $this->_username, $digest, $nonce, $created
    );
    var_dump($wsseHeader);
    return $wsseHeader;
}

public function curl_req($path, $data=array())
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $this->_url . $path);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    curl_setopt($ch, CURLOPT_USERAGENT, 'curl/7.54.0');
    curl_setopt($ch, CURLOPT_HTTPHEADER, $this->getHeader());
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}}

如果我在终端上运行相同的
curl
命令,它工作正常。有什么问题吗?

是服务器阻止了我的请求吗?我觉得端点有一些规则来阻止请求频率。你应该阅读文档或联系供应商进行验证。我找到了一个解决方法。如果我将系统时间更改为晚上11点开始工作。我不知道为什么。如果你不知道为什么工作,那么你怎么知道它工作?你应该厌倦继续做一些你不了解的事情。是服务器阻止了我的请求吗?听起来终点有一些规则来阻止请求频率。你应该阅读文档或联系v恩多验证。我找到了一个解决方法。如果我将系统时间改为晚上11点,它会工作。我不知道为什么。如果你不知道为什么会工作,那么你怎么知道它工作?你应该厌倦继续你不了解的事情。
   $ curl -v -H "Content-type:application/vnd.api+json" -H "Accept: application/json" -H 'Authorization: WSSE profile="UsernameToken"' -H 'X-WSSE: UsernameToken Username="system", PasswordDigest="D1jXzXaTxcZDJ6YKvtqkggkhXV8=", Nonce="ODM3ZWVmZTRiY2U0MmIzNQ==", Created="2017-08-30T10:16:55+10:00"' http://orocampus.tk/app.php/api/contacts/2

   Trying 45.76.122.100...
   TCP_NODELAY set
   Connected to orocampus.tk (45.76.122.100) port 80 (#0)
   > GET /app.php/api/contacts/2 HTTP/1.1
   > Host: orocampus.tk
   > User-Agent: curl/7.54.0
   > Content-type:application/vnd.api+json
   > Accept: application/json
   > Authorization: WSSE profile="UsernameToken"
   > X-WSSE: UsernameToken Username="system", PasswordDigest="D1jXzXaTxcZDJ6YKvtqkggkhXV8=", Nonce="ODM3ZWVmZTRiY2U0MmIzNQ==", Created="2017-08-30T10:16:55+10:00"
   > 
   < HTTP/1.1 200 OK
   < Server: nginx/1.13.3
   < Date: Wed, 30 Aug 2017 00:17:17 GMT
   < Content-Type: application/vnd.api+json
   < Transfer-Encoding: chunked
   < Cache-Control: no-cache
   < Set-Cookie: SERVERID=web2; path=/
   < 
   * Connection #0 to host orocampus.tk left intact
$ php test.php 
array(4) {  
[0]=>
string(37) "Content-type:application/vnd.api+json"
[1]=>
string(24) "Accept: application/json"
[2]=>
string(43) "Authorization: WSSE profile="UsernameToken""
[3]=>
string(157) "X-WSSE: UsernameToken Username="system",      PasswordDigest="D1jXzXaTxcZDJ6YKvtqkggkhXV8=", Nonce="ODM3ZWVmZTRiY2U0MmIzNQ==", Created="2017-08-30T10:16:55+10:00""
}
*   Trying 45.76.122.100...
* TCP_NODELAY set
* Connected to orocampus.tk (45.76.122.100) port 80 (#0)
> GET /app.php/api/contacts/2 HTTP/1.1
Host: orocampus.tk
User-Agent: curl/7.54.0
Content-type:application/vnd.api+json
Accept: application/json
Authorization: WSSE profile="UsernameToken"
X-WSSE: UsernameToken Username="system",     PasswordDigest="D1jXzXaTxcZDJ6YKvtqkggkhXV8=",  Nonce="ODM3ZWVmZTRiY2U0MmIzNQ==", Created="2017-08-30T10:16:55+10:00"

< HTTP/1.1 401 Unauthorized
< Server: nginx/1.13.3
< Date: Wed, 30 Aug 2017 00:16:53 GMT
< Content-Type: application/json
< Transfer-Encoding: chunked
< Cache-Control: no-cache
< WWW-Authenticate: WSSE realm="Secured API", profile="UsernameToken"
< Set-Cookie: SERVERID=web2; path=/
< 
* Connection #0 to host orocampus.tk left intact
string(277) "HTTP/1.1 401 Unauthorized
Server: nginx/1.13.3
Date: Wed, 30 Aug 2017 00:16:53 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Cache-Control: no-cache
WWW-Authenticate: WSSE realm="Secured API", profile="UsernameToken"
Set-Cookie: SERVERID=web2; path=/
    function request($path) {
    $curl = "curl -v -H \"Content-type:application/vnd.api+json\" -H \"Accept: application/json\" -H 'Authorization: WSSE profile=\"UsernameToken\"'".
        " -H ".$this->getHeader()[3]."' " . $this->_url . $path;

    var_dump($curl);
    exec($curl, $output, $exit);
    var_dump($output);
    return $exit == 0;
}