PHP LDAP нумерация страниц - PullRequest
1 голос
/ 27 июня 2019

Я создаю PHP-скрипт, который будет включать всех пользователей под конкретным человеком, в основном прямые отчеты, которые могут стать очень большими.

Мне удалось заставить скрипт работать на 1000 записей. Я нашел этот сайт https://doc.bccnsoft.com/docs/php-docs-7-en/function.ldap-control-paged-result.html и поместил его вокруг моего кода. Проблема в том, что я не знаю, как заставить этот скрипт работать для чего-то более 1000 записей. Я хочу, чтобы он возвращал 2000, 5000, 10000 записей, пока он не получит запрошенные данные.

<?php
set_time_limit(60);

$executionStartTime = microtime(true);
//LDAP Directory Services Settings
define("LDAP_SERVER", "test.com");
define("LDAP_DN", "OU=Users,DC=test,DC=com");
define("USER", "test");
define("LDAP_DOMAIN", "@test.com");
define("LDAP_USER", "test");
define("LDAP_PASS", "password");

/* Connect to LDAP Server */
$ds = ldap_connect(LDAP_SERVER);

/* Bind to LDAP Server */
$user_fqdn = LDAP_USER.LDAP_DOMAIN;
$bind = @ldap_bind($ds, $user_fqdn, LDAP_PASS);
//@ldap_bind($ldapconn, $ldapuser."@test.com", $ldappass);

/* Options for searching Whole Domain */
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
//ldap_set_option($ds, LDAP_OPT_SIZELIMIT, 5);

/* Search Filter */ 
$filter = "(&(objectCategory=Person)(sAMAccountName=*)(manager:1.2.840.113556.1.4.1941:=cn=".USER.",OU=Users,DC=test,DC=com))";

$justthese = array('mail', 'employeeType', 'manager');
/* Search */
$pageSize = 1000;

 $cookie = '';
 do {
     ldap_control_paged_result($ds, $pageSize, true, $cookie);

     $result  = ldap_search($ds, LDAP_DN, $filter, $justthese);
     $entries = ldap_get_entries($ds, $result);
     echo "<pre>";
     var_dump($entries);   
    echo "
"; ldap_control_paged_result_response ($ ds, $ result, $ cookie); } while ($ cookie! == null && $ cookie! = ''); $ executeEndTime = microtime (true); $ seconds = $ executeEndTime - $ executeStartTime; //Распечатай echo "Этот скрипт взял". $ секунд. " выполнить."; ?>

По сути, я хочу, чтобы это выполнялось на задании cron и просто получало все записи из ldap и сбрасывало их в базу данных (я еще не дошел до части db). Не только 1000 записей.

1 Ответ

1 голос
/ 27 июня 2019

Вам необходимо установить версию протокола перед привязкой, особенно с AD:

$ds = ldap_connect(LDAP_SERVER);
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

$user_fqdn = LDAP_USER.LDAP_DOMAIN;
$bind = @ldap_bind($ds, $user_fqdn, LDAP_PASS);

Ваш код выглядит нормально в цикле do / while.

...