SoaringHawk
Постоялец
- Регистрация
 - 25 Апр 2009
 
- Сообщения
 - 61
 
- Реакции
 - 2
 
- Автор темы
 - #1
 
Есть класс Для просмотра ссылки Войди или  Зарегистрируйся
Необходимо учитывать переданный трафик. К функции send прикрутил mysql запрос:
	
		
Но проблема в том, что по окончании передачи, "received" в базе не сходится с размером передаваемого файла. Например, файл весит 594518108 байт, а в безе записано 634203857 
 
Эмпирически выяснилось, что до момента одобрения пользователем закачки, или браузер, или какой-либо DL-менеджер успевает слить в бефер определенный кусок.
Для примера:
Тестил с "Download Master"-ом. Добавляю ссылку на закачку, появляется менюшка выбора куда сохранять и вот в этот момент (пока я выбирал папку назначения) мастер уже загрузил 42991616 байта... После того, как я стартанул закачку он по новой закачал весь файл т.е. 594518108 байт. В итоге и получалось, что фактически было передано 637509724 байта.
Может у кого появятся соображения, как можно "правильно" учитывать сколько пользователь скачал по этой временной ссылке. Это нужно для того, что бы не ограничивать клиента по времени, а ссылку "убивать" когда он полностью скачает файл.
	
		
			
		
		
	
				
			Необходимо учитывать переданный трафик. К функции send прикрутил mysql запрос:
		PHP:
	
	            $bufSize_portion = 0;
            while ( !feof($fd) && (connection_status() == CON_STATUS_NORMAL) )
            {
                $contents = fread ($fd, $this->bufSize);
                echo $contents;
                //$this->updateDB(strlen($contents));
                $bufSize_portion += strlen($contents);
                // обновляем каждый мегабайт скачанного
                if($bufSize_portion >= 1024 * 1024 * 1)
                {
                    //$this->updateDB($bufSize_portion);
                    //$bufSize_portion = 0;
                }
            }
            fclose ($fd);
            // финальное обновление 
            $this->updateDB($bufSize_portion);
            $bufSize_portion = 0;
        }
    } // end function send
    
    function updateDB($bufSize)
    {
        $this->mysql->query("UPDATE `table` SET received=received+".$bufSize." WHERE `key`='".$key."' LIMIT 1");
    }
	
 Эмпирически выяснилось, что до момента одобрения пользователем закачки, или браузер, или какой-либо DL-менеджер успевает слить в бефер определенный кусок.
Для примера:
Тестил с "Download Master"-ом. Добавляю ссылку на закачку, появляется менюшка выбора куда сохранять и вот в этот момент (пока я выбирал папку назначения) мастер уже загрузил 42991616 байта... После того, как я стартанул закачку он по новой закачал весь файл т.е. 594518108 байт. В итоге и получалось, что фактически было передано 637509724 байта.

Может у кого появятся соображения, как можно "правильно" учитывать сколько пользователь скачал по этой временной ссылке. Это нужно для того, что бы не ограничивать клиента по времени, а ссылку "убивать" когда он полностью скачает файл.
				
 Особенно при перехвате закачек всякими менеджерами. С мелкими файлами, бродилки успевают скинуть в свой буфер весь файл целиком, а уже после DL менеджер по сути снова качает тот же файл.