2014-05-16 50 views
1

我試圖讓Google的簡單查詢示例(關閉GitHub)工作,不幸的是確實缺乏成功......我得到的是退出代碼255。Google API的問題PHP簡單查詢的例子

我確定問題出在Google服務器的調用中,因此在代碼中添加了一個異常處理程序。該項目現在看起來是這樣的:

<?php 
    /* 
    * Copyright 2013 Google Inc. 
    * 
    * Licensed under the Apache License, Version 2.0 (the "License"); 
    * you may not use this file except in compliance with the License. 
    * You may obtain a copy of the License at 
    * 
    *  http://www.apache.org/licenses/LICENSE-2.0 
    * 
    * Unless required by applicable law or agreed to in writing, software 
    * distributed under the License is distributed on an "AS IS" BASIS, 
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
    * See the License for the specific language governing permissions and 
    * limitations under the License. 
    */ 
    include_once "templates/base.php"; 
    echo pageHeader("Simple API Access"); 

    /************************************************ 
    Make a simple API request using a key. In this 
    example we're not making a request as a 
    specific user, but simply indicating that the 
    request comes from our application, and hence 
    should use our quota, which is higher than the 
    anonymous quota (which is limited per IP). 
    ************************************************/ 
    set_include_path("../src/" . PATH_SEPARATOR . get_include_path()); 
    require_once 'Google/Client.php'; 
    require_once 'Google/Service/Books.php'; 

    /************************************************ 
    We create the client and set the simple API 
    access key. If you comment out the call to 
    setDeveloperKey, the request may still succeed 
    using the anonymous quota. 
    ************************************************/ 
    $client = new Google_Client(); 
    $client->setApplicationName("Client_Library_Examples"); 
    $apiKey = "******************************************"; 
    if ($apiKey == '<YOUR_API_KEY>') { 
     echo missingApiKeyWarning(); 
    } 
    $client->setDeveloperKey($apiKey); 
    $service = new Google_Service_Books($client); 

    /************************************************ 
    We make a call to our service, which will 
    normally map to the structure of the API. 
    In this case $service is Books API, the 
    resource is volumes, and the method is 
    listVolumes. We pass it a required parameters 
    (the query), and an array of named optional 
    parameters. 
    ************************************************/ 
    $optParams = array('filter' => 'free-ebooks'); 


    // next line replaced with an exception handling block 
    // $results = $service->volumes->listVolumes('Henry David Thoreau', $optParams); 

    try{ 
     $results = $service->volumes->listVolumes('Henry David Thoreau', $optParams); 
     var_dump($results); 
    } catch (Exception $e) { 
     echo "call error: " .$e->getMessage()."\n"; 
     echo $e->getTraceAsString()."\n"; 
    } 

    /************************************************ 
    This call returns a list of volumes, so we 
    can iterate over them as normal with any 
    array. 
    Some calls will return a single item which we 
    can immediately use. The individual responses 
    are typed as Google_Service_Books_Volume, but 
    can be treated as an array. 
    ***********************************************/ 
    echo "<h3>Results Of Call:</h3>"; 

    // update to code (off StackOverflow) 

    //foreach ($results as $item) { 
    // echo $item['volumeInfo']['title'], "<br /> \n"; 
    //} 

    foreach($results->getItems() as $item){ 
     echo $item->volumeInfo->getTitle(), "<br /> \n"; 
    } 

    /************************************************ 
    This is an example of deferring a call. 
    ***********************************************/ 
    //$client->setDefer(true); 
    //$optParams = array('filter' => 'free-ebooks'); 
    //$request = $service->volumes->listVolumes('Henry David Thoreau', $optParams); 
    //$results = $client->execute($request); 
    // 
    //echo "<h3>Results Of Deferred Call:</h3>"; 
    //foreach ($results as $item) { 
    // echo $item['volumeInfo']['title'], "<br /> \n"; 
    //} 
    // 
    echo pageFooter(__FILE__); 

的錯誤跟蹤如下:

call error: HTTP Error: Unable to connect: '0' 
#0 C:\srv\GoogleApi\Google\IO\Abstract.php(117): 
    Google_IO_Stream->executeRequest(Object(Google_Http_Request)) 
#1 C:\srv\GoogleApi\Google\Http\REST.php(42): 
    Google_IO_Abstract->makeRequest(Object(Google_Http_Request)) 
#2 C:\srv\GoogleApi\Google\Client.php(499): 
    Google_Http_REST::execute(Object(Google_Client), Object(Google_Http_Request)) 
#3 C:\srv\GoogleApi\Google\Service\Resource.php(195): 
    Google_Client->execute(Object(Google_Http_Request)) 
#4 C:\srv\GoogleApi\Google\Service\Books.php(2304): 
    Google_Service_Resource->call('list', Array, 'Google_Service_...') 
#5 C:\srv\GoogleApi\simple-query.php(60): 
    Google_Service_Books_Volumes_Resource->listVolumes('Henry David Tho...', Array) 
#6 {main} 

<h3>Results Of Call:</h3> 
Process finished with exit code 255 

任何援助將不勝感激。

注意:這可能只是一個身份驗證問題。我是一名無法訪問Google控制檯的遠程工作人員,因此必須依靠發誓提供了正確密鑰的老闆!

回答

0

我實際上是在GitHub上的rowanrh。在上面發帖之後 - 沒有得到任何幫助 - 我決定在GitHub上覆制帖子。

我剛纔通過更改下面的php.ini設置解決了這個問題:

  1. 我設置(通過取消註釋)擴展= p​​hp_openssl.dll - 必要的「https」網址;和
  2. 我設置了時區。谷歌對時代很挑剔,所以這可能會影響結果。

在IDE(我使用PhpStorm)測試後,我重新啓動Apache,一切都很好!

+0

嗨rowanrh,這個問題類似於http://stackoverflow.com/questions/25343617/google-php-api-failed-to-open-stream?我試圖解決這個問題,似乎沒有得到答案。我在Linux服務器上運行它,所以DLL的東西不起作用。我還沒有嘗試設置時區。你會有更多的建議嗎? – ashwinjv

+0

@Ashwin:我不確定這是否有幫助,但它的價值:PHP必須配置爲允許HTTPS(在Windows中,這意味着取消PHP配置中php_openssl擴展的註釋)。如果你有zlib問題,我建議你禁止zlib(在PHP配置中)。通過搜索Google提供的模塊「zlib」 – user173847

+0

,您可以找到對zlib的調用。我試過了,看起來太麻煩了。我轉移到使用python谷歌API並設置我的服務器來這樣做。由於我更喜歡​​python,因此我能夠創建我的請求並獲得我期待的結果。謝謝你的幫助。 – ashwinjv