PHP会话不适用于多个WordPress页面

Posted

技术标签:

【中文标题】PHP会话不适用于多个WordPress页面【英文标题】:PHP session not working with multiple WordPress pages 【发布时间】:2021-03-29 11:11:34 【问题描述】:

请帮忙。我有三个 php 页面,我使用“Woody sn-ps”在每个页面上粘贴了以下代码 sn-ps。插入。这些会话有时会根据我上次发布的页面在页面内进行通信。例如,如果我最后发布page 1,我可以看到page 2page 3 上显示的会话['rate'] 值。但如果我最后发布page 3 并进入page 1 填充会话['rate'] 并再次返回page 3page 3 将没有这个值。

第 1 页代码

<?php
session_start();
print_r($_SESSION);
$_SESSION['rate'] = 50;
echo "<br>".$_SESSION['rate']."<br>" ;
?>

第 2 页代码

<?php
session_start();
print_r($_SESSION);
echo "<br>".$_SESSION['rate']."<br>";
$_SESSION['rate'] = 10; //This change wont effect on page 1 if I re-visit it. 
?>

第 3 页代码

<?php
session_start();
print_r($_SESSION);
echo "<br>".$_SESSION['rate']."<br>";
?>

我也安装了“Native PHP Sessions for WordPress”插件,它声称 PHP 会话在 WordPress 中正常工作存在问题。但仍然没有帮助。您可以复制此代码并将其粘贴到 3 个不同的 WordPress 页面中,您仍然会看到问题。 (会话['rate'] 值基于我最后发布的页面。我尝试将 session_start(); 放在相应主题文件的header.php 文件中。仍然没有运气)。将以下代码放在function.php 文件上也无济于事:

function ses_init() 
   if (!session_id())
   session_start();

add_action('init','ses_init');

稍后,我希望用户使用会话保持登录状态。但是,如果会话不再与 WordPress 一起正常工作,这将是不可行的。

【问题讨论】:

如果您关注 cookie PHPSESSID 的值,您是否发现有问题(例如:值更改或 cookie 已删除)? 尝试在functions.php中将add_action('init','ses_init', 1);的优先级降低到1 感谢您的回复。我已经尝试降低优先级,但仍然有同样的问题。所有 3 个页面都显示具有相同的会话 ID。我的托管服务提供商是hostinger。当我复制此代码并将其粘贴到另一个使用 WordPress 的托管服务提供商时,此代码可以正常工作。我已尝试删除 WordPress 并在 hostinger 重新安装。我在hostinger 托管服务下拥有的两个网站的行为方式相同。 一些托管服务提供商不支持会话。请联系他们的支持或尝试使用 cookie。 【参考方案1】:

我建议在每个页面上打印会话 id 并确保其相同,否则您的 php 会话配置有问题,即每次都重新启动会话而不是恢复它。

您可以使用以下代码打印 id:

<?php
session_start();
echo session_id();

【讨论】:

感谢您的回复。它们都有相同的 session_id。如果您使用相同的代码创建 3 个单独的 WordPress 页面,您将看到我正在谈论的问题。感谢您对此进行调查。【参考方案2】:

我认为这不是会话问题。在我不得不使用的另一种 WP 应用程序中,我遇到了非常相似的事情。

根本原因是WP在优化页面的连接、流量和渲染方面煞费苦心。但是如果你的三个页面是通过 GET 方法访问的“正常”页面,那么它们将发布几个不“知道”内容更改的元数据(ETag、If-Modified-Since 标头等)。

