BAZIL
Новичок
Ограничение количества соединений средствами PHP
Нужно сделать такой финт ушами, чтобы пользователь не мог параллельно обращаться к скрипту более одного раза. Смысл этого сводится к тому, что скрипт, на который нужно поставить ограничение - выдаёт файлы достаточно большого размера (350-400 МБ). Выдача файла в 5-10 потоков через этот скрипт приводит к созданию соответствующего количества процессов php-cgi.exe (всё это работает на Windows 2003 Server + IIS + PHP 5.2.1 + MySQL). Ограничение приведёт к тому, что соединившаяся и запустившая первый поток качалка второй, третий... десятый создать уже не сможет, потому как скрипт будет блокировать её обращения.
Вопрос: можно ли это сделать средствами PHP? Или же здесь возможно решение только через настройку Web-сервера?
Я накидал парочку примеров, один из которых частично работает, а второй не работает вовсе.
Этот код срабатывает только при полной загрузке файла на компьютер пользователя. То есть запись с IP-адресом благополучно удаляется из базы.
Были ещё варианты с
и
но они не работали вовсе.
Подскажите, пожалуйста. Может быть я копаю не в том направлении? Или же что-то неверно в коде? Или же эту проблему можно решить как то иначе?
Нужно сделать такой финт ушами, чтобы пользователь не мог параллельно обращаться к скрипту более одного раза. Смысл этого сводится к тому, что скрипт, на который нужно поставить ограничение - выдаёт файлы достаточно большого размера (350-400 МБ). Выдача файла в 5-10 потоков через этот скрипт приводит к созданию соответствующего количества процессов php-cgi.exe (всё это работает на Windows 2003 Server + IIS + PHP 5.2.1 + MySQL). Ограничение приведёт к тому, что соединившаяся и запустившая первый поток качалка второй, третий... десятый создать уже не сможет, потому как скрипт будет блокировать её обращения.
Вопрос: можно ли это сделать средствами PHP? Или же здесь возможно решение только через настройку Web-сервера?
Я накидал парочку примеров, один из которых частично работает, а второй не работает вовсе.
PHP:
<?php
require_once("../class/class.php");
function clear() {
$ip = $_SERVER["REMOTE_ADDR"];
$host = "localhost";
$login = "login";
$password = "passwd";
$dbname = "base";
$query = "DELETE FROM `connections` WHERE `ip` = '$ip' LIMIT 1";
$db = mysql_connect($host,$login,$password);
mysql_select_db($dbname,$db);
mysql_query($query,$db);
}
$ip = $_SERVER[REMOTE_ADDR];
while($row = mysql_fetch_array($mysql_check)){
if($ip == $row["ip"]){
header("Location: /");
exit();
}
}
$con->action("INSERT INTO connections (ip) VALUES ('$ip')");
$path2 = "путь_к_файлу";
$size = filesize($path2);
$ftime = date("D, d M Y H:i:s T", filemtime($path2));
$fd = @fopen($path2, "rb");
if ($_SERVER["HTTP_RANGE"]){
$range = $_SERVER["HTTP_RANGE"];
$range = str_replace("bytes=", "", $range);
$range = str_replace("-", "", $range);
if ($range) {
fseek($fd, $range);
}
}
fclose($fd);
if (@$range){
header("HTTP/1.1 206 Partial Content");
}else {
header("HTTP/1.1 200 OK");
}
header("Content-Type: application/x-download");
header("Content-Transfer-Encoding: binary\r\n");
header("Accept-Ranges: bytes");
header("Content-Disposition: attachment; filename=имя_файла");
header("Last-Modified: $ftime");
header("Content-Length: ".($size-$range));
header("Content-Range: bytes $range-".($size -1)."/".$size);
header("Content-type: application/octet-stream");
readfile($path2);
register_shutdown_function("clear");
?>
Были ещё варианты с
PHP:
connection_status() != 0
PHP:
connection_aborted()
Подскажите, пожалуйста. Может быть я копаю не в том направлении? Или же что-то неверно в коде? Или же эту проблему можно решить как то иначе?