【问题标题】:Unlink() doesnt remove fileUnlink() 不删除文件
【发布时间】:2014-04-26 09:35:58
【问题描述】:

我在 logout.php 中有这段代码

  session_start(); 
  $FileLink = 'tmp/sess_'.session_id();
      //echo $FileLink ; shows the tmp/sess_3386911cc664626ffb3664c478c8ad55 file
  unlink($FileLink); 
  session_unset();
  session_destroy();

我读过很多帖子都说相同的方法但是我没有删除会话文件。

有什么问题吗?

我什么都试过了。 if is file , iswritable , is readable , is path , 将路径更改为完整路径,没有任何效果,只是会话未设置,文件将为 0 字节但不会被删除。

有什么建议吗?

编辑我的 php.ini

  session.save_handler = "files"
  session.save_path = "/home/website/public_html/gallery/tmp"
  session.use_cookies = 1
  session.use_only_cookies = 1
  session.name = "PHPSESSID"
  session.auto_start = 0
  session.cookie_lifetime = 0
  session.cookie_path = "/"
  session.cookie_domain = ""
  session.cookie_httponly = ""
  session.serialize_handler = "php"
  session.gc_probability = 1
  session.gc_divisor = 1000
  session.gc_maxlifetime = 1440
  session.bug_compat_42 = ""
  session.bug_compat_warn = ""
  session.referer_check = ""
  session.entropy_length = 0
  session.cache_limiter = "nocache"
  session.cache_expire = 180
  session.use_trans_sid = 0
  session.hash_function = 0
  session.hash_bits_per_character = 5

EDIT2 文件夹权限

tmp 文件夹是 755 ,尝试使用 777 仍然相同,即使文件是可读或可写的,我也确实如此。

【问题讨论】:

  • 我认为tmp是系统tmp,位于根目录,即:/tmp,不是tmp。
  • 我已经更改了完整路径,但它是错误的。
  • 尝试先取消设置销毁,再取消链接?
  • 在这方面花费了数小时,并阅读了所有相同的 SO 帖子。
  • 只是出于好奇,会话文件的标准 PHP 垃圾收集有什么问题?

标签: php file session unlink


【解决方案1】:

您使用的是什么操作系统,我在这里看到一个非 utf8 字符:

echo $FileLink ; shows the tmp/sess_hkhgdfhghgöfhghggsöh file

我知道在 ubuntu 上这些字符会被替换为 ?马克,这可能是问题吗?

尝试以下任一方法:

1) 对文件夹执行 readdir 并输出文件名:

if ($handle = opendir('tmp')) {
    while (false !== ($entry = readdir($handle))) {
        echo "$entry\n";
    }
    closedir($handle);
}

2) 将非字母数字替换为问号:

$FileLink = preg_replace("/[^A-Za-z0-9 ]/", '?', $FileLink);
unlink($FileLink); 

最终,session_id() 给您非 utf8 字符存在问题,我现在正在调查。

3) 通过设置无效 ID 将文件所有权设置为 NoBody:

chown($FileLink, 666);

4) 在创建会话之前自己创建会话文件:

$fp = fopen('tmp/sess_3386911cc664626ffb3664c478c8ad55', 'w+');
fclose($fp);
session_id('3386911cc664626ffb3664c478c8ad55');
session_start();

您可以复制 PHP 用来创建会话名称的算法。我希望删除之后应该可以正常工作。

【讨论】:

  • 我在 sess_filename 中没有特殊字符。它只是在键盘上输入:)
  • 能否贴出实际的会话名称,是手动设置会话名称还是系统设置?
  • @echo_Me 在取消链接之前尝试以下操作:chown($FileLink, 666);
  • 我收到了这个Warning: chown(): Operation not permitted
  • 这意味着您没有删除文件的权限。您可以做什么,在您创建会话之前,创建会话文件并将 ID 设置为该文件(因为您创建了您可以访问它)。更多信息在这里:stackoverflow.com/questions/10723599/…。添加了有关如何执行此操作的示例。
【解决方案2】:

仅用于测试目的。

我不知道这是否有用,但我下面的测试代码证明是成功的。

<?php
session_start();

$ses_id = session_id();
echo $ses_id;

$filename = 'test_folder/sess_'.$ses_id;
$fp = fopen($filename, 'w');
fwrite($fp,"");
fclose($fp);

unlink($filename);

编辑

此时我能想到的是,您可以尝试从上一页获取会话的变量,然后它可能看起来像:

[首页]

session_start(); 
$ses_id = "sess_" .session_id();

echo '<a href="check_session.php">Check session</a>';

[退出页面]

session_start(); 
$FileLink = 'tmp/sess_'.$ses_id;

unlink($FileLink); 
session_unset();
session_destroy();

[检查会话] (check_session.php)

<?php
session_start();

if(!empty($_SESSION)){
    echo "sess_" .session_id();
}

【讨论】:

  • 我明白你想要做什么,但是文件没有被删除,我很紧张。
  • 我本来想制作一个更好的脚本,但我无法访问服务器上的实际会话文件(出于某种原因)...这是我最接近复制问题的方法。 @echo_Me 我现在很茫然,但是如果我想到其他任何事情,我会及时通知您。所以,做一个简单的回声不会显示任何东西是吗? 嗯... 最奇怪的。
  • :),我非常感谢你的努力,伙计:),这花了我 1 天时间:(。
  • 不客气,我的朋友。我在另一条评论中注意到您正在使用 Windows 服务器。您可能需要设置特殊权限。我自己在一个 Unix 机器上,所以对我来说更容易。 @echo_Me
  • windows xp 我正在使用,但是这个网站是在线的而不是在本地主机中。
猜你喜欢
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 2023-03-06
  • 2013-03-03
相关资源
最近更新 更多