Hız (Zend_GData) için Google Takvim PHP Kodu optimize?

3 Cevap php

Herkes Hey, ben bir Google Takvim bağlanmak ve ekleme / düzenleme / silme olayları gibi çeşitli şeyler yapmak için Zend_GData Paketi kullanıyorum. Ancak, bu oldukça pahalı operasyonlar olduğunu bulmak ve bazen tamamlamak için görünür bir 4 saniye sürebilir. Ben kodu optimize etmek ve daha hızlı hale getirmek için yapabileceği bir şey olup olmadığını merak ediyorum? İşte benim eklenti fonksiyonun bir örneğidir:

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;
  }

}

Ben herhangi bir iyileştirme yapabilirsiniz eğer herkes görüyor mu? Her bir fonksiyon için (/ düzenlemek ekleme / silme), ben sınıfları yüklemek ve servise bağlanmak buna benzer bir şey, yapmak zorunda ...

Teşekkürler!

EDIT:

Ben bir kez giriş üzerine $ istemci bağlantı ayarı, ve sonra ben takvimde bir işlem yapmak için gereken her zaman re-ebil kullanma a OTURUM değişken olarak $ müşteri saklamak çalıştı. Bu benim şu Zend_GData_App_Exception almak, çalışmak için görünmüyor:

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}

Ben de bu kullanarak çalıştı:

  // 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));

Ben burada hataları olsun, ama hala yavaş. Ben giriş üzerine bu yapıyor ve ben yukarıda yaptığım gibi aynı hata var gibi, bir OTURUM değişken ayarlama değilim. Bu hiçbir hatayı alırken hala yeni bir bağlantı her zaman yapmak gibi, nasıl ben tam olarak kullanmak istiyorsunuz ... Bana öyle geliyor?

3 Cevap

Ben bir OTURUM içine aşağıdakileri saklayarak sorunu düzeltmek mümkün oldu:

    $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;

Umarım bu hızlandırmak olacak!

Yardım Herşey için teşekkürler.

Gerçekten GData bileşenleri biliyorum, ama işlevi bakarak, burada bir şey yok:

It seems you are using Zend_Gdata_ClientLogin::getHttpClient each time you are creating an event ; if this method has to connect to Google to identify you, it might take some time.
Taking a look at the source of this method (in an old version of ZF), it seems it indeed does a query to google's server)

Bu bir olay yaratmak için, gelir, sahip en az bir istemci-sunucu gezileri için:

  • kullanıcı için, bir kimlik doğrulama
  • Etkinliğin oluşturulması için, bir

Those HTTP requests are probably what's taking the most time in your application.
So, here's an idea -- the goal being to minimize the number of HTTP requests :

  • Eğer hep aynı kullanıcı için etkinlikler oluşturma iseniz, sadece bir kez bu yapamadı? Ve bunun yerine yeniden yaratma, her olay için $client nesnesini yeniden kullanabilir?
  • Eğer birden fazla kullanıcı için olayları yaratan varsa, belki kullanıcı tarafından kullanıcı yapabilirsiniz, böylece bir kullanıcı oluşturmak için çeşitli etkinlikler varsa, bu aynı $client kullanarak, anında birbiri ardına oluşturulur?


A nice thing would have been the ability to insert several events with only one HTTP request... But it doesn't seem to be possible :-(


Another idea, if you have LOTS of events to create would be to use some batch program :

  • Web uygulama sadece gerçekten hızlı> = sunucuya yerel bir DB (Google'a doğrudan gönderebilirsiniz değil) olayları eklersiniz
  • You'd have another script, that runs in the background (launched every couple of minutes via cron, for instance), that would send those to Google (and mark them as "sent" in your DB so they're not sent twice or more)
    • Bu komut dosyası bile zaman aynı miktarda Google'a daha fazla etkinlik göndermek, paralel birkaç kez başlatılan olabilir ...

Eğer, literraly, olayların ton oluşturmak gerekmez ama eğer bu muhtemelen overkill ...


The loading of the classes doesn't cost much : it is really negligible compared to the round-trip to Google's server you need to have to create the event.
Still, you could move the require_once calls outside of the function : it'd make it shorter ;-)
You could also use Zend Framework's autoloading mecanism, so you don't ever have to write those :-)

Sen (Gdata bit sizin gibi nasıl yapılandırabilirsiniz, böylece kendi örneğinde geçen bir yöntem var) ve çoklu istekleri için aynı birini yeniden sahip Http_Client içeride keepalive'ı dönüm deneyebilirsiniz.

Veya, değiştirmek / batch-operations API destekleri kendi şey Zend_Gdata bileşenlerini değiştirmek: