Apache аварийно завершает работу, вероятно, из-за этого фрагмента PHP-кода. Можешь посмотреть? - PullRequest
3 голосов
/ 29 мая 2010

Я работаю над созданием веб-приложения на codeigniter.Я написал эту функцию, чтобы получить данные о часовом поясе для любого города или адреса.

function gettimezone($address)
    {
       $_url = 'http://api.local.yahoo.com/MapsService/V1/geocode';
        $_url .= sprintf('?appid=%s&location=%s',"phpclasses",rawurlencode($address));
        $_result = false;
        if($_result = file_get_contents($_url)) {
            preg_match('!<Latitude>(.*)</Latitude><Longitude>(.*)</Longitude>!U', $_result, $_match);
            $lng = $_match[2];
            $lat = $_match[1]; 
            $url = "http://ws.geonames.org/timezone?lat={$lat}&lng={$lng}";
            $timedata = file_get_contents($url);
            $sxml = simplexml_load_string($timedata);
            return $sxml->timezone;
        } 
        else
            return false;
    }

Я работаю над Windows 7 и xampp 1.7 (php 5.2.8).
Есть ли возможный сценарий, когда этокусок кода может привести к краху Apache?Приложение работает нормально почти каждый раз, но я думаю, что выполнение этого фрагмента кода, когда нет подключения к Интернету или очень плохое подключение к Интернету (таким образом, нет доступа к любому из веб-сервисов, которые я использовал), приводит к остановке сервера.Нечто подобное происходило несколько раз, и я думаю, что это произошло из-за потери интернет-соединения, но я не уверен, что именно происходит.

[Кстати, не стесняйтесь использовать этот кусок кода.Делает 2 вызова веб-службы, поэтому не используйте слишком часто в вашем приложении.Попробуйте сохранить результаты в базе данных.]

Редактировать: Этот фрагмент кода и мое приложение работают идеально, почти каждый раз .Это просто разбило Apache пару раз несколько дней назад.И я думаю, что именно эта функция является виновником, поскольку это было одной из вещей, которая была добавлена ​​непосредственно перед этими сбоями.

Редактировать 2: Вот небольшой фрагмент моего журнала ошибок apache, который выглядит неправильно.Это есть в журнале несколько раз, и я думаю (на самом деле вполне уверен), что это соответствует краху сервера.Кроме этого, есть несколько ошибок «файл не существует», которые не приведут к сбою сервера

[Mon May 24 12:14:26 2010] [notice] Parent: child process exited with status 3221225477 -- Restarting.
[Mon May 24 12:15:29 2010] [warn] pid file c:/xampp/apache/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?

Ответы [ 2 ]

1 голос
/ 29 мая 2010

Так как нет ошибок StackTarace или журнала ошибок, я подозреваю, что причиной проблемы может быть:

 $url = "http://ws.geonames.org/timezone?lat={$lat}&lng={$lng}";

Поскольку вы пытаетесь получить некоторые данные из другого веб-сервиса, возможно, это проблема.

Я бы сказал, поместите try / catch вокруг этого раздела так:

try
{
    $url = "http://ws.geonames.org/timezone?lat={$lat}&lng={$lng}";
    $timedata = file_get_contents($url);
    $sxml = simplexml_load_string($timedata);
}
catch(Exception $e)
{
    // log this exception to file
}
return $sxml->timezone;

Как вы сказали, это работает большую часть времени. Поэтому оставьте это сейчас, а через неделю или около того вернитесь и посмотрите, содержит ли журнал ошибок что-то интересное для вас.

0 голосов
/ 29 мая 2010

Помимо отсутствия подключения к Интернету, он не будет работать, если для allow_url_fopen установлено значение false из файла php.ini, и по этой причине функция file_get_contents не будет получать данные из URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...