代码之家  ›  专栏  ›  技术社区  ›  Suffii

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

  •  0
  • Suffii  · 技术社区  · 10 年前

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

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

    <?
    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); 
    

    谢谢

    4 回复  |  直到 9 年前
        1
  •  1
  •   Iłya Bursov    10 年前

    简短回答:

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

    长答案:

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

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

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

    下一步-您可以调用session_delete,它只删除文件(db记录等)。所以,下次浏览器使用旧cookie调用我们时,我们将什么都不读,即会话为空。

    会话可以自动过期,这是由php内部完成的(我想是由内部线程或其他机制完成的),要做到这一点,php存储每个会话的最后访问(读取)时间,并且当某个会话文件在一段时间内未被触摸时(可配置参数)-该文件被删除。 Php此时不会调用您的代码 因此,当php结束会话时,不可能删除某些内容。

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

    1. 将文件内容存储在会话阵列而不是文件系统中
    2. 重新发明轮子,在某个文件夹中为每个会话创建唯一的文件名,修改每次页面点击的最后访问时间,在脚本结束时删除所有长期未修改的文件
        2
  •  0
  •   Shamal Sandeep    10 年前

    您可以使用unlink函数在PHP中简单地检测文件,

    unlink('test.html');
    

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

    chmod('/var/www/html', 0750);
    
        3
  •  0
  •   grant sun    10 年前

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

        4
  •  0
  •   Arthur    6 年前

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