作为一个PHP Web应用程序的一部分,我有MySQL的联系人表。 它是整个应用程序集成,使您添加联系人,编辑联系人或添加联系人作为关系到另一个表。 但是,目前它是自包含的。 该公司希望它与Exchange同步,以便加入到交换联系人将显示在web应用程序和web应用程序添加的联系人将显示通过Exchange。
所以,我有两个问题:1)与Exchange 2通信)与Exchange同步。
至于基本的沟通得好,它看起来像这个库将能够管理它https://github.com/jamesiarmes/php-ews 。 不过,我完全迷失了方向,以如何管理同步,不从哪里开始。
在内置的方式来同步项目是通过函数调用SyncFolderItems
。 基本上到Exchange的一切,包括联系人是一个文件夹,所以你只是通过CONTACTS
为DistinguishedFolderId
在同步请求。
同步的工作原理是在donloading最大512元的批次定帐户中的所有项目和每一批之后它给你SyncState
作为refernce点兑换知道你离开的地方。 所以,它给你做增量同步的能力。
现在,这当然是一种方式,这意味着外汇 - >您的DB。 另一种方法是aeound你应该瓶坯原子更新/请求-更改/添加/删除项目形成你的数据库的那一刻,你应该发出足够的请求,Exchange服务器,以保持数据同步,elese它会在你的下一个被覆盖SyncFolderItems
。
你可以更多阅读了关于SyncFolderItems
@ MSDN
如果你想看到的例子SyncFolderItems
你可以看看@ EWSWrapper的Python版本 ,它已经在最近增加。 虽然这是蟒蛇,你仍然可以得到基本的想法如何构建请求/响应处理。
希望这可以帮助 :)
我知道这个话题很老。 然而,以供将来参考下面找到一个解决方案。 它使用上述库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;
}
}