2016-11-21 2 views
1

Google API PHP 클라이언트 라이브러리 2.0.3을 사용하는 사용자 목록을 얻으려면 웹 응용 프로그램을 실행하고 있습니다. CSV 파일에 저장하는 동시에 화면에서 프로세스를 추적하고 있습니다. 내가 사용하고있는 코드는 다음과 같습니다.Google API PHP 클라이언트 라이브러리

$pageToken = null; 
$optParams = array(
    "customer" => "my_customer", 
    "maxResults" => 500, 
    "orderBy" => "email", 
    "sortOrder" => "ASCENDING" 
); 

try { 

    $usernum = 0; 

    do { 

     if ($pageToken){ 
      $optParams['pageToken'] = $pageToken; 
     }   

     $results = $service->users->listUsers($optParams); 
     $pageToken = $results->getNextPageToken(); 
     $users = $results->getUsers(); 

     foreach ($users as $user) { 

      $usernum++; 

      $csvfileusers = array($user->getPrimaryEmail()); 
      fputcsv($savecsv, $csvfileusers); 

      $usersemails = $user->getPrimaryEmail(); 
      print "<li>".$usernum." - <font color='#9dd7fb'>".$usersemails."</font></li>"; 

     } 

    } while($pageToken); 

} catch (Exception $e) { 

    print "An error occurred: " . $e->getMessage(); 

} 

모든 것이 잘 작동합니다. 문제는 때때로 발생하는 것입니다. { error: { errors: [ { domain: global, reason: backendError, message: Service unavailable. Please try again } ], code: 503, message: Service unavailable. Please try again } }

Google 서버에 요청을 너무 빨리 보내므로 지수 백 오프 솔루션을 구현해야한다는 것을 알고 있습니다. 내 문제는 어떻게 해야할지 모르겠다는 것입니다. 누군가 나를 충분히 PHP 클라이언트 라이브러리를 사용하여 할 수있는 예제를 제공 친절한 것입니까? 장기적으로이 점을 이해할 수 있을지는 모르겠지만 도움을받을 수 있다면 크게 감사하겠습니다.

답변

0

@kyle이 제공 한 정보 덕분에 20 일간의 조사와 조사 끝에이 지수 적 백 오프 솔루션을 생각해 냈습니다. 이것이 올바른 방법인지 확실하지 않지만 지금까지 저에게 큰 도움이되었습니다. 이것은 논리입니다 ...

먼저 다시 시도 할 오류를 정의해야합니다. 서버 오류 (5XX)이있는 경우

$err503ReasonA = "Service unavailable"; // Service unavailable. 
$err503ReasonB = "Backend Error"; //Backend Error 

다음으로는 사용자를 얻을 것이다 마지막으로

try { 

    $usernum = 0; 
    $retrynum = 0; 

    do { 

     if ($pageToken){ 
      $optParams['pageToken'] = $pageToken; 
     }   

     $results = $service->users->listUsers($optParams); 
     $pageToken = $results->getNextPageToken(); 
     $users = $results->getUsers(); 

     foreach ($users as $user) { 

      $usernum++; 

      $csvfileusers = array($user->getPrimaryEmail()); 
      fputcsv($savecsv, $csvfileusers); 

      $usersemails = $user->getPrimaryEmail(); 
      print "<li>".$usernum." - <font color='#9dd7fb'>".$usersemails."</font></li>"; 

     } 

    } while($pageToken); 

} 

파일 CSV에 저장, 나는 지수 백 오프 솔루션을 시도합니다

catch (Exception $e) { 

    $exception = $e->getMessage(); 

    if(strpos($exception, $err503Reason) !== false){ 

     while($exception != null) { //Exp BackOff 
      $retrynum++; 
      $time = $retrynum * 1; //retrynum * seconds 
      sleep($time); 
      if ($retrynum < 4) { 
       try { 

        do { 

         if ($pageToken){ 
         $optParams['pageToken'] = $pageToken; 
         }   

         $results = $service->users->listUsers($optParams); 
         $pageToken = $results->getNextPageToken(); 
         $users = $results->getUsers(); 

         foreach ($users as $user) { 

         $usernum++; 

         $csvfileusers = array($user->getPrimaryEmail()); 
         fputcsv($savecsv, $csvfileusers); 

         $usersemails = $user->getPrimaryEmail(); 
         print "<li>".$usernum." - <font color='#9dd7fb'>".$usersemails."</font></li>"; 

        } 

        } while($pageToken); 

        $exception = null; 
        $retrynum = 0; 

       } catch (Exception $e) { 
        $exception = $e->getMessage(); 
       } 
      } 
     } 
    } 
} 

저는이 솔루션을 2 일 동안 사용해 봤는데 매력적이었습니다. 바라기를 이것은 다른 누군가에게 도움이 될 수 있습니다. 나는 지금 행복해. :)

+0

이 응용 프로그램을 차단합니까? – arecaps

+0

@arecaps 내가 아는 한 멀지 않았다. 또는 "응용 프로그램 차단"이란 정확히 무엇을 의미합니까? – Morfinismo

1

불행히도 설명서는 lacking for the actual backoff implementation입니다. 그러나 Google_Task_Runner 클래스는 백 오프 구현 프로세스에 대해 간략하게 설명합니다. You can see how it does it here.

그러나 실제로 어떤 네트워킹을 기반으로 일반적인 네트워킹 용어로 exponential backoff procedure을 구현하고 싶지는 않습니다. API를 슬램하지 않도록 요청을 막으려 고합니다. $pageToken의 반복 횟수에 따라 다음 반복을 수행하기 전에 sleep을 수행하면됩니다.

또한 한 요청 후에 $pageToken = $results->getNextPageToken();은 무엇이됩니까? 응답을 프로그래밍 방식으로 감소시키지 않고 응답으로 설정하면 무한 루프 또는 그와 같은 성질의 원인이 될 수 있습니다.

+0

대단히 감사드립니다. 나는 이것을 들여다 볼 것입니다. – Morfinismo