Ошибки в работе PHP как модуля разных систем

Тема в разделе "Веб-технологии", создана пользователем The Night Fury, 28 июн 2013.

  1. The Night Fury

    The Night Fury Администратор

    Сообщения:
    1.221
    Симпатии:
    914
    Доброго времени суток, форумчане.
    Решив проблему, я подумал, что обсудить всё-таки стоит, поэтому, собственно, топик и создаю.

    Суть
    Какое-то время назад я поставил себе систему мониторинга LGSL 5.8. Всё было нормально, не видел сбоев, но потом ВНЕЗАПНО стали появляться баги.
    Самым большим стал баг отправки информации хидера (функция в файле admin.php). Проблема заключалась в том, что после входа в админ-панель я не мог ничего сделать — любой переход по ссылкам внутри файла заканчивался фейлом, постоянно выкидывало на admin.php с просьбой войти. Перерыл систему, порылся в скриптах — нет толку. Ну и хрен с ним, ведь есть phpMyAdmin, верно? Только вот кэш там не сбросить было.
    Вот сегодня пришлось удалить один из серверов, ну и из мониторинга тоже надо было удалить.
    Порывшись как следует ещё раз, я решил изменить конфигурацию сайта: сменил конфигурацию "Использовать PHP как модуль CGI" на "Использовать PHP как модуль Apache" (ПУ — ISP Manager, если что). Ограничений нет, чтоб не спрашивали.
    Ну и всё, ошибка исчезла.

    Ошибка
    Сама ошибка в логах как-то странно выглядела:
    Код:
    [Fri Jun 28 20:26:18 2013] [error] [client *.*.*.*] PHP Warning:  Cannot modify header information - headers already sent by (output started at /var/www/%1337yoba1337%/data/www/***.***.tld/lgsl_files/lgsl_config.php:1) in /var/www/%1337yoba1337%/data/www/***.***.tld/admin.php on line 19, referer: http://***.***.tld/admin.php
    В admin.php на строке 19 содержится соответственно:
    PHP:
        setcookie("lgsl_admin_auth"$auth, (time() + (60 60 24)), "/");
    PHP:
    <?php
    //------------------------------------------------------------------------------------------------------------+
      
    require "lgsl_files/lgsl_config.php";

      if (empty(
    $lgsl_config['admin']['user']) || empty($lgsl_config['admin']['pass']))
      {
        exit(
    "ADMIN USERNAME OR PASSWORD MISSING FROM CONFIG");
      }
      elseif (
    $lgsl_config['admin']['pass'] == "changeme")
      {
        exit(
    "ADMIN PASSWORD MUST BE CHANGED FROM THE DEFAULT");
      }

      
    $auth   md5($_SERVER['REMOTE_ADDR'].md5($lgsl_config['admin']['user'].md5($lgsl_config['admin']['pass'])));
      
    $cookie = isset($_COOKIE['lgsl_admin_auth']) ? $_COOKIE['lgsl_admin_auth'] : "";

      if (isset(
    $_POST['lgsl_user']) && isset($_POST['lgsl_pass']) && $lgsl_config['admin']['user'] == $_POST['lgsl_user'] && $lgsl_config['admin']['pass'] == $_POST['lgsl_pass'])
      {
        
    setcookie("lgsl_admin_auth"$auth, (time() + (60 60 24)), "/");
        
    define("LGSL_ADMIN"TRUE);
      }
      elseif (
    $cookie == $auth)
      {
        
    setcookie("lgsl_admin_auth"$auth, (time() + (60 60 24)), "/");
        
    define("LGSL_ADMIN"TRUE);
      }

    //  header("Content-Type:text/html; charset=utf-8");
    //------------------------------------------------------------------------------------------------------------+
    ?>



    <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.1//EN' 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'>

    <html xmlns='http://www.w3.org/1999/xhtml'>
      <head>
        <title>Live Game Server List</title>
        <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
        <meta http-equiv='content-style-type' content='text/css' />
        <link rel='stylesheet' href='lgsl_style.css' type='text/css' />
      </head>

      <body>
        <div style='height:30px'><br /></div>




    <?php
    //------------------------------------------------------------------------------------------------------------+
      
    if (defined("LGSL_ADMIN"))
      {
        global 
    $output;
        
    $output "";
        require 
    "lgsl_files/lgsl_admin.php";
        echo 
    $output;
      }
      else
      {
        echo 
    "
        <form method='post' action=''>
          <table style='margin:auto; text-align:center'>
            <tr><td> USERNAME: </td><td> <input type='text'     name='lgsl_user' value='' /> </td></tr>
            <tr><td> PASSWORD: </td><td> <input type='password' name='lgsl_pass' value='' /> </td></tr>
            <tr>
              <td colspan='2'>
                <br />
                <input type='submit' name='lgsl_admin_login' value='Login' />
              </td>
            </tr>
          </div>
        </form>"
    ;
      }
    //------------------------------------------------------------------------------------------------------------+
    ?>



      </body>
    </html>

    Вопрос
    Итак, "починить" получилось при помощи простой установки PHP как модуля Apache.
    Вопрос: почему же так получается, что хидэр не получается изменить?
    Вопрос 2: в чём может быть причина такого сбоя? Ничего не изменялось на сервере, но баг появился, несмотря на это.
     
  2. Vaio

    Vaio

    Сообщения:
    628
    Симпатии:
    218
    Никаких echo перед перед отправкой хедеров.
     
  3. TF Studio

    TF Studio

    Сообщения:
    228
    Симпатии:
    209
    error_reporting в ноль и не париться.
    это - не критическая ошибка.
     
  4. The Night Fury

    The Night Fury Администратор

    Сообщения:
    1.221
    Симпатии:
    914
    В том-то и дело, что нет ничего до отправки хидера.

    Дело не в сообщении об ошибке, а в том, что куки "не пишутся" и выполнять действия после не выходит. Я вроде бы зашёл в панель администратора, но и не зашёл.
     
  5. Vaio

    Vaio

    Сообщения:
    628
    Симпатии:
    218
    Кодировку utf-8 без BOM или убери символы в 1 строке.
     
    The Night Fury нравится это.