Kurs: PHP programiranje 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. Transport aplikacije na serverIako 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 kodaDa 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");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.
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 fajluDakle 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
Transport aplikacije na serverIako 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 kodaDa 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");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.
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 fajluDakle 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 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 Najvažnije iz lekcije
|