Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
每次请求时重置PHP会话_Php_Ajax_Session_Nginx - Fatal编程技术网

每次请求时重置PHP会话

每次请求时重置PHP会话,php,ajax,session,nginx,Php,Ajax,Session,Nginx,我已经好几天没有试着做这项工作了。我对PHP会话有问题。服务器是nginx。我有三个子目录(子域): app.dev/(有前端,什么客户端访问) backend.app.dev/(处理AJAX请求并与API通信的php页面) api.app.dev/(api) 在app.dev/中有template/文件夹,其中包含PHP文件,如表单、标题和网站部分,这些文件根据会话数据填充。这是通过jQuery.load()函数加载到index.html页面的 在backend.app.dev/上有pag

我已经好几天没有试着做这项工作了。我对PHP会话有问题。服务器是nginx。我有三个子目录(子域):

  • app.dev/(有前端,什么客户端访问)
  • backend.app.dev/(处理AJAX请求并与API通信的php页面)
  • api.app.dev/(api)
app.dev/中有
template/
文件夹,其中包含PHP文件,如表单、标题和网站部分,这些文件根据会话数据填充。这是通过
jQuery.load()
函数加载到
index.html
页面的

backend.app.dev/上有
page.php
文件,用于处理数据并发送到API

然后,当我在登录操作上发送AJAX请求时,在我从API获得令牌之后,我需要将其存储到
page.php
上的会话中。在那个请求中,它成功地存储了它,但是,当我发送第二个请求(检查会话中是否有令牌)时,它说会话是空的。我尝试打印整个
$\u会话
变量,但它是空的<代码>$\u COOKIE也可以。所以每次请求后会话都会被丢弃。我在谷歌上搜索了很多。我尝试了许多解决方案(我将发布我尝试过的解决方案日志),我发现在
/var/lib/php/sessions
中的每个请求之后都会创建一些文件

我试着在每个请求上打印会话id,但总是不同的

从日志文件中,多次发送相同的请求:

[28.Sep.2017 04:39:12]: session id: c0556q1s47kger3l53tgrdadhu

[28.Sep.2017 04:39:29]: session id: 83nmqq1l9d27v7jhh7748gq2ru

[28.Sep.2017 04:39:33]: session id: ece5as0eb0egoolun8u9s0duqi
下面是我尝试过的日志:

//session_name("backend");
//session_set_cookie_params(0, '/', '.dev');
//session_start();

//session_name('backend');
//ini_set('session.cookie_domain', 'hr.dev');
//ini_set('session.save_path', '/var/lib/php/session');
//ini_set('session.cookie_domain', substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100));
//session_start();

//session_name("all");
//$sess_life_time = 21600; //in seconds
//$sess_path = "/";
//$sess_domain = ".dev";
//$sess_secure = true; // if you have secured session
//$sess_httponly = true; // httponly flag

//ini_set('suhosin.session.cryptdocroot', 'off');
//ini_set('suhosin.cookie.cryptdocroot', 'off');

//session_set_cookie_params($sess_life_time, $sess_path, $sess_domain, $sess_secure, $sess_httponly);

//session_name("all");
//ini_set("session.cokie_domain",".dev");
//session_set_cookie_params(0, '/', '.dev');
//session_start();

//  session_name("mysession");
//  session_set_cookie_params(0,"/",".dev",FALSE,FALSE);
//  setcookie(session_name(), session_id(),0,"/",".dev");
//  session_start();
有什么问题吗?服务器配置中是否缺少某些内容

如果我们能尽快解决这个问题,我将非常非常感激

编辑:

我在backend.app.dev中设置了会话变量(启动会话)/

编辑2:

php.ini
info:

session.auto_start => Off => Off
session.cache_expire => 180 => 180
session.cache_limiter => nocache => nocache
session.cookie_domain => no value => no value
session.cookie_httponly => Off => Off
session.cookie_lifetime => 0 => 0
session.cookie_path => / => /
session.cookie_secure => Off => Off
session.gc_divisor => 1000 => 1000
session.gc_maxlifetime => 1440 => 1440
session.gc_probability => 0 => 0
session.lazy_write => On => On
session.name => PHPSESSID => PHPSESSID
session.referer_check => no value => no value
session.save_handler => files => files
session.save_path => /var/lib/php/sessions => /var/lib/php/sessions
session.serialize_handler => php => php
session.sid_bits_per_character => 5 => 5
session.sid_length => 26 => 26
session.upload_progress.cleanup => On => On
session.upload_progress.enabled => On => On
session.upload_progress.freq => 1% => 1%
session.upload_progress.min_freq => 1 => 1
session.upload_progress.name => PHP_SESSION_UPLOAD_PROGRESS => PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix => upload_progress_ => upload_progress_
session.use_cookies => On => On
session.use_only_cookies => On => On
session.use_strict_mode => Off => Off
session.use_trans_sid => 0 => 0

PHP正在为您所在的域(或子域)设置会话

您可以在php.ini中设置

session.cookie_domain = "domain.com"

另一个选项是使用会话令牌为整个域(如domain.com)设置cookie,并从脚本中管理整个会话。可能有用的图书馆:


经过这么长时间,我终于解决了这个问题。我将API保留在单独的域中,但在同一个域中集成了前端和后端,但位于不同的子文件夹中。所以现在我有:

  • api.app.dev

  • app.dev
    (前端)

  • app.dev/backend

和(本地)会话现在非常有效。我在服务这两个子目录时也遇到了问题,所以我打开了新的线程。我使用了
nginx
设置:


谢谢大家

您是否在每次请求时都调用了会话销毁()?简单测试:
print\r($\u会话)$_会话['foo']='bar';打印(美元会话);退出你能发布一些代码吗?这样我就能更好地理解问题的原因。请将你的代码粘贴到问题本身中。没有理由不这样做。外部链接可能会消失、更改或过时。为什么要让人们花更多的精力去阅读你的问题呢?根据网站规则,需要代码但不包含代码的问题可以合法地作为非主题关闭。@Scoots否,我只是在用户注销时调用它。在一个请求中所有内容都是有效的。当我将会话转储到另一个会话时,它是空的。BenyaminJeizan,嘿,我可以,但最重要的是,因为它是商业性的,不幸的是,我不是所有者。你需要哪一部分?ADyson嗯,我担心它很结实。我会编辑。谢谢。如果您将会话变量设置为
app.dev
,那么它在
backend.app.dev
中将不可见,除非您将所有子域的设置为
app.dev
您共享的代码尝试执行此操作,但是在会话启动后(为时已晚)嘿,谢谢您的回答!我已经尝试将cookie域设置为
.dev
,但这并不能解决问题。我会查这些图书馆。谢谢漂亮的图书馆!我想这会解决我的问题。你认为哪一个更好,更受支持?
session.cookie_domain = ".domain.com"