Skocz do zawartości
varez

[apache] pamieciozerny skrypt?

Polecane posty

przedstawiałem problem na forum 4programmers.net

(http://forum.4programmers.net/viewtopic.php?p=463703)

ale problem zaczal byc bardziej techniczny niz do programowania wiec opisze co jest:

 

witam, mam prosty skrypcik ktory otwiera mi jakis zewnetrzny plik, po czym podaje mi go od siebie .. cos jakby proxy do pobierania konkretnego pliku:

header("Content-type:application/octet-stream");
header("Content-Length: ".$size);
header('Content-Disposition: attachment; filename='.$filename);
$zal=fopen($path, 'r');
for ($i=1; $i <= $size; $i++) {
	echo fread($zal, 1);
}
fclose($zal);

tylko ten skrypcik powoduje ze po 30 sekundach przerywa mi sie sciaganie, a do pobieranego pliku dokleja sie error php jak mozna by to ominąc?? tylko zwiekszajac limit do powiedzmy 10 minut??

 

poradzili mi dodac w petli set_time_limit(30);

dodałem,

 

no i teraz problem jest taki ze po losowej liczbie minut skrypt mi padał (na jakims tam zewnetrznym hoście)..

podobno to wina pamięci - usługodawca zablokował mi konto z powodu zbyt duzego obciazenia maszyny, az do tego stopnia ze sie scrashowała.. z tym ze u mnie w domu, na Windzie Xp, apache ani megabajta ramu wiecej nie "zjada" przy wykonywaniu tego skryptu.. i wlasnie mi konczy lokalnie sciagac ta metoda 100MB plik.. tylko zuzycie proca stoi na poziomie kolo 100%.. czy ja cos robie nie tak, czy moze apachea maja źle skonfigurowanego?? jesli tak to jak zapobiec temu zjadaniu ramu?? tak jak mowili: flush()em?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
ale problem zaczal byc bardziej techniczny niz do programowania wiec opisze co jest:
Chyba sobie żartujesz. Jakbym dostał taki kod od jakiegoś programisty to bym go na zbity pysk wywalił :P

Sorry, ale łagodniej się tego nie da napisać...

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
dlaczego?
Nie używasz zbyt dużej liczby funkcji. Domyśl się.

 

moze pomoż rozwiązać? ^^
Może zacznij czytać dokumentację?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Nie używasz zbyt dużej liczby funkcji. Domyśl się.

a to zło jakieś?

 

Może zacznij czytać dokumentację?

a czytam, ale jak mnie odnosisz do dokumentacji to napisz do ktorej (apache/php)..

 

poza tym na moim kompie wszystko gra, na moim VPS 400Mhz/256RAM przy wlaczonym serwerze gry, apache 2/php/mysql (90% ram caly czas zajete) daje rady, wiec to raczej wina hosta jest, ale po prostu szukam pomocy, bo widac ze to cos jest nienormalne

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Spróbuj użyć CURLa który jest do takich rzeczy po prostu stworzony. Dobrym rozwiązaniem jest też chwilowe pobranie pliku do tymczasowego folderu a potem dopiero jego otwieranie.

 

pyzatym ja bym ustawił

set_time_limit(0);

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
a to zło jakieś?
Nigdzie nic takiego nie napisałem. Chodziło mi raczej o fakt, że skoro wykorzystujesz tak naprawdę tylko 3 funkcje, to dużych możliwości popełnienia błędu nie miałeś i powinieneś się sam domyślić co robisz źle...

 

a czytam, ale jak mnie odnosisz do dokumentacji to napisz do ktorej (apache/php)..
Skoro już dałem do zrozumienia, że to wina po stronie programistycznej, to chyba nie muszę pisać dużymi literami, do której dokumentacji należy zaglądnąć?

 

poza tym na moim kompie wszystko gra, na moim VPS 400Mhz/256RAM przy wlaczonym serwerze gry, apache 2/php/mysql (90% ram caly czas zajete) daje rady, wiec to raczej wina hosta jest, ale po prostu szukam pomocy, bo widac ze to cos jest nienormalne

Nie? A wcześniej pisałeś coś innego:

z tym ze u mnie w domu, na Windzie Xp, apache ani megabajta ramu wiecej nie "zjada" przy wykonywaniu tego skryptu.. i wlasnie mi konczy lokalnie sciagac ta metoda 100MB plik.. tylko zuzycie proca stoi na poziomie kolo 100%..

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

jak się ma od 4 lat uszkodzony procesor, który uwielbia zawieszac system, restartowac i robic BSODy to nie takie rzeczy się dzieją :P wiec tym sie specjalnie nie martwiłem..

ok Panie p - bawimy sie w kotka i myszke czy mi cos podpowiesz? całą dokumentację mam przeczytać?

 

@Tomi - tymczasowy zapis odpada - ma być bez tego :) za dlugo bym czekał, az serwer pobierze te kilkaset MB nieraz i zacznie wysyłać..

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Po pierwsze zamiast pętli użyj funkcji readfile.

Po drugie jeśli ty ten plik ciągniesz gdzieś z internetu i potem go wysyłasz internaucie do wyszukiwarki to raczej to szybkie nie będzie. Ja bym takiego z hostingu wywalił :-).

Jakiś redirectr byłby lepszy ale wtedy skończy się udawanie, że plik leży u Ciebie.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Moje testy na pliku ~20MB i 2100MHZ:

 

readfile					  2.3911 sec

feof + fread(x,1024)		  2.4257 sec

for  + fread(x,1)			 26.9816 sec
feof + fread(x,1)			 31.1507 sec

 

pamięć podskoczyła o kilka MB

procesor 100%

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Po pierwsze zamiast pętli użyj funkcji readfile.

ok :P [jezeli tylko filesize nie probuje wczytac całości do pamięci, a dopiero potem wysylac]

Po drugie jeśli ty ten plik ciągniesz gdzieś z internetu i potem go wysyłasz internaucie do wyszukiwarki to raczej to szybkie nie będzie.

no to chyba od łącza zalezy :)

Ja bym takiego z hostingu wywalił :-).

z dedyka nie wywalą :)

Jakiś redirectr byłby lepszy ale wtedy skończy się udawanie, że plik leży u Ciebie.

i przy okazji pliki ktore pobieram z uzyciem hasła przestałyby być takie tajne :)

 

dzięki GLOBUS za te testy :)

 

przy readfile procek tez jest na 100%?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
bawimy sie w kotka i myszke czy mi cos podpowiesz? całą dokumentację mam przeczytać?
Wykorzystujesz trzy funkcje (z czego jedną przez większość czasu).

Czy naprawdę tak trudno się domyślić, że chodziło mi o dokumentację?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
rozumiem ze mam uzyc file_get_contents ?
Jak chcesz to użyj... Ale chodziło mi bardziej o zamieszczone tam przykłady i komentarze...

...sprobój znaleść jakiś, który wykona ponad 100 milionów operacji I/O dla 100MB pliku :P

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

no przeciez wiem ze skrypt mam zly, dlatego tez pisze oczekujac na pomoc.. doczytalem sie czegos w dokumentacji ,teraz to zrealizuje

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Poszukaj sobie lepiej konta gdzie będziesz mógł exec() z wget -c wykonać.

 

Pisał, że to dedyk więc może wykonywac co mu się podoba.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Pisał, że to dedyk więc może wykonywac co mu się podoba.

 

"usługodawca zablokował mi konto z powodu zbyt duzego obciazenia maszyny"

Wiec raczej nie ;)

 

zadnych kont z dostepem do roota narazie

Przecież nie musisz mieć od razu uprawnień roota.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

no ale execa nie ma i tyle, a skrypt juz poprawiłem i hula bez zadnego obciazenia ;)

 

na dedyku będzie, narazie jest na wirtualnym

 

dziekuje za pomoc, pozdrawiam

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się


×