Есть ли какой-либо вред в запуске session_start () несколько раз, когда строится запрос страницы (в php)? - PullRequest
28 голосов
/ 05 апреля 2010

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

Ответы [ 8 ]

51 голосов
/ 05 апреля 2010

Начиная с PHP 4.3.3, вызов session_start (), когда сессия уже запущена, приведет к предупреждению E_NOTICE. Второй вызов session_start () будет просто проигнорирован. Вы можете проверить, был ли сеанс запущен первым или нет:

if (session_id() == "")
  session_start();
24 голосов
/ 05 апреля 2010

С документы :

Начиная с PHP 4.3.3, вызов session_start () после того, как сеанс был ранее запущен, приведет к ошибке уровня E_NOTICE. Кроме того, начало второй сессии будет просто проигнорировано.

Так что нет, это не принесет вреда, но приведет к ошибке. И тот факт, что это происходит, вероятно, является показателем того, что вы что-то делаете неправильно, и, возможно, вам придется переосмыслить, как выстроен ваш код.

14 голосов
/ 28 июня 2013

Вызов session_start (); может нанести ущерб производительности вашего приложения.

Следующий код вызовет E_NOTICE, но не сильно повредит производительности

<?php
session_start();
session_start();
?>

Но звонки по следующим номерам повредят производительность! Но это все еще полезно. Если у вас есть скрипт, который запускается за 3 минуты и вызывается с помощью XHR (js). В этом случае полезно использовать session_write_close. в противном случае запрос к серверу блокируется до тех пор, пока сеансы не будут освобождены. Может случиться так, что вы захотите использовать сеансы в начале и в конце сценария.

<?php
session_start();
session_write_close();
session_start();
?>

Но, когда вы вызываете session_start (); вся информация десериализуется, и когда вы вызываете session_write_closed (), она сериализуется. Так что если у вас много данных, это может быть очень медленно!

Следующий тест показывает, какое влияние он оказывает.

1.0130980014801 sesion_start + закрыть с пустым сеансом

1.0028710365295 нормальный цикл без сеанса

12.808688879013 много данных в сеансе со стартом + закрытием

1.0081849098206 снова нормальный цикл (бесполезно, вроде)

<?php
//start and clear first session
session_start();
session_destroy();
session_write_close();

//test one
if(true) {
    //test loop one
    $start = microtime(true);
    for($i = 0; $i < 1000; $i++) {
        session_start();
        usleep(100);
        session_write_close();
    }
    $end = microtime(true);
    echo($end - $start);


    //test loop 2
    echo('<br />');
    $start = microtime(true);
    for($i = 0; $i < 1000; $i++) {
        usleep(100);
    }
    $end = microtime(true);
    echo($end - $start);
}


//fill the array with information so serialization is needed
session_start();
$_SESSION['test'] = array();
for($i = 0; $i < 10000; $i++) {
    $_SESSION['test'][$i] = chr($i);
}
session_write_close();
echo('<br />');

//test two
if(true) {
    //test loop one
    $start = microtime(true);
    for($i = 0; $i < 1000; $i++) {
        session_start();
        usleep(100);
        session_write_close();
    }
    $end = microtime(true);
    echo($end - $start);


    //test loop 2
    echo('<br />');
    $start = microtime(true);
    for($i = 0; $i < 1000; $i++) {
        usleep(100);
    }
    $end = microtime(true);
    echo($end - $start);
}
?>
4 голосов
/ 05 апреля 2010

Чтение документов для session_start, все, что я вижу, это:

Начиная с PHP 4.3.3, вызов session_start() после начала сеанса приведет к ошибке уровня E_NOTICE. Кроме того, начало второй сессии будет просто проигнорировано.

Итак, вы получите E_NOTICE и будете игнорироваться.

3 голосов
/ 17 декабря 2014

Если выдается ошибка, скорее всего, разработчики не собирались совершать это конкретное действие. Так что да, несмотря на то, что вы показали в W3Schools, это технически «плохо».

Итак, вместо того, чтобы рисковать и попытаться установить сеанс на каждой странице, почему бы не сначала проверить, существует ли сеанс, прежде чем двигаться вперед?

  if ( !isset($_SESSION) ) session_start();

Лично я бы сначала проверил наличие куки сессии.

2 голосов
/ 05 апреля 2010

Я обычно помещаю оператор начала сеанса во включаемый файл, который мне требуется_once. Но я не думаю, что должна быть проблема с несколькими вызовами.

1 голос
/ 05 апреля 2010

Если сеанс уже открыт, он вернет уведомление об ошибке, и новый сеанс будет проигнорирован. Так что никакого вреда не будет, но у вас будет неприятная ошибка.

Но ... если вы обнаружите необходимость сделать это, это может быть признаком того, что ваш код плохо организован. Вероятно, было бы полезно узнать, как вы можете избежать повторения лишних задач, таких как запуск сеанса.

0 голосов
/ 19 августа 2016

`всегда используйте это для включения файла заголовка и нижнего колонтитула в php. вы начинаете сеанс на обеих страницах, но затем используете его session_start ()

if (! Isset ($ _ SESSION)) {session_start (); } `

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