Подтвердить что ты не робот

В PHP, есть ли вред запуску session_start() несколько раз?

Предположительно, есть несколько крошечных хитов, но помимо этого?

4b9b3361

Ответ 1

От документы:

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

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

Ответ 2

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

if (session_id() == "")
  session_start();

Ответ 3

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

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

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

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

<?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

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

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

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

Ответ 5

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

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

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

Лично я сначала проверю наличие cookie сеанса.

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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