PHP Conference Japan 2024

ldap_set_option

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ldap_set_option设置指定选项的值

说明

ldap_set_option(?LDAP\Connection $ldap, int $option, array|string|int|bool $value): bool

设置指定选项 option 的值为 value

参数

ldap

可以是 ldap_connect() 返回的 LDAP\Connection 实例(用于设置该连接的选项),也可以是 **`null`**(用于设置全局选项)。

option

参数 option 可以是下列之一:

选项 类型 可用版本
LDAP_OPT_DEREF int  
LDAP_OPT_SIZELIMIT int  
LDAP_OPT_TIMELIMIT int  
LDAP_OPT_NETWORK_TIMEOUT int  
LDAP_OPT_PROTOCOL_VERSION int  
LDAP_OPT_ERROR_NUMBER int  
LDAP_OPT_REFERRALS bool  
LDAP_OPT_RESTART bool  
LDAP_OPT_HOST_NAME string  
LDAP_OPT_ERROR_STRING string  
LDAP_OPT_DIAGNOSTIC_MESSAGE string  
LDAP_OPT_MATCHED_DN string  
LDAP_OPT_SERVER_CONTROLS array  
LDAP_OPT_CLIENT_CONTROLS array  
LDAP_OPT_X_KEEPALIVE_IDLE int PHP 7.1.0
LDAP_OPT_X_KEEPALIVE_PROBES int PHP 7.1.0
LDAP_OPT_X_KEEPALIVE_INTERVAL int PHP 7.1.0
LDAP_OPT_X_TLS_CACERTDIR string PHP 7.1.0
LDAP_OPT_X_TLS_CACERTFILE string PHP 7.1.0
LDAP_OPT_X_TLS_CERTFILE string PHP 7.1.0
LDAP_OPT_X_TLS_CIPHER_SUITE string PHP 7.1.0
LDAP_OPT_X_TLS_CRLCHECK int PHP 7.1.0
LDAP_OPT_X_TLS_CRLFILE string PHP 7.1.0
LDAP_OPT_X_TLS_DHFILE string PHP 7.1.0
LDAP_OPT_X_TLS_KEYFILE string PHP 7.1.0
LDAP_OPT_X_TLS_PROTOCOL_MIN int PHP 7.1.0
LDAP_OPT_X_TLS_RANDOM_FILE string PHP 7.1.0
LDAP_OPT_X_TLS_REQUIRE_CERT int PHP 7.0.5

**LDAP_OPT_SERVER_CONTROLS** 和 **LDAP_OPT_CLIENT_CONTROLS** 需要一个控制列表,这意味着该值必须是一个控制数组。一个控制由一个标识控制的 oid、一个可选的 value 和一个可选的 criticality 标志组成。在 PHP 中,一个控制由一个包含键为 oid 值为字符串的元素和两个可选元素组成的数组表示。可选元素是键为 value 值为字符串和键为 iscritical 值为布尔值的元素。如果未提供,iscritical 默认为 **`false`**。有关详细信息,请参阅 » draft-ietf-ldapext-ldap-c-api-xx.txt。另请参阅下面的第二个示例。

value

指定 option 的新值。

返回值

成功时返回 **`true`**,失败时返回 **`false`**。

更新日志

版本 说明
8.1.0 现在 ldap 参数需要一个 LDAP\Connection 实例;之前,需要一个有效的 ldap link 资源

范例

示例 #1 设置协议版本

<?php
// $ds 是一个有效的目录服务器 LDAP\Connection 实例
if (ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) {
echo
"使用 LDAPv3";
} else {
echo
"无法将协议版本设置为 3";
}
?>

示例 #2 设置服务器控制

<?php
// $ds 是一个有效的目录服务器 LDAP\Connection 实例
// 没有值的控制
$ctrl1 = array("oid" => "1.2.752.58.10.1", "iscritical" => true);
// iscritical 默认为 FALSE
$ctrl2 = array("oid" => "1.2.752.58.1.10", "value" => "magic");
// 尝试设置两个控制
if (!ldap_set_option($ds, LDAP_OPT_SERVER_CONTROLS, array($ctrl1, $ctrl2))) {
echo
"无法设置服务器控制";
}
?>

注释

注意:

此函数仅在使用 OpenLDAP 2.x.x 或 Netscape Directory SDK x.x 时可用。

参见

添加注释

用户贡献的注释 8 条

up
8
soulbros 在 yahoo dot com
22 年前
正如上面的 [email protected] 所提到的,必须设置选项 LDAP_OPT_PROTOCOL_VERSION=3
ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION,3);
才能使用 ldap_rename 函数。

但是,ldap_set_option() 行必须紧跟在 ldap_connect() 之后和 ldap_bind() 语句之前。

Christos Soulios
up
6
hansfn 在 gmail dot com
18 年前
幸运的是,你可以在打开连接之前启用调试

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

这样你至少可以在日志中看到连接是否失败...
up
2
php 在 richardneill dot org
2 年前
如果要禁用 TLS 证书检查(例如,因为你正在进行 SSH 端口转发,并且 ldaps 指向 localhost),则必须调用

ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT,0)
*在* 调用 ldap_connect() *之前*

如果你尝试

$ds = ldap_connect(...)
ldap_set_option($ds, LDAP_OPT_X_TLS_REQUIRE_CERT,0)

则该选项实际上不会生效,并且仍然会检查证书,并且会发生 TLS 失败..
up
2
technosophos
17 年前
以下标志是 LDAP_OPT_DEREF 的有效整数值(取自 ldap_read() 的文档)

LDAP_DEREF_NEVER (int 0) - (默认)从不解引用别名。

LDAP_DEREF_SEARCHING (int 1) - 搜索期间应解析别名,但在定位搜索的基本对象时不应解析。

LDAP_DEREF_FINDING (int 2) - 定位基本对象时应解析别名,但在搜索期间不应解析。

LDAP_DEREF_ALWAYS (int 3) - 应始终解析别名。

示例
<?php
ldap_set_option
($ds, LDAP_OPT_DEREF, LDAP_DEREF_ALWAYS);
?>

这些定义在 C API 草案中(大概源自原始 LDAP API)。请参阅 OpenLDAP 源代码分发中包含的 draft-ietf-ldapext-ldap-c-api-xx.txt。
up
0
Maarten at Aerobe
4 年前
PHP 7.1 增加了直接配置 LDAP CA/证书环境的支持,而不是依赖环境变量。我注意到很多人在使用此功能时遇到问题。

正确的方法是
$ds=ldap_connect("ldap.google.com");
ldap_set_option(NULL, LDAP_OPT_X_TLS_CERTFILE, "/path/file.crt");
ldap_set_option(NULL, LDAP_OPT_X_TLS_KEYFILE, "/path/file.key");
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
ldap_start_tls($ds);
...
ldap_close($ds);
up
0
badbo_5834 at hotmail dot com
10 年前
我有以下代码,但是 cn 没有重命名,这是为什么呢?

$TheDN = "cn=Nombre,ou=Addressbook,dc=axia-ldap,dc=net";
$newRDN = "cn=bill";
$newParent = "ou=Addressbook,dc=axia-ldap,dc=net";
ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION,3);
$result = ldap_rename($ds, $TheDN, $newRDN, $newParent, TRUE);
up
0
john dot hallam at compaq dot com
22 年前
为了使其正常工作,我必须使用 ldap_set_option 将 LDAP 版本设置为 3。这里有一个可能有帮助的示例

$TheDN = "cn=john smith,ou=users,dc=acme,dc=com";
$newRDN = "cn=bill brown";
$newParent = "ou=users,dc=acme,dc=com";
ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION,3);
@$result = ldap_rename($ds, $TheDN, $newRDN, $newParent, TRUE);
up
-2
minusf at gmail dot com
19 年前
看起来对于无效的 ldap_connect 连接,ldap_set_option 也会返回 1。
ldap_connect 总是返回一个资源(在 ldap_connect 的注释中有说明),因此无法检查 LDAP 服务器是否存在或存活。
并且由于 ldap_set_option 必须在 ldap_connect 和 ldap_bind 之间,因此检查返回值似乎没有意义。
有点奇怪的是,ldap_bind 是第一个可以真正检查 LDAP 资源是否可用的函数,因为它是使用 openldap 时使用的第三个函数。
因为 ldap_set_option 必须在 ldap_connect 和 ldap_bind 之间,因此检查返回值似乎没有意义。
有点奇怪的是,ldap_bind 是第一个可以真正检查 LDAP 资源是否可用的函数,因为它是使用 openldap 时使用的第三个函数。

有点奇怪的是,ldap_bind 是第一个可以真正检查 LDAP 资源是否可用的函数,因为它是使用 openldap 时使用的第三个函数。
有点奇怪的是,ldap_bind 是第一个可以真正检查 LDAP 资源是否可用的函数,因为它是使用 openldap 时使用的第三个函数。
有点奇怪的是,ldap_bind 是第一个可以真正检查 LDAP 资源是否可用的函数,因为它是使用 openldap 时使用的第三个函数。

<?php
$connect
= ldap_connect("whatever");
$set = ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
echo
$set;
?>
To Top