无法打开 geoip.dat 文件。即使文件存在,“无法打开流”
Posted
技术标签:
【中文标题】无法打开 geoip.dat 文件。即使文件存在,“无法打开流”【英文标题】:Can't open geoip.dat file. 'Failed to open stream' even though file exists 【发布时间】:2014-07-18 14:05:54 【问题描述】:我无法理解为什么我被告知文件不存在,什么时候存在。
我的 wordpress 主题中有这样的功能:
function variable($value)
$country_code = '';
require_once("geoip.inc");
$gi = geoip_open(dirname(FILE)."GeoIP.dat",GEOIP_STANDARD);
$country_code = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);
我一直在尝试 geoip_open 的不同变体以获取查看文件的代码,但我在前端收到了这个:
(!) 警告:fopen(.geoip.dat): 无法打开流:c:\wamp\www\clairvoyant\wp-content\themes\clairvoyant\geoip.inc 中没有这样的文件或目录在第 314 行
它给出的那条路,是绝对正确的。
我也尝试取出 dirname(FILE) 并只保留文件名,但它显示相同的错误。
我确实在这里阅读了另一篇关于它的帖子,给出了解决方案,因为它需要一个绝对路径,但是我怎样才能在本地机器上做到这一点,它在运行时会同样工作吗? (目前是在 WAMP 环境中)
更新: 这是我的全部功能:
function variable($value)
$country_code = '';
require_once("geoip.inc");
$gi = geoip_open(dirname(__FILE__)."/GeoIP.dat",GEOIP_STANDARD);
$country_code = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);
switch ($value)
case 'prem_no':
if ($country_code == 'US') $prem_no = '888-888-8888';
elseif ($country_code == 'AU') $prem_no = '1900 000 000';
elseif ($country_code == 'GB') $prem_no = '0906 636 4355';
else $prem_no = '';
return $prem_no;
break;
case 'prem_rate':
if ($country_code == 'US') $prem_rate = '$3.50';
elseif ($country_code == 'AUS') $prem_rate = '$3.96';
else $prem_rate = '£1.53';
return $prem_rate;
break;
case 'local_no':
if ($country_code == 'US') $local_no = '755-555-5555';
elseif ($country_code == 'AUS') $local_no = '1800 000 000';
else $local_no = '0207 111 6311';
return $local_no;
break;
case 'sms_no':
if($country_code == 'AUS') $sms_no = '1977 1977';
else $sms_no = '78887';
return $sms_no;
break;
case 'sms_rate':
if($country_code == 'AUS') $sms_rate = '25c';
else $sms_rate = '£1.50';
return $sms_rate;
break;
case 'helpline':
if($country_code == 'US') $helpline = '700-777-7777';
elseif ($country_code == 'AUS') $helpline = '1700 000 000';
else $helpline = '0207 111 6210';
return $helpline;
break;
default:
break;
第一个案例包括 GB 作为测试(因为我意识到它对我来说似乎是正确的,因为一切都在经历“其他”)。插入 GB 后,我再次得到空白(以及 echo $country_code 显示空白)。
【问题讨论】:
在geoip_open
之前使用file_exists。 FILE
是什么?我以为你想要__FILE__
就像this。
其实用这个$gi = geoip_open("file://C:/wamp/www/clairvoyant/wp-content/themes/clairvoyant/GeoIP.dat",GEOIP_STANDARD);
好像是加载了整个页面,看起来也加载了。是否只是上线时重新措辞的情况?
dirname(FILE)."GeoIP.dat" needs to be dirname(__FILE__)."/GeoIP.dat"
不要使用file://
协议,甚至不要使用http
。始终使用驱动器上文件的完整路径。
实际上这似乎并没有加载文件,因为虽然页面的其余部分加载了,但当我回显 $country_code 时,我只是得到一个空格
【参考方案1】:
dirname(FILE)."GeoIP.dat"
必须是dirname(__FILE__)."/GeoIP.dat"
【讨论】:
以上是关于无法打开 geoip.dat 文件。即使文件存在,“无法打开流”的主要内容,如果未能解决你的问题,请参考以下文章