不看网站我不能确定这是否是你的情况,但我可以告诉你我是如何解决我的问题的,这在某些方面与你的问题相似(我有一些页面 A 中更新的信息,可能需要显示在同一用户的页面 B 中,而显示的是旧版本。

通常我会修复缓存编译指示或used a cache-buster,也许你可以。我自己的情况略有不同——我没有完整地描述它——而且更复杂,所以我不能这样做。

相反,我所做的要复杂得多,但它工作得很好并且扩展性很好。用你的话来说,我把代码改成了

echo '<span id="rate"></span>';

并添加了一个 javascript 代码来进行 AJAX 调用,该调用读取 $_SESSION 值并将其放入范围中:

jQuery.post('/utilities/rate.php').then(reply => 
    jQuery('#rate').text(reply.rate);
);

rate.php 文件检索了会话,

<?php
    // Use readonly session to improve performances and avoid locks
    if (version_compare(PHP_VERSION, '7.0.0') >= 0) 
        session_start([ 'read_and_close' => true ]);
     else 
        session_start();
        session_write_close(); 
    
    $ret = [ 'rate' => $_SESSION['rate'] ];
    header('Content-Type: application/json;charset=utf-8');
    print json_encode($ret);

这允许我(这是另一个要求)定期更新信息(我在 Javascript 中使用 window.setTimeout),即使页面没有重新加载,或者数据在服务器端发生更改,只要它发生变化。

更新

只是为了验证,尝试是否可以从页面发送缓存标头 - 以及它们是否有效。

session_start();
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0");
header("Expires: Thu, 01 Jan 1970 00:00:00 GMT");

确认

它是某种类型的缓存(来自我怀疑“X-LiteSpeed Cache”的标题)。

如果我请求在 URL 中添加“?_=”和随机数的 a1 页面,我会按预期获得具有 50 速率值的更新页面。

它可能会在站点范围内被禁用,但随后站点会变慢。似乎有一些标头 can be used to disable the cache 用于特定请求。

试一试

header('X-Litespeed-Cache_Control: no-cache');

或 header('X-Litespeed-Cache_Control: no-store');

如果连这都行不通,我真的担心你需要考虑 AJAX 解决方案,或者丑陋的缓存破坏。

【讨论】:

您在 Hostinger 托管期间遇到问题的网站?当我在由不同托管公司托管的另一个网站上复制并粘贴此代码时,我的代码工作正常。以下是我正在使用 Hostinger 测试的 3 个页面:1) premiertechnologyhub.com/index.php/a1 2) premiertechnologyhub.com/index.php/a2 3) premiertechnologyhub.com/index.php/a3 我已尝试删除所有帐户并重置它们。尽管如此,PHP 会话仍无法正常使用它们。 不,它是一家意大利供应商。但是,由不同的网络公司托管的不同网站很可能具有不同的 Wordpress 配置 - 这将是关键。我尝试了你的链接,他们给出了 404 页面,所以我在 Hostinger 博客上四处查看,因为我怀疑他们对自己的系统使用的优化与对你的系统相同。而且,确实,我看到很多 304 缓存命中和(对我而言)不寻常的 CloudFlare 负载平衡标头。我很确定您在这里看到了缓存效果。 感谢您对此进行调查。我当时删除了我的帐户,看看它是否能解决问题。我已经重新安装了 WordPress。您现在可以查看这 3 个站点。在您答案的更新部分,您告诉我是否可以从页面发送缓存标头。你想让我把这些代码行放在这 3 页的顶部吗?如果是这样,我已经这样做了,您可以通过访问此处查看这 3 个页面:1)premiertechnologyhub.com/index.php/a1 2)premiertechnologyhub.com/index.php/a2 3)premiertechnologyhub.com/index.php/ a3 好的,页面 a1总是从自称为“X-LiteSpeed-Cache”的东西发送相同的 ETag 标头。作为一项新测试,我会尝试发送值为 uniqid() 的 ETag 标头,以便每次调用始终返回不同的值。如果页面仍然回复不变的 ETag,那么这是一个大问题,我们需要覆盖 Litespeed 缓存或使用 AJAX 解决方案。如果我调用 a1 页面添加 cachebuster (".../a1?_=123456") 那么它似乎工作,但那是 aaaawkward 非常感谢您的帮助。你是救生员。在 WordPress 上,托管商已安装了“LiteSpeed Cache”应用程序。停用此应用程序并没有解决问题。通过转到“LiteSpeed Cache”应用程序的设置并关闭“启用缓存”选项来解决此问题。再次感谢您的时间和所有详细的解释。非常感谢。【参考方案3】:

问题:为什么要在每个页面上开始一个新会话?如果你尝试过:

if (session_status() == PHP_SESSION_NONE) 
session_start();
$_SESSION['rate'] = 10;
else
echo "<br>".$_SESSION['rate']."<br>" ;

如果只是将值写入 cookie,那就更容易了

【讨论】:

以上是关于PHP会话不适用于多个WordPress页面的主要内容,如果未能解决你的问题,请参考以下文章

wordpress 搜索不适用于多个单词

Bootstrap 不适用于 wordpress 插件

php 通过代码在WordPress中创建一个新的管理员用户。将此文件放在mu-plugins目录中并更新变量,然后在Wor中加载页面

会话不适用于 ajaxRequest [如何使用会话变量计算 ajax 请求]

og:图像不适用于 wordpress 页面

Codeigniter 会话不适用于 PHP 7