【问题标题】:PHP Active Session Warning in wordpresswordpress 中的 PHP 活动会话警告
【发布时间】:2022-01-13 12:12:31
【问题描述】:

我知道这个问题在这个论坛上经常被问到,但没有一个建议的解决方案对我有用,基本上,我是一名 WordPress 插件开发人员,正在开发一个插件,其会话在 init 文件中开始,但在客户端关闭时关闭他/她的浏览器,并且有必要保持会话打开。在这种情况下,我怎样才能摆脱这个警告?也许我应该使用会话或您建议之外的其他内容。

到目前为止,有不同的建议解决方案,例如使用

if ( !session_id() ) {
session_start( [
    'read_and_close' => true,
] );

}

但是使用这种技术,我永远无法在我的插件中使用会话,并且整个功能都在实际运行中。

在这方面的任何帮助将不胜感激。

谢谢

【问题讨论】:

  • “我怎样才能摆脱这个警告” - 什么警告?请逐字引用错误消息。
  • @cBroe 这里是警告 1. PHP 会话是由 session_start() 函数调用创建的。这会干扰 REST API 和环回请求。在发出任何 HTTP 请求之前,会话应该由 session_write_close() 关闭。 2. REST API 是 WordPress 和其他应用程序与服务器通信的一种方式。一个例子是块编辑器屏幕,它依靠它来显示和保存您的帖子和页面。 REST API 请求因错误而失败。错误:cURL 错误 28:操作在 10001 毫秒后超时,收到 0 个字节(http_request_failed)

标签: php wordpress plugins


【解决方案1】:

WordPress 插件或主题开发者无法使用 php 的 session 子系统,正如您所发现的那样。

如果您需要为插件工作保存某种全局上下文,请使用 WordPress 的 add_option() 函数在每次操作结束时保存它。您可以使用get_option() 检索您的上下文。

如果您需要每个用户的上下文,请使用 add_user_meta() 保存它并使用 get_user_meta() 检索它。像这样:

$id = get_current_user_id();
$myContext = get_user_meta( $id, 'my_plugins_meta_tag_name' );
...
add_user_meta( $id, 'my_plugins_meta_tag_name', $myContext);

WordPress 使用数据库表来存储这些选项。一些站点在表格前面放置了一个对象缓存。但这些 API 是您做自己想做的事的方式。

在您插件的停用挂钩中,请考虑调用delete_option() 来清理该存储空间。而且,如果您使用每个用户的上下文,请考虑使用 delete_user_meta() 从所有上下文中删除您的 user_meta 项。

$users = get_users( array( 'fields' => array( 'ID' ) ) );
foreach($users as $user){
    delete_user_meta ( $user->ID, 'my_plugins_meta_tag_name' );
}

至于敏感信息,WordPress 没有其他地方可以放置它。而且,如果您使用会话,php 也需要将它放在某个地方。默认情况下,php 将会话数据放在服务器的文件系统中。这就是为什么在存储它们之前使用 WordPress hashes user passwords

【讨论】:

  • @Jones 感谢您的建议,我也有同样的想法,但是否建议在 WP 选项中保存敏感信息?
  • 非常感谢@O.Jones 的详细回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2015-05-21
  • 2018-02-11
相关资源
最近更新 更多