Вот два метода, которые я пробовал:
Способ 1. Использование пакета AdLdap2
Код: Выделить всё
private function handleAdLdapUsersEx($provider): void
{
try {
$pageSize = 200;
if ($this->searchBase->filter) {
$provider->where($this->searchBase->filter);
}
$pagedUsers = $provider->select('distinguishedname', 'givenname', 'name', 'objectguid', 'samaccountname', 'userprincipalname', 'mail')
->whereEnabled()
->limit($pageSize)
->paginate($pageSize, $this->currentPage);
dump($pagedUsers->count());
if ($pagedUsers->count() > 0) {
collect($pagedUsers->getResults())->chunk(100)->each(function ($chunkedUsers) {
$this->handleBulk($chunkedUsers);
unset($chunkedUsers);
gc_collect_cycles();
});
if ($pagedUsers->count() === $pageSize) {
ImportUsersJob::dispatch($this->searchBase, $this->ldapConnector, $this->ldapConfig, $this->currentPage + 1);
}
}
} catch (\Exception $e) {
dd($e->getMessage());
}
}
Метод 2: использование функций PHP LDAP
Код: Выделить всё
private function handleAdLdapUsers($provider, $ldapConnector): void
{
try {
$usersFetched = 0;
$lastUserEntry = null;
$ldapConnection = ldap_connect($provider->getConnection()->getHost());
ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_bind($ldapConnection, $ldapConnector->getUsernames(), $ldapConnector->getPassword());
$filter = !empty($this->searchBase->filter) ? $this->searchBase->filter : "(objectClass=*)";
$result = @ldap_search($ldapConnection, $provider->getDn(), $filter, [], 0, 1);
$firstEntry = ldap_first_entry($ldapConnection, $result);
while ($firstEntry) {
$attributes = ldap_get_attributes($ldapConnection, $firstEntry);
$users = $provider->select('distinguishedname', 'givenname', 'name', 'objectguid', 'samaccountname', 'userprincipalname', 'mail', 'usncreated')
->whereEnabled()
->get($attributes);
if ($users->count() > 0) {
$this->handleBulk($users);
$usersFetched = $users->count();
} else {
break;
}
$lastUserEntry = ldap_next_entry($ldapConnection, $firstEntry);
$firstEntry = $lastUserEntry;
}
ldap_unbind($ldapConnection);
} catch (\Exception $e) {
dd($e->getMessage());
}
}
- Как я могу изменить свои запросы или разбиение на страницы, чтобы эффективно обрабатывать выборку всех пользователей?
- Существуют ли передовые методы работы с большими наборами данных в Laravel при запросах LDAP?
- Есть ли способ настроить сервер LDAP так, чтобы он позволял получать данные, превышающие предельный размер по умолчанию?
Подробнее здесь: https://stackoverflow.com/questions/791 ... ory-issues
Мобильная версия