无法打开 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 文件。即使文件存在,“无法打开流”的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 NGINX 中查询 GeoIP

nginx 和 PHP GeoIP 模块的内部错误 500

geoip_country_by_name 返回空字符串,没有错误

GeoIP最快捷安装

重定向国家脚本不起作用

PHP 无法找到文件,即使它存在