GeoIP & fopen() - fopen(GeoIP/GeoIP.dat) [function.fopen]: не удается открыть поток, даже если файл существует?

Я пытался отладить эту ошибку уже более трех часов, меняя имена файлов, пытаясь использовать GeoIP Lite вместо GeoCity (последний имеет файл размером 27 МБ, который нужно включить, так что это мышление fopen() имело максимум) и т. д.

Вот моя файловая структура структуры: index.php -> include("configuration/config.php") - config.php -> include("inc/geo_text.php") -> geo_text.php

Содержимое geo_text.php:

$ip = $_SERVER['REMOTE_ADDR'];
include("GeoIP/geoip.inc");
$gi = geoip_open("GeoIP/GeoIP.dat",GEOIP_STANDARD);
$count_name = geoip_country_name_by_addr($gi, $ip);
geoip_close($gi);

echo($count_name);

Теперь, если я обращаюсь к geo_text.php, никаких ошибок не выдается, и просто чтобы убедиться, что я поместил echo($count_name) в geo_text.php, и он вернул, как и должно, мою страну.

Однако, когда я запускаю config.php, он возвращает ошибку:

Warning: fopen(GeoIP/GeoIP.dat) [function.fopen]: failed to open stream: No such file or directory in /nfs/c09/h02/mnt/177978/domains/domain.com/html/labs/final/configuration/inc/GeoIP/geoip.inc on line 399 Can not open GeoIP/GeoIP.dat

У кого-нибудь есть идеи, почему это может быть?


person Avicinnian    schedule 13.08.2011    source источник


Ответы (2)


Это проблема пути.

geoip_open("/absolute/path/to/GeoIP/GeoIP.dat",GEOIP_STANDARD);

должно сработать.

person Joe    schedule 13.08.2011
comment
Похоже, он ищет его в /nfs/c09/h02/mnt/177978/domains/domain.com/html/labs/final/configuration/inc/GeoIP/GeoIP/geoip.inc, так как geoip.inc уже находится в GeoIP, возможно, вам просто нужно изменить его на (GeoIP.dat). - person Joe; 14.08.2011
comment
Я пробовал это, и это не работает :(. Кроме того, это не объясняет, почему geo_text.php будет работать, а config.php нет. Я думаю, что это должно быть как-то связано с включением файлов, но Я не уверен, что. - person Avicinnian; 14.08.2011
comment
Ах, это потому, что я не использовал абсолютный путь, но это все еще не объясняет, почему geo_text.php будет работать, а другие нет. Когда файл A включается в файл B, который, в свою очередь, включается в файл C, пытается ли он преобразовать файл A в файл C по пути файла B, т. е. если файл B включает C/GeoIP/GeoIP.dat, а файл A включает файл B, делает ли это также искать C/GeoIP/GeoIP.dat вместо B/C/GeoIP/GeoIP.dat или что-то в этом роде? - person Avicinnian; 14.08.2011
comment
Поскольку config.php не находится в том же каталоге, что и geo_text.php, я предполагаю. В крайнем случае вы всегда можете сделать что-то вроде: error_log(Операционный родственник script . PHP_SELF . в каталоге . realpath(__FILE__)); Добавьте это в начало рассматриваемого скрипта и посмотрите журнал ошибок, это даст вам представление о ситуации на пути. Тот факт, что у вас есть 2 каталога GeoIP (один внутри другого), вероятно, сбивает вас с толку, поскольку config живет в GeoIP, а geo_text, вероятно, живет в GeoIP/GeoIP. - person Joe; 16.09.2011
comment
Проще, чем использовать полный абсолютный путь, использовать имя каталога, чтобы php понял это. geoip_open(имя_каталога(ФАЙЛ).'/geoip/GeoIP.dat,GEOIP_STANDARD); - person Ryaner; 02.05.2012

SSH на ваш сервер и выполните следующую команду (при условии, что это сервер Linux):

cd /nfs/c09/h02/mnt/177978/domains/domain.com/html/labs/final/configuration/inc/GeoIP/
ls -lah

Затем вставьте вывод сюда, чтобы мы могли его увидеть. Я предполагаю, что этого пути не существует.


Это очень странно. В качестве теста попробуйте переместить оба геофайла в тот же каталог, что и ваши файлы кода, а затем соответствующим образом измените пути в коде.


Он проверяет файлы в домене.com, но вы просто зашли в темуплатед.ком, вот в чем проблема. Ваш код должен указывать на каталог themeplated.com.

/nfs/c09/h02/mnt/177978/domains/domain.com/html/labs/final/configuration/inc/GeoIP/ /nfs/c09/h02/mnt/127878/domains/< strong>themeplated.com/html/labs/final/c‌​onfiguration/inc/GeoIP/

person Gerry    schedule 13.08.2011
comment
Извините, что так долго, я никогда раньше не использовал SSH: domain.com@n11:/nfs/c09/h02/mnt/127878/domains/themeplated.com/html/labs/final/configuration/inc/GeoIP$ ls -lah всего 953K drwxr-xr-x 2 domain.com domain.com 5 13 августа 2011 г. 15:23 . drwxr-xr-x 3 domain.com domain.com 6 13.08.2011 15:42 .. -rwxr-xr-x 1 domain.com domain.com 1.2M 13.08.2011 15:11 GeoIP.dat - rwxr-xr-x 1 domain.com domain.com 31K 2011-08-13 15:10 geoip.inc -rwxr-xr-x 1 domain.com domain.com 41 2011-08-13 15:23 var_dump.php - person Avicinnian; 14.08.2011
comment
В пути, который вы указали, есть themeplated.com, но приведенный выше код ищет файл в домене.com, в чем проблема. - person Gerry; 14.08.2011
comment
Это был заполнитель, я не копировал и не вставлял напрямую :(. - person Avicinnian; 14.08.2011
comment
Затем, пожалуйста, скопируйте и вставьте все, что вы ранее набрали вручную. Ввод сообщений об ошибках вручную только увеличивает вероятность того, что вы продублируете ошибку пути, которую вы сделали в своем коде. - person Gerry; 14.08.2011
comment
Я понял проблему, я понятия не имел, что для некоторых файлов требуются абсолютные пути, а для других - только относительные, поэтому я использовал относительный путь, который все испортил, когда файл был включен. Большое спасибо за ваш вклад и помощь, хотя :). Если вы не слишком заняты, можете ли вы объяснить, почему это может произойти, или дать мне ссылку, если она у вас есть, поскольку мне не удалось ее найти? Также я полагаю, что в будущем мне следует выработать привычку использовать абсолютные пути, или есть способ определить, нужен ли файлу абсолютный путь? - person Avicinnian; 14.08.2011
comment
Относительный путь работает нормально, если у вас правильный относительный путь. Указание использовать абсолютный путь просто исключает еще одну вещь. - person Gerry; 14.08.2011