PHP-将MySQL联系人与Exchange同步

PHP-将MySQL联系人与Exchange同步,php,mysql,exchange-server,sync,Php,Mysql,Exchange Server,Sync,作为PHPWebapp的一部分,我有MySQL联系人表。它集成在整个应用程序中,允许您添加联系人、编辑联系人或添加联系人作为与其他表的关系。然而,目前它是独立的。该公司希望它与Exchange同步,这样添加到Exchange的联系人将显示在webapp上,而添加到webapp上的联系人将通过Exchange显示 所以我有两个问题:1)与Exchange通信2)与Exchange同步 就基本通信而言,这个库似乎能够管理它。但是,我完全不知道如何管理同步,不知道从哪里开始。同步项目的内置方式是通过名

作为PHPWebapp的一部分,我有MySQL联系人表。它集成在整个应用程序中,允许您添加联系人、编辑联系人或添加联系人作为与其他表的关系。然而,目前它是独立的。该公司希望它与Exchange同步,这样添加到Exchange的联系人将显示在webapp上,而添加到webapp上的联系人将通过Exchange显示

所以我有两个问题:1)与Exchange通信2)与Exchange同步


就基本通信而言,这个库似乎能够管理它。但是,我完全不知道如何管理同步,不知道从哪里开始。

同步项目的内置方式是通过名为
SyncFolderItems
的函数。基本上,交换所有内容(包括联系人)都是一个文件夹,因此您只需在同步请求中将
联系人
作为
DiscriminatedFolderId
传递即可

同步的工作原理是,以最多512个元素的批次加载给定帐户的所有项目,并且在每个批次之后,它将为您提供
SyncState
,作为Exchange了解您的中断位置的参考点。因此,它使您能够进行增量同步

当然,这是一种方式,意思是交换->数据库。另一种方式是,您应该执行原子更新/请求-当您更改/添加/删除数据库中的项目时,您应该向Exchange server发出足够的请求以保持数据同步,否则它将在下一个
SyncFolderItems
中被覆盖

你可以阅读更多关于

如果你想看看
SyncFolderItems
的例子,你可以看看@,它是最近添加的。虽然是python,但您仍然可以了解如何构造请求/句柄响应的基本概念


希望这有帮助:)

同步项目的内置方式是通过名为
SyncFolderItems
的函数。基本上,交换所有内容(包括联系人)都是一个文件夹,因此您只需在同步请求中将
联系人
作为
DiscriminatedFolderId
传递即可

同步的工作原理是,以最多512个元素的批次加载给定帐户的所有项目,并且在每个批次之后,它将为您提供
SyncState
,作为Exchange了解您的中断位置的参考点。因此,它使您能够进行增量同步

当然,这是一种方式,意思是交换->数据库。另一种方式是,您应该执行原子更新/请求-当您更改/添加/删除数据库中的项目时,您应该向Exchange server发出足够的请求以保持数据同步,否则它将在下一个
SyncFolderItems
中被覆盖

你可以阅读更多关于

如果你想看看
SyncFolderItems
的例子,你可以看看@,它是最近添加的。虽然是python,但您仍然可以了解如何构造请求/句柄响应的基本概念


希望这有帮助:)

我知道这个话题已经很老了。但是,为了将来参考,请在下面找到一个解决方案。它正在使用上述php ews库

我还刚刚在官方php ews wiki中添加了以下内容:


我知道这个话题已经很老了。但是,为了将来参考,请在下面找到一个解决方案。它正在使用上述php ews库

我还刚刚在官方php ews wiki中添加了以下内容:

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