Ограничение количества соединений средствами PHP

BAZIL

Новичок
Ограничение количества соединений средствами PHP

Нужно сделать такой финт ушами, чтобы пользователь не мог параллельно обращаться к скрипту более одного раза. Смысл этого сводится к тому, что скрипт, на который нужно поставить ограничение - выдаёт файлы достаточно большого размера (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");

?>
Этот код срабатывает только при полной загрузке файла на компьютер пользователя. То есть запись с IP-адресом благополучно удаляется из базы.

Были ещё варианты с
PHP:
connection_status() != 0
и
PHP:
connection_aborted()
но они не работали вовсе.

Подскажите, пожалуйста. Может быть я копаю не в том направлении? Или же что-то неверно в коде? Или же эту проблему можно решить как то иначе?
 

Юра Руднев

Новичок
Я бы копал в сторону сессий и кукисов, но я - тролль, но щас глумиться не буду - достало.
 

kostya.sys

Новичок
для отдачи скриптом файла в несколько потоков необходимо обробатывать содержимое заголовков HTTP_RANGE в запросе

убрав эту поддержку из своего скрипта, а так же убрав заголовки ответа
Accept-Ranges: bytes
Content-Range: 123123-12312312
ты ограничишь закачку одним потоком, так как клиенту не сказано что можно забирать файл по кускам.

минус правда что докачка перестанет быть возможной.

А вообще отдавать файл скриптом - тупая идея
 

BAZIL

Новичок
Юра Руднев
Каким макаром? Сессии? Тем более куки?

kostya.sys
минус правда что докачка перестанет быть возможной.
Да, знаю, нужна также возможность докачки файла.

А вообще отдавать файл скриптом - тупая идея
С чего же это вдруг тупая?
 
Сверху