Utisci korisnika

"Želim da kazem da iako sam tek na pola, da sam oduševljena ovim načinom na koji stvari funkcionisu!" Stanislava Kraguljac, Beograd

Veoma sam zahvalna na Vašem brzom odgovoru i želela bih da Vam se zahvalim na pažnji koju ste pokazali. Radica Nedelčev - Beograd


Kompletna lista utisaka

Testiranje online

Arhitektura računara

Za one koji žele da znaju više.

Windows OS

Ovo bi svakako trebalo da probate.

Odnosi s javnošću

Koliko znate PR?

Pogledajte još neke od testova

Newsletter

Ukoliko želite da Vas redovno obaveštavamo o novostima sa Link eLearning sajta prijavite se na našu newsletter listu.

Ime:

Prezime:

Email:


Anketa

Arhiva anketa

BAZA ZNANJA


Kurs: PHP programiranje

Modul: Ulaz i izlaz

Autor:

Naziv jedinice: Rad sa udaljenim računarom


Materijali vezani uz ovu lekciju:

- Test rad sa udaljenim računarom
- Rad sa udaljenim računarom (PDF dokument)



Malo je verovatno da po izgradnji naše web aplikacije, nećemo morati da je putem ftp-a transportujemo na neki udaljeni računar. Kada sadržaj jednom dospe tamo, ceo proces postaje za nijansu kompleksniji, jer podešavanja na udaljenom sistemu možda nisu ista kao na našem računaru.

Zbog toga je poželjno, pre početka proizvodnje web aplikacije, formirati uslove u lokalnom okruženju, što bliskije uslovima u udaljenom okruženju. Tako će teže dolaziti do grešaka, i biće olakšano njihovo otklanjanje.

Proces konačnog instaliranja aplikacije na produkcioni web server, naziva se deployment.


Transport aplikacije na server

Iako to zapravo nije cilj lekcije, ukratko ćemo objasniti proces transporta fajlova na udaljeni web server putem ftp-a.

Pre svega, ftp je poseban protokol za razmenu fajlova, koji funkcioniše pod tcp/ip protokolom, pa mu je tako jedna od osobina i sistemska kompatibilnost. Ovo omogućava da sa windows sistema šaljemo fajlove na linux i obrnuto, što je za web krucijalno, jer se dosta aplikacija i proizvodi i publikuje na oba sistema.

Konekcija prema FTP serveru, izvršava se u jednom od dva moda. Pasivni, kada ftp klijent od servera dobija port na koji može da se nakači i aktivni, kada klijent pokušava da se nakači na određeni port, i ako je uspe, zatvara konekciju.

Da bismo koristili ftp za deployment aplikacije, potreban nam je bilo koji ftp klijent, korisničko ime i šifra na tom ftp serveru i naravno, adresa tog servera. Kada se jednom uspostavi konekcija, fajl sistem na udaljenom računaru ponašaće se slično kao i fajl sistem na lokalnom računaru i našu web aplikaciju moći ćemo da prebacimo na ftp server običnom (ftp) komandom za kopiranje.


Rukovanje FTP serverom iz koda

Da bi se rukovalo FTP-om iz php koda, potrebno je da bude instalirana odgovarajuća ekstenzija. Ova ekstenzija se, na PHP-u za windows automatski instalira, dok je na Linux-u potrebno instalirati je zasebno.

Ono što je, pre svega potrebno, jeste ftp server i nalog na njemu. Ukoliko ovi elementi postoje, potrebno je inicijalizovati ftp konekciju (strim resurs), koja je rezultat funkcije ftp_connect(), sa adresom servera kao parametrom.
$ftpKonekcija = ftp_connect("192.168.1.1");
Nakon kreirane konekcije potrebno je ulogovati se na server, naredbom ftp_login, koja kao parametre prima konekcioni objekat, korisničko ime i šifru.
ftp_login($ftpKonekcija, "php", "123");
Kada je konekcija jednom kreirana, možemo započeti manipulaciju sadržajem udaljenog fajl sistema.

U njemu, prvo definišemo objekat koji sačinjava listu svih elemenata određenog foldera. Ovaj objekat je rezultat funkcije ftp_nlist() koja kao parametre prima ftpKonekciju i folder na udaljenom računaru koji treba da pročita. Nakon kreiranja objekta liste fajlova, foreach ili nekom drugom petljom, možemo pregledati sadržaj ovog objekta (odnosno, fajlova foldera udaljenog računara).
$listaFajlova = ftp_nlist($ftpKonekcija, "www");
foreach($listaFajlova as $fajl)
echo $fajl;
Kada putem koda ili korisničkog interfejsa naše aplikacije dođemo do određenog fajla koji želimo da preuzmemo, za sam proces preuzimanja, možemo upotrebiti funkciju ftp_get().

