开发者

How to troubleshoot PHP session file empty issue?

开发者 https://www.devze.com 2022-12-24 13:26 出处:网络
I have a very simple test page for PHP session. <?php session_start(); if (isset($_SESSIONS[\'views\']))

I have a very simple test page for PHP session.

<?php
session_start();

if (isset($_SESSIONS['views']))
{
    $_SESSIONS['views'] = $_SESSIONS['pv'] + 1;
}
else
{
    $_SESSIONS['views'] = 0;
}

var_dump($_SESSIONS);

?>

Afte开发者_运维百科r refreshing the page, it always show

array
  'views' => int 0

The environment is XAMPP 1.7.3. I checked phpInfo(). The session is enabled.

Session Support     enabled
Registered save handlers    files user sqlite
Registered serializer handlers  php php_binary wddx

Directive   Local Value Master Value
session.auto_start  Off Off
session.bug_compat_42   On  On

When the page is accessed, there is session file sess_lnrk7ttpai8187v9q6iok74p20 created in my "D:\xampp\tmp" folder. But the content is empty.

With Firebug, I can see cookies about the session.

Cookie  PHPSESSID=lnrk7ttpai8187v9q6iok74p20

It seems session data is not flushed to files.

Is there any way or direction to trouble shoot this issue?

Thanks.


BTW, it is $_SESSION not $_SESSIONS.

Hence why it isn't saving the data.


The variable you need to set is called $_SESSION not $_SESSIONS


Heres what I did ...

  • Install sqlite for php if older than php5 (installed and enabled by default since php5).

  • In your php.ini (for the location see phpinfo() or run>php -i) change the line ..

session.save_handler = files

to

session.save_handler = sqlite

  • Then in the same file (php.ini) make sure NOTICES are turned on

error_reporting = E_ALL

  • restart apache if you changed php.ini

/etc/init.d/apache2 restart

Now you will be getting a sensible error message most likely revealing you dont have correct permissions to your session.save_path so ...

  • Find out your web services user and group unless known. There are several ways to do so but I placed this line temporarily in my php code ...

print_r(posix_getpwuid(posix_getuid()));

And I found that user www-data and group www-data were set for this web user by my ispconfig3.

  • Make a session directory on your web path (probably /var/www) for the web user.

    sudo mkdir /var/www/whatever; sudo chown <user_from_last_step>:<group_from_last_step> /var/www/whatever

    eg>sudo chown www-data:www-data /var/www/whatever

  • Again in your php.ini file make sure session.save_path is commented out, something like ...

;session.save_path = /var/lib/php5

but not

session.save_path = /var/lib/php5

  • restart apache if you edited php.ini

  • Now go to your php code (Many have a SetEnv.php ish type script which does some global stuff and is imported by all files) and add the following line BEFORE you call session_start() ...

ini_set('session.save_path', '0;0750;/var/www/whatever');

Note that we set session.save_path in your code rather than in php.ini to help keep it secure, so to replace 'whatever' with something inventive would be useful.

By now it should appear to be working, but not quite, it doesent work accross ajax requests for some reason that I dont care about related to sqlite ... so ...

  • Go back to your php.ini file and change the line ...

session.save_handler = sqlite

back to

session.save_handler = files.

  • restart apache

Fixed :) Hopefully :|


use $_SESSION and check it by print_r($_SESSION);

              <?php
                 session_start();

             if (isset($_SESSION['views']))
              {
                 $_SESSION['views'] = $_SESSION['pv'] + 1;
              }
             else
             {
              $_SESSION['views'] = 0;
             }
              echo "<pre>";

              print_r($_SESSION);

              ?>
0

精彩评论

暂无评论...
验证码 换一张
取 消