2009-08-01 93 views
2

嘿,大家好,我正在使用Zend_GData包連接到Google日曆,並執行各種操作,例如添加/編輯/刪除事件。但是,我發現這些操作非常昂貴,有時可能需要4秒才能完成。我想知道是否有任何事情可以優化我的代碼並使其更快?這裏是我的添加功能的一個例子:優化谷歌日曆PHP代碼的速度(Zend_GData)?

function add_gcal($title, $date, $where, $desc){ 

$newIncludePath = array(); 
$newIncludePath[] = '../ZendGdata-1.8.4PL1/library'; 
$newIncludePath = implode($newIncludePath); 
set_include_path($newIncludePath); 

    // load classes 
    require_once 'Zend/Loader.php'; 
    Zend_Loader::loadClass('Zend_Gdata'); 
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin'); 
    Zend_Loader::loadClass('Zend_Gdata_Calendar'); 
    Zend_Loader::loadClass('Zend_Http_Client'); 

    // connect to service 
    $user = "******"; 
    $pass = "******"; 
    $service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME; 
    $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service); 

try { 
    $gdataCal = new Zend_Gdata_Calendar($client); 
    $newEvent = $gdataCal->newEventEntry(); 

    $newEvent->title = $gdataCal->newTitle($title); 
    $newEvent->where = array($gdataCal->newWhere($where)); 
    $newEvent->content = $gdataCal->newContent("$desc"); 

    $when = $gdataCal->newWhen(); 
    $when->startTime = $date; 
    $when->endTime = $date; 
    $newEvent->when = array($when); 

    $createdEvent = $gdataCal->insertEvent($newEvent); 
    return $createdEvent->id->text; 

    } catch (Zend_Gdata_App_Exception $e) { 
     return NULL; 
    } 

} 

有沒有人看到我是否可以做出任何改進?對於每個功能(添加/刪除/編輯),我必須做類似於此,我加載類和連接到服務...

謝謝!

編輯:

我嘗試登錄時,一旦設置$客戶端連接,並存儲$客戶端作爲一個會話變量,我可以再重複使用,每次我需要在日曆上做的操作。這似乎並不工作,我得到以下Zend_GData_App_Exception:

exception 'Zend_Gdata_App_HttpException' with message 'Argument is not an instance of Zend_Http_Client.' 
    in /home/content/*****/html/ZendGdata-1.8.4PL1/library/Zend/Gdata/App.php:247 
Stack trace: 
    #0 /home/content/*****/html/ZendGdata-1.8.4PL1/library/Zend/Gdata/App.php(172): 
     Zend_Gdata_App->setHttpClient(Object(__PHP_Incomplete_Class), 'MyCompany-MyApp...') 
    #1 /home/content/*****/html/ZendGdata-1.8.4PL1/library/Zend/Gdata.php(107): 
     Zend_Gdata_App->__construct(Object(__PHP_Incomplete_Class), 'MyCompany-MyApp...') 
    #2 /home/content/*****/html/ZendGdata-1.8.4PL1/library/Zend/Gdata/Calendar.php(87): 
     Zend_Gdata->__construct(Object(__PHP_Incomplete_Class), 'MyCompany-MyApp...') 
    #3 /home/content/*****/html/scripts/functions.php(85): 
     Zend_Gdata_Calendar->__construct(Object(__PHP_Incomplete_Class)) 
    #4 /home/content/*****/html/calendar/modify_duty.php(68): 
     add_gcal(Object(__PHP_Incomplete_Class), 'R4 - Stephen Au...', '2009-08-19', 'Building: Liva ...', 'Primary') 
    #5 {main} 

我也是用這個嘗試:

// connect to service 
    $user = "******"; 
    $pass = "******"; 
    $service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME; 
    $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service); 

    $client->setConfig(array('keepalive' => true)); 

我這裏得到任何錯誤,但它仍然是緩慢的。我沒有登錄並設置SESSION變量,就像我上面做的那樣,因爲我得到了同樣的錯誤。雖然這沒有錯誤,但在我看來,它仍然會每次都建立一個新的連接......我將如何完全使用它?

回答

0

