簡體   English   中英

PHP會話數據未保存

[英]PHP Session data not being saved

我有一個“我發誓我沒有觸摸服務器”的情況。 老實說,我沒有觸及任何PHP腳本。 我遇到的問題是PHP數據沒有保存在不同的頁面或頁面刷新。 我知道正在創建一個新會話,因為我可以設置一個會話變量(例如$ _SESSION ['foo'] =“foo”並將其打印在同一頁面上就好了。但是當我嘗試使用同一個變量時在另一個頁面上它沒有設置!我可以在我的主機服務器上使用任何PHP函數或信息來查看發生了什么?

這是一個示例腳本,目前在我的主機服務器上不起作用:

<?php
session_start();
if(isset($_SESSION['views']))
    $_SESSION['views'] = $_SESSION['views']+ 1;
else
    $_SESSION['views'] = 1;

echo "views = ". $_SESSION['views'];
echo '<p><a href="page1.php">Refresh</a></p>';
?>

執行頁面刷新后,'views'變量永遠不會增加。 我認為這是他們身邊的問題,但我想確保我不是一個完全白痴。

這是我的主機服務器的phpinfo()(PHP版本4.4.7): 替代文字

感謝所有有用的信息。 事實證明,我的主機更改了服務器並開始使用除/ var / php_sessions之外的其他會話保存路徑,這些路徑不再存在。 一個解決方案就是聲明ini_set(' session.save_path','SOME WRITABLE PATH'); 在我的所有腳本文件中,但這將是一個痛苦。 我與主機進行了交談,他們明確地將會話路徑設置為確實存在的真實路徑。 希望這可以幫助任何有會話路徑麻煩的人。

檢查以確保您沒有將https://與http://混合使用。 會話變量不會在安全會話和不安全會話之間流動。

有同樣的問題 - 發生在我身上的是我們的服務器管理員將session.cookie_secure布爾值更改為On,這意味着cookie只會通過安全連接發送。 由於沒有找到cookie,php每次都會創建一個新會話,因此沒有看到會話變量。

使用phpinfo()並檢查session.*設置。

也許這些信息存儲在cookie中,而您的瀏覽器也不接受cookie,就像那樣。

首先檢查並返回結果。

你也可以做一個print_r($_SESSION); 轉儲此變量並查看內容....

關於你的phpinfo()session.save_path是有效的嗎? 您的Web服務器是否具有此目錄的寫入權限?

希望這可以幫助。

我有以下問題

的index.php

<?
    session_start();
    $_SESSION['a'] = 123;
    header('location:index2.php');
?>

index2.php

<?
  session_start();
  echo $_SESSION['a'];
?>

變量$_SESSION['a']未正確設置。 然后我依次更改了index.php

<?
    session_start();
    $_SESSION['a'] = 123;
    session_write_close();
    header('location:index2.php');
?>

我不知道這內部意味着什么,我只是向自己解釋會話變量變化不夠快:)

檢查Web服務器是否可以寫入會話保存路徑。

確保你打開了餅干..(當我把它們關掉來測試時我會忘記)

使用firefox和firebug擴展來查看cookie是否被設置並傳回。

並且在一個不相關的說明中,開始查看php5,因為php 4.4.9是php4系列的最后一個。

檢查組和所有者是腳本運行的文件夾的對象。 如果組ID或用戶標識錯誤(例如,設置為root),則會導致會話無法正確保存。

我知道我找到的一個解決方案(OSX與Apache 1並且剛剛切換到PHP5)當我遇到類似問題時,未設置1個特定鍵(即未設置($ _ SESSION ['key']);)導致它不能保存。 一旦我沒有取消該密鑰,它就會保存。 我再也沒見過這個,除了在另一個網站上的那個服務器上,但那時它是一個不同的變量。 兩者都不特別。

謝謝你這個Darryl。 這幫助了我。 我正在刪除一個會話變量,由於某種原因,它使會話保持不變。 現在我只是將它設置為null(這對我的應用程序來說很好),並且它有效。

在增加之前檢查“視圖”的值。 如果由於某些奇怪的原因,它被設置為字符串,那么當你向它添加1時,它將始終返回1。

if (isset($_SESSION['views'])) {
    if (!is_numeric($_SESSION['views'])) {
        echo "CRAP!";
    }
    ++$_SESSION['views'];
} else {
    $_SESSION['views'] = 1;
}

好吧,我們可以消除代碼錯誤,因為我在自己的服務器上測試了代碼(PHP 5)。

這是檢查的內容:

  1. 你在任何地方調用session_unset()或session_destroy()嗎? 這些函數將立即刪除會話數據。 如果我將這些放在腳本的末尾,它就會像你描述的那樣開始表現。

  2. 它在所有瀏覽器中的行為是否相同? 如果它在一個瀏覽器而不是另一個瀏覽器上工作,則可能在非功能瀏覽器上存在配置問題(即您關閉了cookie並忘記打開它們,或者錯誤地阻止了cookie)。

  3. 會話文件夾是否可寫? 您無法使用is_writable()進行測試,因此您需要轉到文件夾(從phpinfo()看起來像/ var / php_sessions)並確保會話實際上已創建。

如果您在php5中設置會話,然后嘗試在php4頁面上閱讀它,它可能看起來不正確! 使頁面與php版本相同或設置session_path。

我花了很多年的時間尋找類似問題的答案。 這不是代碼或設置的問題,因為非常相似的代碼在同一服務器上的另一個.php中完美地工作。 原來這個問題是由於在此頁面中將大量數據保存到會話中引起的。 在一個地方我們有這樣一行: $_SESSION['full_list'] = $full_list其中$full_list是從數據庫加載的數據數組; 每行是一個大約150個元素的數組。 當代碼最初在幾年前編寫時,DB只包含大約1000行,因此$full_list包含大約100個元素,每個元素是一個包含大約20個元素的數組。 隨着時間的推移,20個元素變成150和1000行變成17000,因此代碼將近64兆的數據存儲到會話中。 顯然,在存儲了大量數據的情況下,它拒絕存儲任何其他內容。 一旦我們更改代碼以在本地處理數據而不將其保存到會話中,一切都運行良好。

經常被忽視的一個常見問題是在session_start()命令之前必須沒有其他代碼或額外的間距。

我之前遇到過這個問題,我在session_start()之前有一個空行,導致它無法正常工作。

編輯你的php.ini。
我認為session.gc_probability的值是1,所以將其設置為0。

session.gc_probability=0

我知道我找到的一個解決方案(OSX與Apache 1並且剛剛切換到PHP5)當我遇到類似問題時,未設置1個特定鍵(即未設置($ _ SESSION ['key']);)導致它不能保存。 一旦我沒有取消該密鑰,它就會保存。 我再也沒見過這個,除了在另一個網站上的那個服務器上,但那時它是一個不同的變量。 兩者都不特別。

這是我在其他評論中沒有看到的一個常見問題:您的主機是否正在運行某種緩存? 如果他們以某種方式自動緩存結果,你會得到這種行為。

添加我的解決方案

檢查您是否訪問了正確的域 我正在使用www.mysite.com開始會話,並試圖從mysite.com (沒有www )接收它。

我已經解決了這個問題,將所有域的htaccess重寫添加到www以保證安全/站點。

另請檢查您是使用http還是https。

我將會話cookie路徑設置為“//”而不是“/”。 螢火蟲太棒了。 希望它對某人有幫助。

我使用安全頁面時出現此問題,我來自www.domain.com/auth.php,重定向到domain.com/destpage.php。 我從auth.php鏈接中刪除了www並且它有效。 這讓我失望,因為一切都行不通; 雖然我到達目的地時沒有設置會話。

只是想添加一個小注釋,如果您不小心錯過了頁面上的session_start()語句,也會發生這種情況。

檢查您是否使用session_write_close(); 在任何地方,我在另一個會話之后正在使用這個,然后再次嘗試寫入會話並且它無法工作..所以只需評論sh * t out

我必須做的另外幾件事(我有同樣的問題:PHP升級到5.4后沒有sesson保留)。 您可能不需要這些,具體取決於您的服務器的php.ini包含的內容(請參閱phpinfio());

session.use_trans_sid=0 ; Do not add session id to URI (osc does this)
session.use_cookies=0;  ; ensure cookies are not used
session.use_only_cookies=0 ; ensure sessions are OK to use IMPORTANT
session.save_path=~/tmp/osc; ; Set to same as admin setting
session.auto_start = off; Tell PHP not to start sessions, osc code will do this

基本上,你的php.ini應該設置為沒有cookie,會話參數必須與osc想要的一致。

您可能還需要在application_top.php中更改一些會話代碼片段 - 創建tep_session_is_registered(...)調用中不存在的對象(例如導航對象),將$ HTTP_變量設置為較新的$ _SERVER變量和a空對象的其他一些isset測試(google for info)。 我最終能夠使用原始的sessions.php文件(包括/ classes和includes / functions)以及稍微修改過的application_top.php來重新開始。 php.ini設置是主要問題,但這當然取決於您的服務器公司安裝的默認設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM