Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从localhost到live站点的Curl响应不一致_Php_Json_Curl - Fatal编程技术网

Php 从localhost到live站点的Curl响应不一致

Php 从localhost到live站点的Curl响应不一致,php,json,curl,Php,Json,Curl,大家好,我有一个php文件,它返回一个JSON,我是根据curl的响应构建的。我的问题是,当我在本地(localhost)服务器上运行它时,JSON响应的长度是55,这是正确的,它得到了我需要的所有事件。但是当我在我们的托管站点上尝试时,响应是不一致的,它与本地主机不同。对于第一次加载,我检查了长度响应,它返回55个事件中的32个,然后我尝试再次重新加载,然后响应增加到39个,以此类推 这是我的本地主机响应。[.这是承载在cpanel上的文件。这是第一个响应。当我再次重新加载此页面时 我的php

大家好,我有一个php文件,它返回一个JSON,我是根据curl的响应构建的。我的问题是,当我在本地(localhost)服务器上运行它时,JSON响应的长度是55,这是正确的,它得到了我需要的所有事件。但是当我在我们的托管站点上尝试时,响应是不一致的,它与本地主机不同。对于第一次加载,我检查了长度响应,它返回55个事件中的32个,然后我尝试再次重新加载,然后响应增加到39个,以此类推

这是我的本地主机响应。[.这是承载在cpanel上的文件。这是第一个响应。当我再次重新加载此页面时

我的php文件函数过程是这样的。 我有一个函数,它获取今年活动的所有ID,并将其推送到全局数组。我已经删除了重复的ID。因此,现在我为multicurl调用了一个函数

其中,对于每个ID,我将再次处理和调用API并构造它。然后我将其推送到全局中的responseEvents变量数组中,然后对其进行编码以生成有效的JSON文件。我在multi-curl中是否存在连接或错误操作?它们是对php multi-curl的执行限制?还是settimelimit(0)影响我的代码

这是我的密码

<?php
//Use this so that when we run the curl it wont timeout when dealing with getting data
set_time_limit(0);
$API_KEY  = "APIKEY";
$CURRENT_YEAR = date("Y");
$CURRENT_MONTH = date("m");
$CURRENT_DAY = date("d");
$events = getOpportunityYearly();//array of ID's removed duplicates [1,1,2,3,4,5 etc]
$noDuplicate =  array_values(array_unique($events));//remove $event ID duplciates
$responseEvents = [];//this is the array to be returned as json to use

//pass noDuplicate array which holds event ID's
multiCurl($noDuplicate);
print_r(json_encode($responseEvents, JSON_HEX_QUOT |  JSON_HEX_TAG | JSON_HEX_AMP |JSON_UNESCAPED_SLASHES ));

//returns an array of ID of events
function getOpportunityYearly(){
  $eventArr = [];//pass eventsID here
  $curl = curl_init();

  curl_setopt_array($curl, array(
      CURLOPT_URL => 'https://api.com/voc/api/v3/data/opportunities_dates?key='.$GLOBALS['API_KEY'].'&fields=["startDate","endDate","opportunities_id"]&where={"whereType":"AND","clauses":[{"fieldName":"startDate","operator":">=","operand":"'.$GLOBALS['CURRENT_YEAR'].'-'.$GLOBALS['CURRENT_MONTH'].'-'.$GLOBALS['CURRENT_DAY'].'"},{"fieldName":"endDate","operator":"<=","operand":"'.$GLOBALS['CURRENT_YEAR'].'-12-31"}]}',
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 0,
      CURLOPT_FOLLOWLOCATION => true,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "GET",
  ));

  //convert response to obj
  $response = json_decode(curl_exec($curl));
  curl_close($curl);
  $eventsID = $response->records;
  //print_r($eventsID);

  //every opportunity object get its id and push to events array
  foreach($eventsID as $opportunity){
    array_push($eventArr,$opportunity->opportunities_id->value);
  }
  return $eventArr;
}

function multiCurl($eventArray){
    // array of curl handles
    $multiCurl = array();

    // data to be returned
    $result = array();

    // multi handle
    $mh = curl_multi_init();
    $index = null;

    foreach ($eventArray as $event) {
        //$event are the ID per each event
        $multiCurl[$event] = curl_init();
        curl_setopt_array($multiCurl[$event], array(
          CURLOPT_URL =>'https://api.com/voc/api/v3/data/opportunities/'.$event.'?key='.$GLOBALS['API_KEY'].'&fields=["opportunityName","typeOfWork","firstDateInOpportunity","lastDateInOpportunity","startTime","endTime","physicalDifficulty","minimumAge","location","state","city","county","campingAvailable","groupsAllowed","registrationFormID","cRQ_payment","paymentAmount","additionalInformation","photo","displayToPublic","latitude","longitude","summary","description","photo"]&where={"whereType":"AND","clauses":[{"fieldName":"displayToPublic","operator":"checked"}]}',
          CURLOPT_RETURNTRANSFER => true,
          CURLOPT_ENCODING => "",
          CURLOPT_MAXREDIRS => 10,
          CURLOPT_TIMEOUT => 0,
          CURLOPT_FOLLOWLOCATION => true,
          CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
          CURLOPT_CUSTOMREQUEST => "GET"
        ));
        curl_multi_add_handle($mh, $multiCurl[$event]);
    }

    do {
      curl_multi_exec($mh,$index);
    } while($index > 0);

      // get content and remove handles
      foreach($multiCurl as $key=>$value) {

        $records = json_decode(curl_multi_getcontent($value));//response of each request
        $record  = $records->records[0];

       if(strtolower($record->displayToPublic->displayValue) == 'yes'){
          $eve =  [ 
            "page_item_url"=> $record->opportunities_id->value,
              "data"=>[
                "typeOfWork"=>$record->typeOfWork->displayValue,
                "opportunityName"=> $record->opportunityName->displayValue,
                "firstDateInOpportunity"=> $record->firstDateInOpportunity->displayValue,
                "lastDateInOpportunity"=> property_exists($record, 'lastDateInOpportunity') ? $record->lastDateInOpportunity->displayValue : $record->firstDateInOpportunity->displayValue,
                "startTime"=>$record->startTime->displayValue,
                "endTime"=>$record->endTime->displayValue,
                "physicalDifficulty"=>$record->physicalDifficulty->displayValue,
                "minimumAge"=>$record->minimumAge->displayValue,
                "location"=>$record->location->displayValue,
                "state"=>$record->state->displayValue,
                "city"=>$record->city->displayValue,
                "county"=>$record->county->displayValue,
                "campingAvailable"=>$record->campingAvailable->displayValue,
                "groupsAllowed"=>$record->groupsAllowed->displayValue,
                "registrationFormID"=>$record->registrationFormID->displayValue,
                "cRQ_payment"=>$record->cRQ_payment->displayValue,
                "paymentAmount"=>$record->paymentAmount->displayValue,
                "photo"=>$record->photo->displayValue,
                "displayToPublic"=>$record->displayToPublic->displayValue,
                "latitude"=> property_exists($record, 'latitude') ? $record->latitude->displayValue : "0",
                "longitude"=> property_exists($record, 'longitude') ? $record->longitude->displayValue : "0",
                "photo"=>$record->photo->displayValue,
                "description"=> $record->description->displayValue,
                "additionalInformation"=> $record->additionalInformation->displayValue,
                "summary"=> $record->summary->displayValue
                ]
              ];
              array_push($GLOBALS["responseEvents"],$eve);
              curl_multi_remove_handle($mh, $value);
        }
      }//foreach
    curl_multi_close($mh);
}

?>



我想你的curl在输入这个foreach
foreach($key=>value)时没有检索到所有信息。
这可以解释为什么它在本地(快速响应)而不是远程服务器(网络时间,更长的响应时间)上是正常的

你应该试试这个,我从中得到的,应该等待所有连接正确结束

do {
    $status = curl_multi_exec($mh, $index);
    if ($index) {
        // Wait a short time for more activity
        curl_multi_select($mh);
    }
} while ($index && $status == CURLM_OK);

你在两种环境中使用相同的$GLOBALS['API_KEY']吗?@AlexKapustin,是的。它是同一个API端点。第一个是获取今年的所有事件ID,第二个是按ID调用每个信息。是的,我知道端点是相同的,但我的问题是:$GLOBALS['API_KEY']-可能是安全授权令牌。并基于此令牌(可能与具有不同设置的不同帐户相关)您可能会有不同的响应。只需asuming…@AlexKapustin不,它不是不同的帐户。它只是一个单一的API密钥。试图直接放置它,它仍然没有给出正确的响应数。您的url生成器充满了错误:应该是url编码的,但不是,+应该是json编码的,但不是,以及其他错误应该是json编码+url编码,但既不是json编码也不是url编码。这样做:-现在它实际上是可读的,可维护的,所有内容都将正确地进行json编码和url编码。