2012-04-25 95 views
1

作爲PHP webapp的一部分,我擁有MySQL聯繫人表。它集成在整個應用程序中,允許您添加聯繫人,編輯聯繫人或將聯繫人添加爲另一個表的關係。但是,目前它是獨立的。該公司希望它與Exchange同步,以便添加到Exchange的聯繫人將顯示在Web應用程序中,並且添加到Web應用程序上的聯繫人將通過Exchange顯示出來。PHP - 將MySQL聯繫人與Exchange同步

所以我有兩個問題:1)與Exchange 2進行通信)與Exchange同步。

就基本溝通而言,它看起來像這個庫將能夠管理它https://github.com/jamesiarmes/php-ews。但是,我很失望如何管理同步,不知從哪裏開始。

回答

3

同步項目的內置方式是通過名爲SyncFolderItems的函數。基本上交換一切,包括聯繫人是一個文件夾,所以你只需在你的同步請求中通過CONTACTS作爲DistinguishedFolderId

該同步通過爲批量最多512個元素的給定帳戶分配所有項目,並且在每個批次之後,它爲您提供SyncState作爲Exchange的參考點以瞭解您離開的位置。所以它可以讓你做增量同步。

現在,這是一種方式,當然意味着交換 - >你的數據庫。另一種方式,你應該預先形成原子更新/請求 - 從數據庫更改/添加/刪除項目的時刻你應該向Exchange服務器發出足夠的請求以保持數據同步,選擇它將被覆蓋在你的下一個SyncFolderItems

您可以更閱讀了關於SyncFolderItems @ MSDN

如果你想看到的例子SyncFolderItems你可以看看@python version of EWSWrapper,它已經在最近增加。儘管它是python,但您仍然可以獲得如何構建請求/處理響應的基本概念。

希望這有助於:)

2

我知道這個話題是相當古老的。但是,爲了將來參考,請在下面找到解決方案它使用上述庫php-ews。

我也剛剛加入這個官方的php-EWS維基:https://github.com/jamesiarmes/php-ews/wiki/Calendar:-Synchronization

// Define EWS 
$ews = new ExchangeWebServices($host, $username, $password, $version); 

// fill with string from last sync 
$sync_state = null; 

$request = new EWSType_SyncFolderItemsType; 
$request->SyncState = $sync_state; 
$request->MaxChangesReturned = 512; 
$request->ItemShape = new EWSType_ItemResponseShapeType; 
$request->ItemShape->BaseShape = EWSType_DefaultShapeNamesType::ALL_PROPERTIES; 

$request->SyncFolderId = new EWSType_NonEmptyArrayOfBaseFolderIdsType; 
$request->SyncFolderId->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType; 
$request->SyncFolderId->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::CALENDAR; 

$response = $ews->SyncFolderItems($request); 

$sync_state = $response->ResponseMessages->SyncFolderItemsResponseMessage->SyncState; 
$changes = $response->ResponseMessages->SyncFolderItemsResponseMessage->Changes; 

// created events 
if(property_exists($changes, 'Create')) { 
    foreach($changes->Create as $event) { 
     $id = $event->CalendarItem->ItemId->Id; 
     $change_key = $event->CalendarItem->ItemId->ChangeKey; 
     $start = $event->CalendarItem->Start; 
     $end = $event->CalendarItem->End; 
     $subject = $event->CalendarItem->Subject; 
    } 
} 

// updated events 
if(property_exists($changes, 'Update')) { 
    foreach($changes->Update as $event) { 
     $id = $event->CalendarItem->ItemId->Id; 
     $change_key = $event->CalendarItem->ItemId->ChangeKey; 
     $start = $event->CalendarItem->Start; 
     $end = $event->CalendarItem->End; 
     $subject = $event->CalendarItem->Subject; 
    } 
} 

// deleted events 
if(property_exists($changes, 'Delete')) { 
    foreach($changes->Delete as $event) { 
     $id = $event->CalendarItem->ItemId->Id; 
     $change_key = $event->CalendarItem->ItemId->ChangeKey; 
     $start = $event->CalendarItem->Start; 
     $end = $event->CalendarItem->End; 
     $subject = $event->CalendarItem->Subject; 
    } 
}