Есть ли какой-либо вред при запуске session_start () несколько раз по мере создания запроса на страницу (в php)?

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

Из документов :

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

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

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

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

Вызов 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); } ?> 

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

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

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

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

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

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

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

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

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

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

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

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