Ova funkcija, kao parametre prihvata ftp konekciju, lokaciju i naziv fajla na lokalnom ftp serveru (tamo gde će fajl biti snimljen), lokaciju fajla na udaljenom serveru (odakle će biti preuzet) i mod transfera (binarni ili ascii). Sve jedno je da li ćete koristiti binarni ili ascii prenos, iako je praksa da se za tekst koristi ascii, a za binarne fajlove binarni zapis. Ukoliko radite na različitim fajl sistemima ili operativniim sistemima, najbolje je koristiti ascii mod transfera.
ftp_get($ftpKonekcija,"ciljniFajl.txt","www/proba.txt", FTP_ASCII);
Ako hoćemo da umesto preuzimanja, pošaljemo određeni fajl na ftp server, umesto funkcije ftp_get, upotrebićemo funkciju ftp_put, sa istim rasporedom parametara.
ftp_put($ftpKonekcija, "www/proba.txt1","proba.txt", FTP_ASCII);
Osim ovih osnovnih, postoji još nekoliko korisnih funkcija za rad sa ftp serverom koje su, kada jednom ostvarite konekciju, veoma jednostavne za korišćenje.
  • ftp_delete() - Briše fajl sa ftp servera
    ftp_delete($ftpKonekcija,"www/proba.txt");
  • ftp_rename() – preimenovanje fajla na ftp serveru
    ftp_rename($conn,“staro.txt",“novo.txt");
  • ftp_mkdir() – pravljenje foldera na ftp serveru
    ftp_mkdir($ftpKonekcija, "www/test");
  • ftp_rmdir() – brisanje foldera sa ftp servera
    ftp_mkdir($ftpKonekcija, "www/test");
  • ftp_size() – veličina (u bajtovima) fajla na ftp serveru
    echo ftp_size($conn,“proba.txt");
  • ftp_chdir()
    Menja aktuelni folder na serveru
  • ftp_rename()
    Menja ime fajla na serveru
  • ftp_alloc()
    Vrši pripremu prostora za upload fajla na ftp server.
  • ftp_chmod()
    Menja atribute fajla


Menjanje atributa fajla (prava nad fajlom)

Upoznajmo se ukratko sa sistemom funkcionisanja atributa (dozvola) nad ftp fajlovima. Svaki fajl na ftp serveru (govorimo isključivo o linux okruženju), poseduje određene bezbednosne atribute koji ograničavaju korisnike u pristupu i aktivnostima nad tim fajlom.

Ovi atributi se predstavljaju sa tri broja, od kojih svaka pozicija predstavlja jednu grupu korisnika. Prvi broj predstavlja vlasnika fajla (owner), drugi broj neku grupu korisnika (group) i treći javne korisnike (public).

Sami brojevi predstavljaju prava koja određena grupa poseduje nad fajlom:
0 – ne može ništa raditi na fajlu
1 – može startovati fajl
2 – može pisati u fajl
3 – može pisati u fajl i startovati ga
4 – može čitati iz fajla
5 – može čitati iz fajla i startovati ga
6 – može čitati i pisati u fajl
7 – može čitati, pisati i startovati fajl
Dakle kombinacija u kojoj bi svi korisnici mogli da rade sve na fajlovima, bila bi: 777.
A cela linija bi izgledala ovako:
ftp_chmod($conn, 0777, 'proba.txt');
Osim što se u ovoj liniji podrazumeva već otvorena konekcija, može začuditi broj 0777, obzirom da su nam potrebna samo 3 broja (777). Objašnjenje leži u činjenici da ftp server zapravo zahteva oktalnu reprezentaciju broja, što postižemo dodavanjem broja 0 ispred ostalih brojeva (linije echo 10; i echo 010; neće dati isti rezultat na izlazu).

Komande ftp serveru možemo zadavati i direktno, bez posredničkih PHP funkcija.
U zavisnosti od toga, koji tip komande želimo da izvršimo (site ili raw) možemo se poslužiti jednom od dve funkcije ftp_raw() ili ftp_site(). U oba slučaja parametri su isti, ali ne i povratna vrednost. U slučaju site komandi (specifične komande ftp servera) rezultat će biti boolean tipa (da li je komanda izvršena uspešno ili ne), dok će u slučaju ftp_raw funkcije rezultat sadržati niz poruka, emitovanih od strane ftp servera nakon izvršenja komande.
ftp_site($conn, 'CHMOD 0777 /www/proba.txt');
Pokušajmo da napravimo aplikaciju koja kopira sve fajlove sa jednog servera na drugi:
<?php
//pravljenje ftp konekcije
$fconn = ftp_connect("192.168.203.130");
//unos korisnickih podataka
ftp_login($fconn,"test","123");
//listanje sadrzaja foldera
//pre svega, preuzimanje sadrzaja foldera
$fajlovi=ftp_nlist($fconn,"www");
//iteracija kroz svaki clan foldera ponaosob
foreach($fajlovi as $fajl)
{
//ukoliko clan nije folder (odnosno, ukoliko je fajl)
if(!is_dir($fajl))
{
echo $fajl;
//kopiraj i ukoliko je kopiranje uspesno, napisi: -  uspesno kopiran
if(ftp_get($fconn,"link/".$fajl,"www/" . $fajl, FTP_ASCII))
echo " - uspesno kopiran";
else
echo " - greska u kopiranju";
echo "<br>";
}
}
//zatvori konekciju
ftp_close($fconn);
?>



 

Transport aplikacije na server

Iako to zapravo nije cilj lekcije, ukratko ćemo objasniti proces transporta fajlova na udaljeni web server putem ftp-a.

Pre svega, ftp je poseban protokol za razmenu fajlova, koji funkcioniše pod tcp/ip protokolom, pa mu je tako jedna od osobina i sistemska kompatibilnost. Ovo omogućava da sa windows sistema šaljemo fajlove na linux i obrnuto, što je za web krucijalno, jer se dosta aplikacija i proizvodi i publikuje na oba sistema.

Konekcija prema FTP serveru, izvršava se u jednom od dva moda. Pasivni, kada ftp klijent od servera dobija port na koji može da se nakači i aktivni, kada klijent pokušava da se nakači na određeni port, i ako je uspe, zatvara konekciju.

Da bismo koristili ftp za deployment aplikacije, potreban nam je bilo koji ftp klijent, korisničko ime i šifra na tom ftp serveru i naravno, adresa tog servera. Kada se jednom uspostavi konekcija, fajl sistem na udaljenom računaru ponašaće se slično kao i fajl sistem na lokalnom računaru i našu web aplikaciju moći ćemo da prebacimo na ftp server običnom (ftp) komandom za kopiranje.


Rukovanje FTP serverom iz koda

Da bi se rukovalo FTP-om iz php koda, potrebno je da bude instalirana odgovarajuća ekstenzija. Ova ekstenzija se, na PHP-u za windows automatski instalira, dok je na Linux-u potrebno instalirati je zasebno.

Ono što je, pre svega potrebno, jeste ftp server i nalog na njemu. Ukoliko ovi elementi postoje, potrebno je inicijalizovati ftp konekciju (strim resurs), koja je rezultat funkcije ftp_connect(), sa adresom servera kao parametrom.
$ftpKonekcija = ftp_connect("192.168.1.1");
Nakon kreirane konekcije potrebno je ulogovati se na server, naredbom ftp_login, koja kao parametre prima konekcioni objekat, korisničko ime i šifru.
ftp_login($ftpKonekcija, "php", "123");
Kada je konekcija jednom kreirana, možemo započeti manipulaciju sadržajem udaljenog fajl sistema.

U njemu, prvo definišemo objekat koji sačinjava listu svih elemenata određenog foldera. Ovaj objekat je rezultat funkcije ftp_nlist() koja kao parametre prima ftpKonekciju i folder na udaljenom računaru koji treba da pročita. Nakon kreiranja objekta liste fajlova, foreach ili nekom drugom petljom, možemo pregledati sadržaj ovog objekta (odnosno, fajlova foldera udaljenog računara).
$listaFajlova = ftp_nlist($ftpKonekcija, "www");
foreach($listaFajlova as $fajl)
echo $fajl;
Kada putem koda ili korisničkog interfejsa naše aplikacije dođemo do određenog fajla koji želimo da preuzmemo, za sam proces preuzimanja, možemo upotrebiti funkciju ftp_get().

Ova funkcija, kao parametre prihvata ftp konekciju, lokaciju i naziv fajla na lokalnom ftp serveru (tamo gde će fajl biti snimljen), lokaciju fajla na udaljenom serveru (odakle će biti preuzet) i mod transfera (binarni ili ascii). Sve jedno je da li ćete koristiti binarni ili ascii prenos, iako je praksa da se za tekst koristi ascii, a za binarne fajlove binarni zapis. Ukoliko radite na različitim fajl sistemima ili operativniim sistemima, najbolje je koristiti ascii mod transfera.
ftp_get($ftpKonekcija,"ciljniFajl.txt","www/proba.txt", FTP_ASCII);
Ako hoćemo da umesto preuzimanja, pošaljemo određeni fajl na ftp server, umesto funkcije ftp_get, upotrebićemo funkciju ftp_put, sa istim rasporedom parametara.
ftp_put($ftpKonekcija, "www/proba.txt1","proba.txt", FTP_ASCII);
Osim ovih osnovnih, postoji još nekoliko korisnih funkcija za rad sa ftp serverom koje su, kada jednom ostvarite konekciju, veoma jednostavne za korišćenje.
  • ftp_delete() - Briše fajl sa ftp servera
    ftp_delete($ftpKonekcija,"www/proba.txt");
  • ftp_rename() – preimenovanje fajla na ftp serveru
    ftp_rename($conn,“staro.txt",“novo.txt");
  • ftp_mkdir() – pravljenje foldera na ftp serveru
    ftp_mkdir($ftpKonekcija, "www/test");
  • ftp_rmdir() – brisanje foldera sa ftp servera
    ftp_mkdir($ftpKonekcija, "www/test");
  • ftp_size() – veličina (u bajtovima) fajla na ftp serveru
    echo ftp_size($conn,“proba.txt");
  • ftp_chdir()
    Menja aktuelni folder na serveru
  • ftp_rename()
    Menja ime fajla na serveru
  • ftp_alloc()
    Vrši pripremu prostora za upload fajla na ftp server.
  • ftp_chmod()
    Menja atribute fajla


Menjanje atributa fajla (prava nad fajlom)

Upoznajmo se ukratko sa sistemom funkcionisanja atributa (dozvola) nad ftp fajlovima. Svaki fajl na ftp serveru (govorimo isključivo o linux okruženju), poseduje određene bezbednosne atribute koji ograničavaju korisnike u pristupu i aktivnostima nad tim fajlom.

Ovi atributi se predstavljaju sa tri broja, od kojih svaka pozicija predstavlja jednu grupu korisnika. Prvi broj predstavlja vlasnika fajla (owner), drugi broj neku grupu korisnika (group) i treći javne korisnike (public).

Sami brojevi predstavljaju prava koja određena grupa poseduje nad fajlom:
0 – ne može ništa raditi na fajlu
1 – može startovati fajl
2 – može pisati u fajl
3 – može pisati u fajl i startovati ga
4 – može čitati iz fajla
5 – može čitati iz fajla i startovati ga
6 – može čitati i pisati u fajl
7 – može čitati, pisati i startovati fajl
Dakle kombinacija u kojoj bi svi korisnici mogli da rade sve na fajlovima, bila bi: 777.
A cela linija bi izgledala ovako:
ftp_chmod($conn, 0777, 'proba.txt');
Osim što se u ovoj liniji podrazumeva već otvorena konekcija, može začuditi broj 0777, obzirom da su nam potrebna samo 3 broja (777). Objašnjenje leži u činjenici da ftp server zapravo zahteva oktalnu reprezentaciju broja, što postižemo dodavanjem broja 0 ispred ostalih brojeva (linije echo 10; i echo 010; neće dati isti rezultat na izlazu).

Komande ftp serveru možemo zadavati i direktno, bez posredničkih PHP funkcija.
U zavisnosti od toga, koji tip komande želimo da izvršimo (site ili raw) možemo se poslužiti jednom od dve funkcije ftp_raw() ili ftp_site(). U oba slučaja parametri su isti, ali ne i povratna vrednost. U slučaju site komandi (specifične komande ftp servera) rezultat će biti boolean tipa (da li je komanda izvršena uspešno ili ne), dok će u slučaju ftp_raw funkcije rezultat sadržati niz poruka, emitovanih od strane ftp servera nakon izvršenja komande.
ftp_site($conn, 'CHMOD 0777 /www/proba.txt');
Pokušajmo da napravimo aplikaciju koja kopira sve fajlove sa jednog servera na drugi:

<?php
//pravljenje ftp konekcije
$fconn = ftp_connect("192.168.203.130");
//unos korisnickih podataka
ftp_login($fconn,"test","123");
//listanje sadrzaja foldera
//pre svega, preuzimanje sadrzaja foldera
$fajlovi=ftp_nlist($fconn,"www");
//iteracija kroz svaki clan foldera ponaosob
foreach($fajlovi as $fajl)
{
//ukoliko clan nije folder (odnosno, ukoliko je fajl)
if(!is_dir($fajl))
{
echo $fajl;
//kopiraj i ukoliko je kopiranje uspesno, napisi: -  uspesno kopiran
if(ftp_get($fconn,"link/".$fajl,"www/" . $fajl, FTP_ASCII))
echo " - uspesno kopiran";
else
echo " - greska u kopiranju";
echo "<br>";
}
}
//zatvori konekciju
ftp_close($fconn);
?>

Pre nego što izvršimo transport fajla na ftp server, možemo eventualno i alocirati prostor za taj fajl, odnosno, proveriti da li uopšte ima prostora za fajl te veličine, za šta koristimo funkciju ftp_alloc(), koja kao parametre prima ftp konekciju, veličinu fajla i opciono rezultat servera.
ftp_alloc($conn, 1044, $r);
Treba znati da u velikom broju ftp serveri ne podržavaju ovu naredbu, za šta treba pripremiti aplikaciju. Odgovor servera se nalazi u promenljivoj r u ovom slučaju. A sam rezultat funkcije je boolean koji obaveštava o uspehu izvršenja funkcije. Ova funkcija se savetuje pri izradi bezbednih aplikacija, i to, naravno, na serverima koji mogu da je podrže.

Da bi eventualno, tokom izvršavanja skripte, promenili mod konekcije iz aktivnog u pasivni ili obrnuto, možete koristiti funkciju ftp_pasv u sledećem formatu:
ftp_pasv($conn, false);
... pri čemu je, pored standardne ftp konekcije (ftp strim resurs varijable) potrebno kroz boolean vrednost proslediti da li želimo ili ne, da koristimo pasivni mod. Osim konekcije koja je očigledno neophodna u vidu parametra, za ovu funkciju, potrebno je da bude ostvaren i login na ftp server.

Pored standardnih naredbi za rukovanje fajlovima u ftp-u, postoji i takozvani, non-blocking set, koji omogućava asinhrono rukovanja ovim fajlovima. Ovo znači da neki ftp proces možemo početi u jednom trenutku, i da za to vreme možemo nastaviti izvršavanje programa bez obzira na status ftp transfera. Status transfera započetog na ovaj način, možemo kontrolisati statusnim identifikatorima (FTP_FAILED, FTP_FINISHED, FTP_MOREDATA).

Ovi identifikatori rezultat su bilo koje funkcije iz non-blocking seta, tako da je status transfera u svakom trenutku moguće prekontrolisati, bilo da je u pitanju inicijalizacija transporta ili neka njegova kontrolna tačka (ftp_nb_continue). Pogledajmo primer:
<?php
//standardna inicijalizacija konekcije i login
$conn = ftp_connect('192.168.203.130');
ftp_login($conn, 'test', '123');

//umesto ftp_get, koristimo ftp_nb_get i rezultat dodeljujemo vrednosti
$r = ftp_nb_get($conn, "lokalniFajl", "www/udaljeniFajl", FTP_BINARY);

$i=0;
//inicijalizujemo petlju koja će se vrteti sve dok identifikator r bude dao vrednost
//koja nije FTP_MOREDATA, odnosno, kada se status promeni
while($r == FTP_MOREDATA) {
//sve dok ima podataka, nastavlja se transport
      $r = ftp_nb_continue($conn);
//prikazacemo svaku iteraciju da bi videli da je program funkcionisao i tokom transfera
      echo $i++ . "<br>";
}
?>

Najvažnije iz lekcije

  1. Konekcija ka ftp serveru može biti aktivna ili pasivna
  2. Za rad sa fajlovima na ftp serveru, potrebno je kreirati konekcioni objekat
  3. Za transport fajlova ka serveru i od njega, koristimo funkcije ftp_get i ftp_put
  4. Transport fajlova putem FTP-a, moguće je vršiti na dva načina binarno i ascii


Smatrate da je ova lekcija korisna?  Preporučite je. Broj preporuka:0