SIR JEDI
19.09.2003, 17:57:56
Czy ktoś pisał skrypt do kopiowania danych z adresu URL i zapisywał je do pliku na serwerze? Np mam plik 30 Mb i chce żeby skrypt go skopiował na moje konto.
Używam funkcji fopen() i wszytko idzie ok... tylko że po pewnym czasie strumień danych się zrywa i skrypt po porstu kończy działalność.
funkcja set_time_out() ciągle zwieksza limit czasu, więc tutaj błędu nie ma. Czy ktoś jest w stanie mi udzielić pomocy?
KaMeLeOn
19.09.2003, 18:04:04
php.ini
Cytat
post_max_size = 8M
SIR JEDI
20.09.2003, 13:52:00
Nie o to chodzi. Tutaj jest kod: [php:1:8dd6d36695]<?php
$filename = "http://localhost/obrazek.jpg";
$filename2="obrazek2.jpg";
$f = fopen($filename, "rb");
flock($f, 1);
while(!feof($f)){
set_time_limit(31536000);
$file=fread($f, 1024*8);
$f2 = fopen($filename2, "ab");
flock($f2, 2);
fwrite($f2, $file);
flock($f2, 3);
fclose($f2);
unset($file);
unset($f2);
}
flock($f, 3);
fclose($f);
?>[/php:1:8dd6d36695]
I nie to że 8 Mb, bo bywało że transfer zatrzymywał się przy ok 3... Help...
adwol
20.09.2003, 23:05:03
Blokowanie zdalnego zasobu po HTTP... Ostre, naprawde ostre...
[php:1:b96f51212f]<?php
$filename = "http://localhost/obrazek.jpg";
$f = fopen($filename, "rb");
flock($f, 1);
?>[/php:1:b96f51212f]
Na takie coś bym nawet nie wpadł. Najpierw nikt nie blokował w ogóle plików, potem ktoś podrzucił flocka to teraz blokujemy co się da, nawet URLe, tak?
Po drugie, po co w pętli otwiersz ten plik w trybie append i co chwile go zamykasz? Po trzecie (to w zasadzie kosmetyka), zamiast ustawiać maksymalny czas wykonania na rok i do tego w pętli, ustaw raz na 0 -- wyłączy to licznik.
Spróbuj takiego kodu, jest trochę chudszy i jeśli dalej Ci nie będzie działało to znaczy, że problem leży po stronie połączenia sieciowego (chociaż do localhosta to raczej ciężkie do uzyskania :wink:).
[php:1:b96f51212f]<?php
$filename = "http://localhost/obrazek.jpg";
$filename2 = "obrazek2.jpg";
set_time_limit(0);
$f = fopen($filename, 'rb');
$f2 = fopen($filename2, 'wb');
flock($f2, 2);
while (!feof($f))
{
$file = fread($f, 1024*8);
fwrite($f2, $file);
}
fclose($f);
fclose($f2);
?>[/php:1:b96f51212f]
spenalzo
21.09.2003, 12:00:11
Na serwerach linuksowych jest jeszcze jedna możliwość:
[php:1:79e13b4133]<?php
passthru("wget
http://serwer/plik.exe");
?>[/php:1:79e13b4133]
SIR JEDI
22.09.2003, 18:03:57
Ten problem jest nie do obejścia. Okazało się że serwer ma ustanione wykonywanie skryptów CGI -> timeout na 300 sekund...
Inna sprawa:
Czy ktoś wie czy da się jakoś zacząc pobierać dane z pliku na innym serwerze od danego bajta (miejsca) - takie wznawianie pobierania np od 1024 bajta z pliku
http://serwer/plik.cad
Takie coś potrafi np FlashGet wysyłając jakiś nagłówek.
Powiedzmy że używam fsockopen do nawiązania połaczenia z plikiem. Czy da się wysłać taki nagłówek, żeby ptrzymywać informacje od podanego miejsca?
Na plikach na tym samym serwerze można używać fseek() ale przez http:// nie działa...
FiDO
22.09.2003, 19:15:43
Przeciez flashget ladnie pokazuje jakie naglowki wysyla.. wiec mozesz podpatrzec jak on to robi i sprobowac sam.
Z tym ze aby mozna bylo zaczac od dowolnego miejsca sciagac serwer musi wspierac resuming, co prawda wiekszosc wspiera, ale zdarzaja mi sie jeszcze czasem rodzynki, ktore tego nie robia.
adwol
22.09.2003, 20:33:55
Cytat
Powiedzmy że używam fsockopen do nawiązania połaczenia z plikiem. Czy da się wysłać taki nagłówek, żeby ptrzymywać informacje od podanego miejsca?

W HTTP/1.1 jest
Range. Np. nagłówek
Kod
Range: bytes=15-30
zwróci bajty od 15 do 30 włącznie.
SIR JEDI
23.09.2003, 18:25:00
Danke :-) Wpadłem na to zaraz po wyslaniu posta, ale o drugiej liczbie nie wiedziałem :-)
mam pytanko wiem ze temat byl juz troche czasu temu ale interesuje mnie to range.
chce przeczytac plik gigowy i go sparsowac. caly na raz niema szans wiadomo dlaczego, wiec proboje czytac kilkaset lini a pozniej dalej ale niebardzo moge usunac te linie ktore przeczytam, wiec gdy znalazlem tego posta to bardzo mnie to zaciekawilo ale nigdzie nic wiecej na ten temat niemoge znalesc. bardzo bym prosil o jakas wskazuwke jak to wykorzystac
adwol
8.01.2004, 19:50:40
Cytat
nigdzie nic wiecej na ten temat niemoge znalesc.
A czego szukasz? Specyfikacji, przykładu użycia czy jeszcze czegoś innego?
Cytat
bardzo bym prosil o jakas wskazuwke jak to wykorzystac
Tak jak napisałem. Dodajesz w żądaniu HTTP/1.1 nagłówek
Range: i w wyniku otrzymujesz tylko ten zakres bajtów który podałeś. Skorzystaj z
CURLa, bo w nim chyba najrpościej to zrobić.
niestety nieznalazlem nic w miare prosto opisane jak sie go CURL ze nawet file() ktora wrzuca go w prosta tablice wymieka przy nim. wiec chce przeczytac kilkaset lini , najlepiej bylo by pozniej usunac te linie (ale z tego co sie wyczytalem to niemoge usunac lini z poczatku pliku ,jezeli go nieprzeczytam calego ) wywolac sam siebie i znow to samo , i tak kilkakrotnie dopoki nieznajdzie znacznika konca plku
adwol
8.01.2004, 21:46:53
Zaraz, zaraz! Skąd Ty ten plik bierzesz? Z lokalnego dysku? Jak tak to niniejszy wątek nie jest na ten temat i nagłówek Range protokołu HTTP nic Ci nie pomoże, bo w ogóle nie ma sensu go używać.
teraz juz wiem ale jak to zobaczylem to mi tak przyszlo do glowy ze moze pomoze, ale juz mam chyba sposob i przy okazji pytanko moze bedziesz wiedzial:
wykonuje mniejwiecej:
[php:1:a6db9ae075]<?php
$licznik=1;
$fd = fopen ($pliklokal,"r");
while ($licznik!=10) {
//print '<BR><FONT color=#FF0000>'.$licznik.'</FONT><BR>';
$licznik++;
$buffer = fgets($fd, 4096);
// echo $buffer;
//parsuje i laduje do bazy $buffer
}
?>[/php:1:a6db9ae075]
i tu chce zbadac ktory to bajt i przeladowac strone i wykonac
[php:1:a6db9ae075]<?php
fseek($fd, 'ten_bajt);
?>[/php:1:a6db9ae075]
i powtorzyc to tyle razy ile bedzie trzeba
niewiem jak nie liczac w php teg wszystkiego co mi zwraca podac ktory to bajt (dlatego niechce tego liczyc aby skrocic wykonywanie skryptu.
przyposzczam ze fseek wstawia cos i podaje ktory to bajt ale wlasnie tego niewiem jak to zrobic
jak bys wiedzial to bylbym bardzo wdzieczny
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.