2010-04-05 20 views

回答

22

the docs

自PHP 4.3.3,呼籲先前啓動會話之後的session_start()會導致E_NOTICE級別的錯誤。另外,第二次會話開始將被忽略。

所以不,它不會造成傷害,但會引發錯誤。事實上,這可能表明您正在做錯某些事情,可能需要重新考慮您的代碼是如何佈局的。

48

從PHP 4.3.3開始,在會話已經啓動時調用session_start()會導致E_NOTICE警告。第二調用在session_start()將只是如果會話已啓動第一或ignored.You可以檢查不是:

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

閱讀在session_start的文檔,所有我能看到的是:

自PHP 4.3.3,稱session_start()以前開始在會議結束後將會導致E_NOTICE平的誤差。另外,第二次會話開始將被忽略。

所以,你會得到一個E_NOTICE並被忽略。

1

如果會話已經打開,那麼它將返回錯誤通知,並且新會話將被忽略。所以沒有傷害,但你會有一個討厭的錯誤。

但是...如果您發現需要這樣做,那麼這可能是您的代碼組織不良的一個症狀。看看如何讓自己避免重複冗餘任務(如啓動會話)可能會對您有利。

2

我通常會將一個會話開始語句放在一個包含我require_once的文件中。但我認爲不應該有多個電話的問題。

11

調用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); 
} 
?> 
1

如果它產生錯誤,賠率是開發人員不打算執行該特定操作t o發生。所以是的,儘管你在W3School上看到了什麼,但在技術上這是一個'壞'的事情。

因此,不是玩它安全並嘗試設置每個頁面上的會話,爲什麼不第一檢查,看看會話存在之前,你前進?

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

就我個人而言,我會先檢查會話cookie的存在。

-1

`總是使用這個在PHP中包含頁眉和頁腳文件。你開始在這兩個頁面的會話,但你使用這個然後session_start()

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

相關問題