我在这里有这段代码,允许用户通过我的服务器下载文件:
$ch_2 = curl_init();
curl_setopt($ch_2, CURLOPT_USERAGENT, 'Mozilla/4.0');
curl_setopt($ch_2, CURLOPT_URL, $download_link);
curl_setopt($ch_2, CURLOPT_AUTOREFERER, true);
curl_setopt($ch_2, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch_2, CURLOPT_COOKIESESSION, false);
curl_setopt($ch_2, CURLOPT_FAILONERROR, true);
curl_setopt($ch_2, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch_2, CURLOPT_FORBID_REUSE, true);
curl_setopt($ch_2, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch_2, CURLOPT_NOSIGNAL, true);
curl_setopt($ch_2, CURLOPT_RETURNTRANSFER, false);
curl_setopt($ch_2, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($ch_2, CURLOPT_TIMEOUT, 86400);
curl_setopt($ch_2, CURLOPT_LOW_SPEED_LIMIT, 10240);
curl_setopt($ch_2, CURLOPT_LOW_SPEED_TIME, 60);
curl_setopt($ch_2, CURLOPT_MAX_RECV_SPEED_LARGE, 500);
curl_exec($ch_2);
$curl_errno_2 = curl_errno($ch_2);
curl_close($ch_2);
这些文件(链接在 $download_link 中)非常大,大约 1-3 GB。
此代码工作正常,但我的问题是,当用户断开连接或中止下载时,脚本不会停止,直到服务器收到完整文件($download_link)。
如果我设置“ignore_user_abort(true)”,那么脚本会停止,但是是否可以在脚本中检查客户端断开连接或下载中止并且可以处理这个问题?例如,更新MySQL数据库条目或其他内容?
我知道我可以通过使用“readfile()”或 fopen、fread 来更改此代码,但我将(并且必须)使用此cURL代码。
是否可以检查此用户断开连接或下载中止,因为我只允许用户每个IP 地址建立一个下载连接?因此,如果他们中止下载,我将无法更新我的 MySQL 数据库以管理来自该 IP 地址的下载连接。