我能夠存儲以下到一個會話來解決該問題:

$serviceName = Zend_Gdata_Calendar::AUTH_SERVICE_NAME; // predefined service name ('cl') for calendar 
    $applicationName = 'yourCompany-yourAppName-v1'; 

    // Create an authenticated HTTP client 
    $httpClient = Zend_Gdata_ClientLogin::getHttpClient('*****@gmail.com', '*****', $serviceName, null, $applicationName); 
    $client = new Zend_Gdata_Calendar($httpClient, $applicationName); // Create an instance of the Calendar service 

    $_SESSION['gdataCal'] = $client; 

希望這會加快速度!

謝謝大家的幫助。

1

我真的不知道的GData組件,但看你的功能,這裏的一件事:

似乎要創建一個事件的每一次使用Zend_Gdata_ClientLogin::getHttpClient;如果此方法必須連接到Google才能識別您,則可能需要一些時間。
考慮看看這種方法的源代碼(在舊版本的ZF的),現在看來,這的確是做了查詢到谷歌的服務器)

這意味着,創建一個事件,你必須至少給客戶機服務器車次:

  • 一個用戶
  • 一個爲創作活動

這些HTTP請求可能是什麼花費大部分時間在你的應用程序的認證。
所以,這裏是一個想法 - 其目標是儘量減少HTTP請求數:

  • 如果你總是在爲同一個用戶創建的事件,你能不能做到這一點只有一次?並重新使用每個事件的$client對象,而不是重新創建它?
  • 如果您要爲多個用戶創建活動,也許您可​​以按用戶來創建活動,那麼如果用戶有多個要創建的活動,那麼使用相同的$client即可立即創建這些活動?


一件很好的事本來是要插入一些事件,只有一個HTTP請求的能力......但它似乎並不可能:-(


另一個想法,如果有事件的地段打造會使用一些批處理程序:

  • 你的web應用程序不僅會將事件插入服務器本地的數據庫中(不直接發送給Google)=>非常快
  • 你會有另一個腳本,在後臺運行(例如通過cron每隔幾分鐘啓動一次),那會將這些郵件發送給Google(並將它們標記爲「已發送」到您的數據庫中,以便它們不會被髮送兩次或更多)
    • 該腳本甚至可以並行地推出了好幾次,派遣更多的事件來谷歌在相同的時間...

但這是如果不這樣做可能是矯枉過正需要創建一系列的事件...


類的加載並不需要花費太多:與創建事件所需的Google服務器的往返相比,它的實際可以忽略不計。
不過,你可以移動的功能之外require_once來電:它會讓它變得短;-)
你也可以使用Zend框架的自動加載mecanism,所以你千萬不要有寫那些: - )

+0

帕斯卡爾馬丁 - 非常感謝您的幫助。我連接到我的幾個PHP頁面上的Google日曆。是否有可能在整個會話中重複使用同一個$客戶端?例如,最好的方法是在Login上建立連接,然後將該$ client存儲爲SESSION變量? 一個批處理程序會很好,但正如你所說,我沒有很多事件,所以它可能不值得。 我也打算看看Zend自動加載器的require_once調用。謝謝! – littleK 2009-08-01 16:25:20

+1

我很確定,我不知道$ client變量是否可以存儲在會話中;你必須嘗試......(只是發佈你的測試結果;-)它可能會讓其他人感興趣^^) - 好吧,看看http://framework.zend.com/manual/en/zend .gdata.authsub.html:有一個例子,會話令牌存儲在$ _SESSION中;也許這可以幫助你:-) – 2009-08-01 16:41:13

+0

我不認爲我可以做到這一點,看到我上面的編輯。所以,我想我唯一可以考慮的就是保持活力,但在閱讀完後,我不確定是否以及如何使用它 - http://framework.zend.com/manual/en/ zend.http。html – littleK 2009-08-01 17:38:37

1

您可以嘗試在Http_Client內部轉換Keepalive(Gdata位具有傳入自己實例的方法,以便您可以配置自己喜歡的方式),並讓它在多個請求中重複使用同一個方法。

或者修改/用你自己的東西,支持API支持batch-operations更換Zend_Gdata組件: