遇到Zend的问题,因为它抛出错误。我相信它是由于主机名中的下划线,因为Zend对URL进行了一些验证。
我有一个Python客户端,它具有相同的基本功能,并且按预期工作。
想知道PHP是否有解决方法
错误:
Fatal error: Uncaught exception 'Zend_Uri_Exception' with message 'Invalid URI supplied' in /usr/share/php/libzend-framework-php/Zend/Uri/Http.php:156
Stack trace:
#0 /usr/share/php/libzend-framework-php/Zend/Uri.php(143): Zend_Uri_Http->__construct('http', '//local_server_f...')
#1 /usr/share/php/libzend-framework-php/Zend/Http/Client.php(270): Zend_Uri::factory('http://local_ser...')
#2 /usr/share/php/libzend-framework-php/Zend/XmlRpc/Client.php(266): Zend_Http_Client->setUri('http://local_ser...')
#3 /usr/share/php/libzend-framework-php/Zend/XmlRpc/Client.php(361): Zend_XmlRpc_Client->doRequest(Object(Zend_XmlRpc_Request))
#4 /usr/share/php/libzend-framework-php/Zend/XmlRpc/Client/ServerProxy.php(93): Zend_XmlRpc_Client->call('system.multical...', Array)
#5 [internal function]: Zend_XmlRpc_Client_ServerProxy->__call('multicall', Array)
#6 /path/to/xmlrpc.client.php(21): Zend_XmlRpc_Client_ServerProxy->multicall(Array)
#7 {main}
thrown in /usr/share/php/libzend-framework-php/Zend/Uri/Http.php on line 156
PHP:
ini_set("include_path", "/usr/share/php/libzend-framework-php");
require_once('Zend/XmlRpc/Client.php');
$server = new Zend_XmlRpc_Client('http://local_server_foo/xmlrpc.server.php');
// Get the HTTP Client used by the XMLRPC client and Increase the HTTP timeout
$server->getHttpClient()->setConfig(array('timeout'=>30));
$client = $server->getProxy();
$request = array(
array(
'methodName' => 'system.listMethods',
'params' => array()
)
);
try {
$response = $client->system->multicall($request);
echo print_r($response,true);
} catch (Zend_XmlRpc_Client_HttpException $e) {
echo 'HTTP Exception: '."\n";
echo $e->getCode();
echo $e->getMessage();
} catch (Zend_XmlRpc_Client_FaultException $e) {
echo 'Fault Exception: '."\n";
echo $e->getCode();
echo $e->getMessage();
}
Python(这可行):
#!/usr/bin/python
import xmlrpclib
servAddr = "http://local_server_foo/xmlrpc.server.php"
client = xmlrpclib.ServerProxy(servAddr)
print
methods = client.system.listMethods()
for m in methods:
print m + "\tHelp Documentation: " + client.system.methodHelp(m)
print
答案 0 :(得分:1)
我刚刚检查了1.11.9版,但没有人抱怨过;也许我应该最终提交错误报告。我自己修复/更新缺少下划线的Zend_Validate_Hostname类,如下所示。它位于isValid()
方法中,具体取决于您在第621行(1.11.2)到655(1.11.9)的版本。
旧行:
$regexLocal = '/^(([a-zA-Z0-9\x2d]{1,63}\x2e)*[a-zA-Z0-9\x2d]{1,63}){1,254}$/';
$status = @preg_match($regexLocal, $value);
新行:请注意更改x5f
$regexLocal = '/^(([a-zA-Z0-9\x2d\x5f]{1,63}\x2e)*[a-zA-Z0-9\x2d]{1,63}){1,254}$/';
$status = @preg_match($regexLocal, $value);
UDPATE 让我们改进一下:
正如@Just H在他的回答中指出的那样,不允许使用下划线,但它们仍然被广泛使用。让我们把这归咎于IBM及后来的微软使用NetBIOS,为什么下划线(尽管不被允许)在本地主机名中被“使用”。
作为一名前服务器工程师,我在大公司看到过很多内部网,他们都在主机名中大量使用下划线。 OS / 2和Windows管理员在DNS命名方案中不知不觉地使用了它们。这就是所有浏览器都支持它的原因,所有的Web服务器都支持它。
答案 1 :(得分:1)
来自http://en.wikipedia.org/wiki/Hostname(链接到相关RFC):
协议授权的互联网标准(征求意见) 组件主机名标签可能只包含ASCII字母'a' 通过'z'(以不区分大小写的方式),数字'0'到 '9'和连字符(' - ')。主机名的原始规范 RFC 952,要求标签不能以数字或带数字开头 连字符,不得以连字符结尾。但是,随后 规范(RFC 1123)允许主机名标签开头 数字。没有其他符号,标点字符或空格 允许的。
虽然主机名可能不包含其他字符,例如 下划线字符(_),其他DNS名称可能包含 下划线。[3] DomainKeys和服务记录等系统使用 强调作为一种手段,以确保他们的特殊性质不是 与主机名混淆。例如,_http._sctp.www.example.com 指定支持SCTP的Web服务器主机的服务指针(www) 在域example.com中。
主机名中有下划线无效,Zend Framework验证器工作正常。