Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przydzial miejsca na hdd w apachu
Forum PHP.pl > Forum > Serwery WWW > Apache
Jarko
Mam pytanie. Jak w apachu przydziel wybranemu użytkownikowi konkretną ilość miejsca na dysku i/lub określić maksymalną wielkości pojedynczego pliku jaki może na serwerze umieścić?
bumelang
Obawiam się, że jeśli chodzi o to, to Apache nie ma na to wpływu, bo przecież i tak Twój użytkownik będzie ładował swoje pliki przez FTP albo SCP. Stąd - jeśli system operacyjny to Linux czy jakiś UNIX - ograniczenie wprowadza się na jego poziomie i nazywa się to quota; po to, żeby - niezależnie od sposobu w jaki Twój użytkownik wgrywa pliki, nie chapnął więcej, niż mu się należy. Ale to już chyba temat nie na to forum i z resztą wystarczy rzeczoną quotę wpisać do google'a a on już Ci powie, jak to dokładnie zrobić.
Bakus
To zależy... pod wingrozą nie masz jako takiej quoty...
Przydział partycji nie działa dla takich zastosowań...

Natomiast masa serwerów FTP dla windowsa posiada ograniczenie wialkości plików jakie są przesyłane na serwer...

Rezultat jest dobry, ale...

Powierzenie tego serwerowi FTP nie ma jednak sensu, w przypadkach gdy daje się użytkownikom inną możliwość umieszczania plików na serwerze...
Jarko
Hmmm a można by podejść od drugiej strony. To znaczy np. zakładając że użytkownik przekroczy swój limit miejsca na serwerze to w takiej sytuacji zamiast tego co on chce żeby się wyświetlało, ukaże się jakaś inna strona (wcześniej przygotowana i umieszczona w odrębnym katalogu do którego nie ma dostępu użytkownik) np. z informacją o przekroczeniu limitu?

P.S. Coś mi się wydaje że mnie fantazja ponosi smile.gif no ale nigdy nic nie wiadomo i może da się takie coś zrobić smile.gif
Bakus
Co jakiś czas sprawdzasz ile miejsca zajmuje jego katalog. W razie przekroczenia dopuszczalnej wartości serwujesz stronę o błędzie (np. podmieniając jego katalog na "75yrhd73jr", czy coś w tym stylu, blokując jego konto i wstawiając nowy katalog z jednym plikiem - index.htm - twoją stroną błędu...)

$1. Znacznie prościej napisać w regulaminie, że dopuszczalną wielkością konta jest ....... MB
$2. W przypadku złamania zasad regulaminu konto może zostać wyczyszczone...

Złamanie punktu 1 będzie stanowiło upoważnienie Twojej osoby do usunięcia danych z konta...

lub inna propozycja do regulaminu:
$1. W przypadku przekroczenia dopuszczalnej wielkości konto może zostać bez powiadomoenia wyczyszczone, lub usunięte...

J/w tyle tylko, że w jednym punkcie... winksmiley.jpg

Możesz też wrzucić do menedżera zadań/crona by skrypt (nie nalegam, by był w php winksmiley.jpg ) sprawdzał ile miejsca zajmują konta i w razie potrzeby dodawał by do katalogu plik .htaccess w którym zmieniałbyś DocumentIndex na np. "brak.miejsca.htm" czy coś w tym stylu...
Jarko
Regulamin to już swoją drogą biggrin.gif
Skrypt był by chyba najlepszym rozwiązaniem ze względu na to że chciał bym aby działo się to raczej automatycznie bo wiadomo że nie zawsze będzie czas żeby sprawdzać. Żeby jak np. gdzieś wyjadę nie zabrakło miejsca na serwerze. Aha czy jest szansa żeby gdzieś chociaż znaleźć zalążek takiego skryptu czy ti raczej trzeba będzie samemu napisać bo przyznam się szczerze nie mam za bardzo pomysłu jak to ruszyć. Może dlatego że jestem dopiero na początku swojej przeprawy przez chociażby php winksmiley.jpg

Aha i dzięki za dotychczasową pomoc bo zgodnie z radą jak do tej pory znalazłem serwer ftp (nawet darmowy biggrin.gif) który z tego co zauważyłem daje możliwość określenia wielkości plików.
Bakus
Po południu wrzuce gotowca... też mi się przyda, więc zacząłem go pisać...

UPDATED:
No... brak czasu spowodował przeciągnięcie się "projektu"... Ale nie zniechęcajci się... może w końcu coś wypłodzę...
Bakus
[php:1:4cd1208c37]<?
// quota class v1.0
// Copyright©2004 by Krzysztof Andrzej Błachut [Bakus]
// E-Mail: kab@o2.pl
// All rights reserved



// error_reporting(E_ALL);

ob_start();
clearstatcache();

class quota
{
var $katalog = '';
var $user = '';
var $rozmiar = 0;
var $rozmiar_kb = 0;
var $rozmiar_mb = 0;
var $max_rozmiar = 0;

function pokaz($dir)
{
if ($dh = opendir($dir))
{
while (($file = readdir($dh)) !== false)
{
if($file != '.' && $file != '..')
{
if(is_dir($dir . $file . ''))
{
$this->pokaz($dir . $file . '');
}else{
$this->rozmiar += filesize($dir . $file);
}
}
}
closedir($dh);
}
}

function przelicz()
{
$this->pokaz($this->katalog . '');
$this->rozmiar_kb = round($this->rozmiar/1024, 2);
$this->rozmiar_mb = round($this->rozmiar_kb/1024, 2);
}

function pokaz_postep()
{
$wolne = $this->max_rozmiar - $this->rozmiar_mb;
$zajete = $this->rozmiar_mb;
$cale = $this->max_rozmiar;
$wolne_procent = round(($wolne/$cale)*100, 2);
$zajete_procent = round(($zajete/$cale)*100, 2);
print '<TABLE ALIGN="CENTER" WIDTH="335" BORDER="0" STYLE="font-family: Verdana, Tahoma, MS Sans Serif; font-size: 10pt;';
if($wolne <= 0) print ' background: #FF8040;"'; else print ' background: #FFFFFF;"';
print '">'."n";
print '<TR><TD ALIGN="CENTER" COLSPAN="5"><B>'.$this->user.'</B></TD></TR>'."n";
print '<TR><TD WIDTH="5" ROWSPAN="4">&nbsp;</TD><TD WIDTH="125"';
if($wolne <= 0) print ' STYLE="color: #FFFFFF;"';
print '>Miejsce wolne:</TD><TD ALIGN="RIGHT"';
if($wolne <= 0) print ' STYLE="color: #FFFFFF;"';
print '>'.number_format($wolne, 2, '.', ' ').'&nbsp;MB</TD><TD ALIGN="RIGHT"';
if($wolne <= 0) print ' STYLE="color: #FFFFFF;"';
print '>'.number_format($wolne_procent, 2, '.', ' ').'&nbsp;%</TD><TD WIDTH="5" ROWSPAN="4">&nbsp;</TD></TR>'."n";
print '<TR><TD WIDTH="125"';
if($wolne <= 0) print ' STYLE="color: #FFFFFF;"';
print '>Miejsce zajęte:</TD><TD ALIGN="RIGHT"';
if($wolne <= 0) print ' STYLE="color: #FFFFFF;"';
print '>'.number_format($zajete, 2, '.', ' ').'&nbsp;MB</TD><TD ALIGN="RIGHT"';
if($wolne <= 0) print ' STYLE="color: #FFFFFF;"';
print '>'.number_format($zajete_procent, 2, '.', ' ').'&nbsp;%</TD></TR>'."n";
print '<TR><TD WIDTH="125"';
if($wolne <= 0) print ' STYLE="color: #FFFFFF;"';
print '>Miejsce całkowite:</TD><TD ALIGN="RIGHT"';
if($wolne <= 0) print ' STYLE="color: #FFFFFF;"';
print '>'.number_format($cale, 2, '.', ' ').'&nbsp;MB</TD><TD ALIGN="RIGHT"';
if($wolne <= 0) print ' STYLE="color: #FFFFFF;"';
print '>'.number_format(($wolne_procent+$zajete_procent), 2, '.', ' ').'&nbsp;%</TD></TR>'."n";
if($zajete_procent <= 100)
print '<TR><TD ALIGN="CENTER" HEIGHT="15" COLSPAN="3"><IMG SRC="./stan.gif" WIDTH="'.round(($zajete_procent * 2), 0).'" HEIGHT="6" BORDER="0" ALT=""><IMG SRC="./stanbg.gif" WIDTH="'.number_format(round(($wolne_procent * 2), 0), 2, '.', ' ').'" HEIGHT="6" BORDER="0" ALT=""></TD></TR>'."n";
else
print '<TR><TD ALIGN="CENTER" HEIGHT="15" COLSPAN="3">&nbsp;</TD></TR>'."n";
print '</TABLE><BR>&nbsp;'."nn";
}

function alert($adres)
{
if($this->max_rozmiar <= $this->rozmiar_mb)
{
@mail($adres, "Przekroczona quota!", "Została przekroczona maksymalna quota [" . $this->max_rozmiar . " MB] dla katalogu:n" . $this->katalog);
}
}

function sprawdz($katalog_uzytkownikow, $quota, $adres="", $pokaz=true)
{
print '<HTML><HEAD>' . "n";
print '<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=iso-8859-2">' . "n";
print '<META HTTP-EQUIV="Pragma" CONTENT="no-cache">' . "n";
print '<META HTTP-EQUIV="Reply-to" CONTENT="kab@o2.pl">' . "n";
print '<META NAME="Author" CONTENT="Krzysztof Andrzej Błachut">' . "n";
print '<TITLE>QUOTA</TITLE></HEAD>' . "n";
print '<BODY BGCOLOR="#D4D4D4" STYLE="background: #D4D4D4">' . "n";
if ($dh = opendir($katalog_uzytkownikow))
{
while (($file = readdir($dh)) !== false)
{
if($file != '.' && $file != '..')
{
if(is_dir($katalog_uzytkownikow . '' . $file))
{
$k = new quota;
$k->katalog = $katalog_uzytkownikow . '' . $file . '';
$k->max_rozmiar = $quota;
$k->user = $file;
$k->przelicz();
if($pokaz) $k->pokaz_postep();
if($adres) $k->alert($adres);
unset($k);
ob_flush();
}
}
}
closedir($dh);
}
print "</BODY></HTML>n";
}
}


quota::sprawdz("X:Users", 500);

/*
Sposób uruchamiania:
Wywołujemy funkcję sprawdz klasy quota.

Parametry funkcji sprawdz:
1. Katalog użytkowników. Parametr wymagany!
2. Quota - podawana w MB! Parametr wymagany!
3. Adres e-mail. Parametr nie wymagany. Gdy pusty (domyślnie) nic się nie stanie. Opis poniżej.
4. Pokazywać użycie quoty? Parametr nie wymagany. Gdy jest ustawiony na "true" (domyślnie) funkcja pokaże tabele z graficzną interpretacją użycia quoty.

W przypadku, gdy wywołujemy skrypt z wiersza poleceń (np. co jakiś czas przez cron) należy podać 3 parametr - adres e-mail - by zostać poinformowanym, którzy użytkownicy przekroczyli quotę, oraz ustawić 4 parametr na "false", by dane nie były wyświetlane.

Przykłady użycia:

-------------------------------------------------------------------------------
Założenia:
Posiadamy dysk X który przechowuje katalogi użytkowników. Jeden katalog - jeden użytkownik. Czyli dla przykładu: X:Andrzej to katalog użytkownika "Andrzej".
Klasa jest użyta w skrypcie na stronie internetowej.
Quota dla jednego użytkownika to 500 MB.

Użycie: quota::sprawdz("X:", 500);
-------------------------------------------------------------------------------
Założenia:
Posiadamy dysk X który przechowuje katalogi użytkowników. Jeden katalog - jeden użytkownik. Czyli dla przykładu: X:Andrzej to katalog użytkownika "Andrzej".
Quota dla jednego użytkownika to 500 MB.
Klasa jest użyta w skrypcie wywoływanym przez cron'a.
Nasz adres e-mail na który mają przychodzić ostrzeżenia o przekroczeniu quoty to: admin@serwer.pl

Użycie: quota::sprawdz("X:", 500, "admin@serwer.pl", false);
-------------------------------------------------------------------------------
*/
?>[/php:1:4cd1208c37]

Wyjaśnienie chyba czytelne... winksmiley.jpg
U mnie działa jak złoto...
Na dobry początek skopiujcie sobie całość do jakiegoś pliku na serwerze WWW (TYLKO WINDOWS), zmieńcie ścieżkę do katalogu i zobaczcie efekt w przeglądarce...

Obrazki potrzebne do ładnego działania:
http://kab.zamowienia.com/forum.php.pl/quota_img.zip
Jarko
A czy można jeszcze zrobić tak żeby np. przy przekroczeniu quoty kopiował z jakiegoś katalogu lub sam tworzył plik u umieszczał go w katalogu w którym przekroczono limit.

Aha i Dzięki za skrypt, działa miodzio smile.gif
Bakus
Cytat
A czy można jeszcze zrobić tak żeby np. przy przekroczeniu quoty kopiował z jakiegoś katalogu lub sam tworzył plik u umieszczał go w katalogu w którym przekroczono limit.

Pomiędzy liniami 93 i 94 wstawiasz polecenie [manual:adf94bb68a]copy[/manual:adf94bb68a]...

Pracuję nad czymś takim:
Gdy quota zostanie przekroczona pliki użytkownika zostają przeniesione do innego folderu (nie dostępnego publice), a do folderu zostaje zapisany plik index.htm który pokazuje:
Kod
W dniu {DATA} użytkownik {NAZWA_UZYTKOWNIKA} przekroczył przydzieloną mu powerzchnię dyskową ({QUOTA}MB).

Pliki użytkownika zostaną przywrócone po skontaktowaniu się użytkownika z administratorem systemu.

Użytkownik, którego konto ma za dużo plików zostanie poinformowany o zajściu przez e-mail.

Mam zamiar jeszcze dodać informowanie, że quota jest bliska wyczerpaniu...

Jak to zrobie wrzuce kod na forum...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.