RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1598445
Accepted
user501848
user501848
Asked:2024-11-01 05:54:11 +0000 UTC2024-11-01 05:54:11 +0000 UTC 2024-11-01 05:54:11 +0000 UTC

为什么在使用curl 的函数内调用unlink() 后cookie 文件仍然存在?

  • 772
<?
  function request($url, $method = 'GET', $fields = null, $cookiesPath = null, $keepCookies = true) {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    if (strtoupper($method) === 'GET' && $fields) {
      $url .= '?' . http_build_query($fields);
      curl_setopt($ch, CURLOPT_URL, $url);
    } else if (strtoupper($method) === 'POST') {
      curl_setopt($ch, CURLOPT_POST, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
      curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
        'Content-Length: ' . strlen(json_encode($fields))
      ]);
    }

    if (!$cookiesPath) {
      $cookiesRandomName = substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyz', ceil(30 / 36))), 0, 30);
      $cookiesPath = __DIR__ . $cookiesRandomName . '.txt';
    }

    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiesPath);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiesPath);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);

    $response = curl_exec($ch);

    if ($errorCode = curl_errno($ch)) {
      $errorMessage = curl_error($ch);
        
      curl_close($ch);

      if (file_exists($cookiesPath)) {
        unlink($cookiesPath);
      }

      return [ 'error' => [ 'code' => $errorCode, 'message' => $errorMessage ] ];
    }

    $HTTP_CODE = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);

    if ($keepCookies) {
      return [ 'HTTP_CODE' => $HTTP_CODE, 'response' => json_decode($response, true), 'cookiesPath' => $cookiesPath ];
    } else {
      if (file_exists($cookiesPath)) {
        unlink($cookiesPath); // Место ошибки
      }

      return [ 'HTTP_CODE' => $HTTP_CODE, 'response' => json_decode($response, true) ];
    }
  }

我正在编写一个 PHP 脚本,它使用 request() 函数发出 HTTP 请求。在此函数内,我尝试使用 unlink() 删除临时 cookie 文件,但尽管该函数返回成功删除消息,但该文件仍存在于磁盘上。使用示例:

$response = request('https://example.com/login', 'post', [ 'login' => 'name', 'password' => 'hash' ]);
$response = request('https://example.com/profile', 'get', null, $response['cookiesPath'], false);

令人惊讶的是,当 unlink() 在函数外部使用时,不会发生此类事件。一般来说,有趣的行为和最大的陌生感。使用适用于 Windows 11 的 XAMPP。还在 Apache/2.4.6 上的托管上进行了测试。

php
  • 1 1 个回答
  • 77 Views

1 个回答

  • Voted
  1. Best Answer
    andreymal
    2024-11-01T19:10:19Z2024-11-01T19:10:19Z

    如果你把它放在sleep(2)后面unlink,你可以看到文件实际上被删除了,但是在这 2 秒之后它又出现了!

    但是,如果函数代码中没有其他内容并且curl_close调用成功,那么是什么创建了它呢?

    在这里我们打开文档:

    该功能已变得无用。在 PHP 8.0.0 之前,该函数关闭资源。

    ...哎哟。

    事实证明,$ch只有当变量的值被销毁时,它才会关闭,在这段代码中,这仅在函数退出后发生。并且 cookie 文件是在关闭时写入的,如文档 CURLOPT_COOKIEJAR中所述。

    这也解释了问题“在函数外部使用 unlink() 时不会发生此事件”问题的作者所说的行为——函数外部$ch不再存在,并且没有人重新创建文件。

    根据文档,我们将在需要时通过手动销毁 after但 before 的$ch变量来关闭:curl_closeunlink

        curl_close($ch);
    
        unset($ch); // !
    
        if ($keepCookies) {
    

    并且不再重新创建该文件。

    • 2

相关问题

  • mysqli 类的对象无法转换为字符串

  • 您的系统中缺少 ext-http *,您的系统中缺少 ext-mysql_xdevapi *

  • 如何从csv中删除bom?

  • 当我按下 Enter 键时,如何让 PhpStorm 的 Emmet 插件触发,就像 VS Code 一样?

  • 注释在 Symfony5 中不起作用

  • 搜索最近的地理位置点

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5