繁体   English   中英

会话结束后从服务器删除文件

[英]Deleting File From Server After Session Ends

您能告诉我在用户关闭浏览器或注销时如何在会话结束后从服务器中删除文件吗?

从下面的代码中可以看到,我正在尝试创建一个文件来在服务器上存储一些查询结果,并将其保存到会话运行为止,然后最终仅在会话结束后才将其删除。

<?
php session_start();

$info = "testFile.txt";
$ourFileHandle = fopen($info, 'w') or die("can't open file");
fclose($ourFileHandle);

// How to Delete a File When Session Ends on User closes the Browser or Log out
session_destroy();
$theFile = "info.txt";
$fh = fopen($theFile, 'w') or die("can't open file");
fclose($fh); 

谢谢

简短答案:

这是不可能的,因为会话结束时不会执行php代码

长答案:

首先,您需要了解会话如何工作,会话实际上何时结束?

当用户关闭浏览器时-php会话未关闭,当用户注销时-php会话未关闭。

PHP会话基本上是用户首次打开站点时生成的名称的文件。 该文件名作为cookie存储在用户的浏览器中。 对于每个请求,浏览器都发送此cookie,并在代码中调用session_start时-从http请求中读取此cookie,将打开具有该名称的文件并将其加载到内存中。 (注意:会话可以存储在内存缓存,数据库等中)

下一步-您可以调用session_destroy,它只会删除文件(数据库记录等)。 因此,下次浏览器使用旧Cookie致电给我们时-我们将不会读取任何内容,即会话为空。

会话可以自动到期,它是由php在内部完成的(我想是通过内部线程或其他某种机制执行的),以使php存储每个会话的上次访问(读取)时间以及某个会话文件一段时间没有被触摸(可配置)参数)-此文件已删除。 php目前不会调用您的代码,因此在php结束会话时无法删除某些内容。

因此,要解决您的问题,您可以:

  1. 将文件内容存储在会话数组中,而不是文件系统中
  2. 重新发明方向盘并在某个文件夹中为每个会话创建唯一的文件名,在脚本末尾修改每个页面命中的上次访问时间-删除所有长时间未修改的文件

您只需使用unlink函数在PHP中检测文件,

unlink('test.html');

确保已授予php所需的权限,

chmod('/var/www/html', 0750);

如果用户确实注销,请在执行注销操作后删除文件。 或者您可以运行一个小脚本来检查会话是否有效(您可以记录一个标志以检查用户是否在处理中),然后删除关联的文件。

您可以编写一个自定义会话处理程序,并通过session_set_save_handler()配置。 从默认的SessionHandler扩展您的处理程序,并覆盖destroy()gc()方法。 更多信息: http : //php.net/manual/zh/class.sessionhandler.php

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM