好的,我已经在这几天挣扎了。
我的内部网络上的本地计算机上安装了Joomla,也安装了Jomsocial。
问题是,当我进入站点配置或编辑事件或导航到任何调用外部api的joomla模块时,我得到
CURL error : 7 Failed to connect to maps.google.com port 80: Connection timed out
或
Connection timed out (110)
问题是定义不是Joomla或Jomsocial我在同一台服务器上运行的其他php应用程序也无法联系外部api的
服务器设置
Ubuntu 14Lts PHP 5.5 Apache 2.4.7 MariaDB的
服务器位于代理服务器后面,但是可以从CLI获得完全的Internet访问权限。启用所有必要的php扩展。我在apt / config中也在/ etc / environment中设置了全局代理变量,并在Joomla中设置了代理变量。我的Joomla更新和组件更新工作正常,但fsockopen函数的卷曲不起作用。
我不知道在哪里寻找错误。我的想法是www-data用户可能没有足够的权限从浏览器执行fsockopen和curl。
有什么建议吗?
更新,我已在另一台不在公司网络(直接连接到互联网)的机器上测试了该网站,一切正常。所以我很确定我的问题出在我的机器和网络权限上,特别是我的www-data用户。我该如何解决这个问题?
答案 0 :(得分:1)
即使http_proxy
用于传递它,或者直接使用PassEnv
设置,PHP(mod_php)似乎也没有使用SetEnv
变量。此外,在PHP脚本中调用getenv('http_proxy')
时,它会正确显示。
但是,有两种方法可以让它发挥作用:
在Apache envvars(/etc/apache2/envvars
)中设置如下:
export http_proxy=http://proxy.example.com:8080/
并重启Apache。
放入加载应用程序的PHP文件(例如index.php,bootstrap.php等):
putenv('http_proxy=http://proxy.example.com:8080/');
同样,如果您使用getenv('http_proxy')
进行测试,您会看到它们设置正确。
答案 1 :(得分:1)
我在一个非常接近的设置中遇到了同样的问题(唯一的区别是mysql而不是MariaDb和Joomla 3.4.1)并且我花了很长时间才把所有东西放在一起,所以我会把这里可能存在绊脚石的列表:
确保已安装 php5-curl 。 Joomla只能将CURL用作传输层。
sudo apt-get install php5-curl
我发现在Joomla配置中输入代理没什么用。它唯一的好处是更新连接不会超时但立即返回。
将环境变量放在/ etc / apache2 / envvars中是不够的,还需要使用" PassEnv"在/etc/apache2/apache2.conf中, 即(摘自https://stackoverflow.com/a/21571588/1967646)
PassEnv http_proxy
此外,我需要传递 HTTP_PROXY , HTTPS_PROXY ,因为xml-lists是通过http获取的,而文件是通过https获取的(可能是从github更新文件) 。可能,您需要将这些变量设置为小写,但需要在joomla配置页面" PHP信息"类似命名的变量以大写形式显示。
我不知道这在哪里确实有所不同,但重启apache2如下似乎是正确的方法(而不是apache2ctl)。
sudo service apache2 restart
我整理了一些偶然的代码,用于测试curl和php是否可以一起工作,大部分来自https://stackoverflow.com/a/1477710/1967646。我只添加了大量的错误报告。在web文件夹的根目录中放入 test.php 文件,然后使用您喜欢的浏览器查看。
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);
$url = 'http://update.joomla.org/core/list.xml';
function get_page($url, $proxy=true) {
if ($url!='') {
$ch = curl_init ();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
if ($proxy) {
curl_setopt($ch, CURLOPT_PROXY, '<enter your proxy host here>');
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt($ch, CURLOPT_PROXYPORT, <enter your proxy port here>);
}
if (! $html = curl_exec($ch)) {
echo '<br>Last CURL error is '.curl_error($ch).'<br>';
} else {
echo '<br>CURL without error.<br>';
}
curl_close($ch);
return $html;
} else {
echo 'Empty URL.';
}
}
echo 'Hello, getting pages via curl:';
$html=get_page($url);
var_dump($html);
echo bin2hex($html);
echo '<br>';
var_dump(get_page($url, false));
echo '<br>done.<br>';
?>
答案 2 :(得分:0)
使用此:
man curl:
或者这个:
来自-x, --proxy <[protocol://][user:password@]proxyhost[:port]>
Use the specified HTTP proxy.
If the port number is not specified, it is assumed at port 1080.
<div>
<input ng-model="serverip">
<input type="button" class="button" value="Apply" ng-click="save()">
</div>