<?
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 上的托管上进行了测试。
如果你把它放在
sleep(2)
后面unlink
,你可以看到文件实际上被删除了,但是在这 2 秒之后它又出现了!但是,如果函数代码中没有其他内容并且
curl_close
调用成功,那么是什么创建了它呢?在这里我们打开文档:
...哎哟。
事实证明,
$ch
只有当变量的值被销毁时,它才会关闭,在这段代码中,这仅在函数退出后发生。并且 cookie 文件是在关闭时写入的,如文档 CURLOPT_COOKIEJAR中所述。这也解释了问题“在函数外部使用 unlink() 时不会发生此事件”问题的作者所说的行为——函数外部
$ch
不再存在,并且没有人重新创建文件。根据文档,我们将在需要时通过手动销毁 after但 before 的
$ch
变量来关闭:curl_close
unlink
并且不再重新创建该文件。