【发布时间】:2014-11-29 07:14:05
【问题描述】:
我正在为 Joomla 编写一个身份验证插件。 该插件正在调用外部站点来验证用户名和密码。
代码有效,但我的问题是当我从 Joomla 插件调用 fopen() 时,它需要很长时间(63 秒)才能响应。
在服务器上运行相同的代码(但不是通过 Joomla)时,fopen() 调用只需要 0.1 秒。
Joomla 是否可以更改任何设置,导致 fopen() 调用需要这么长时间?或者我应该使用其他函数来代替 fopen() 吗? (我试过 file_get_contents() 但结果相同)
下面是我正在使用的代码(基于这篇文章:http://wezfurlong.org/blog/2006/nov/http-post-from-php-without-curl/)(我没有安装 cURL,所以这不是一个选项。)
$username = "admin";
$password = "1234" ;
$verb = 'GET'
$url = "https://xxx.xxx.xxx/api.phtml/login" ;
$params = array("username"=>$username, "password"=>$password);
$params = http_build_query($params);
$url .= '?' . $params;
$cparams = array( 'http' => array( 'method' => $verb,
'ignore_errors' => true ) );
$context = stream_context_create($cparams);
$fp = fopen($url, 'rb', false, $context);
allow_url_fopen 已启用。
Joomla!版本:Joomla! 2.5.27 稳定
PHP版本:5.2.6-1+lenny10
我已经为此苦苦挣扎了三天,所以非常感谢任何帮助!
谢谢!
【问题讨论】:
-
避免将密码作为获取参数(在 url 中)传递,这完全不安全。而且我认为服务器需要时间来响应。浏览器加载 joomla 站点需要多长时间?
-
如果我禁用我的插件,当我点击登录时页面需要 1,16s 加载,如果我启用我的插件,页面需要 1m 4s 加载。我确实在 fopen() 调用之前和之后输入了
$time = microtime(true);,这就是我想出 63 秒的方法。关于在URL中传递密码,我认为使用https时安全吗? -
你能在webpagetest.org 上为xxx.xxx.xxx/api.phtml/login 运行测试吗?最近是否为此更改了 DNS?可以尝试 curl 而不是 fopen 并尝试不同的托管公司。
-
感谢关于webpagetest.org 的提示!以前从未听说过。该页面的结果是“文档在 0.6 秒内加载”。关于 DNS,我尝试过使用 IP 号码,但仍然得到相同的结果。如果我在“外部”Joomla 上使用我的代码,并且在同一台服务器上,它可以完美运行,但是当我将代码作为插件运行时,加载需要 63 秒。我的插件基于此代码:Creating an Authentication Plugin for Joomla。非常感谢您尝试帮助我!
标签: php rest joomla fopen joomla-extensions