Napredno web programiranje
Zend Technologies
Termini koje treba razumeti File wrappers Streams Sockets Blocking calls php.ini Settings allow_url_fopen (Filesystem) auto_detect_line_endings (Filesystem) default_socket_timeout (Filesystem) from (Filesystem) user_agent (Filesystem)
Tehnike koje treba savladati Filesystem functions Network functions Socket functions Stream functions URL functions List of supported protocols/wrappers List of supported transports
Wrapper i File wrapper i su delovi koda koje PHP koristi da bi čitao i upisivao podatke iz različitih tipova fajlova Wrapper je deo PHP ove Stream arhitekture Kada PHP treba da pristupi nekom fajlu, koriste se neko od funkcionalnosti filesystem a koje PHP nudi Funkcionalnost filesystem a je da izabere wrapper U zavisnosti od imena fajla, PHP bira odgovarajući wrapper i rezultat njegovog rada sa fajlom vraća direktno PHP skripti
Šema pristupa fajlu u PHPu
Kako mi biramo wrapper PHPu se može reći koji file wrapper da koristi Ovo se radi kroz URL adresu scheme://path/to/file ili \\smbserver\share\path\to\file Ako nema podrške dšk za scheme, PHP će predpostaviti i da se radi sa tradicionalnim disk based fajlovima <?php // Selecting a file wrapper using fopen() we will open the // // this example script file this uses the file:// wrapper echo This file is called:. FILE. \n ; $fp = fopen( FILE, r ); fclose($fp);?>
Šta Built In Wrapper omogućava PHP inicijalno ima veliki broj wrappera koji se mogu koristiti: file:// (Ovo je rad sa klasičnim fajlovima u lokalu) \\smbserver\share\path\to\file (Ovim se omogućava pristup pfajlovima upotrebom Microsoft ovog file sharing a ili UNIX ovog rešenja Samba) http:// ili https:// (Ovim se omogućava komunikacija sa web sajtom upotrebom HTTP mrežnog protokola. Može se koristiti user_agent setings u php.ini da bi se udeljenom serveru definiše za koji se browser isporučuje sadržaj)
Šta Built In Wrapper omogućava ftp:// i ftps:// (Ovim se omogućava komunikacija sa FTP serverom. To uključuje upload i download fajlova. Logovanjem na FTP server, anonimni korisnik može se predstaviti svojom e mail adresom ako se to podesi u u from delu u php.ini setingsu.) php:// p (Ovim se omogućava pristup pphp ovim standardnim input, output, i error streamingu npr. POST podacima) Komprimovani stream compress.zlib:// i compress.bzip2:// (Ovim se omogućava čitanje fajlova koji su komprimovani sa gzip ili bzip2 ili njihovo kreiranje uz registraciju kroz stream_wrapper_register() funkciju od verzije 4.3.2 )
Dodatne opcije Postoji još 10 mogućnosti koje wrepper i podržavaju Međutim, ovo ne može da podrži svaki wreppera u svakoj situaciji, pa se vode kao mogućnosti nižeg nivoa Tačan popis mogućnosti za konkretne situacije može se naći u List of Supported Wrappers/Protocols u dodatku PHP Manual a
Opisi Restrikcija putem allow_url_fopen (allow_url_fopen setings u php.ini se koristi da se zaštiti od pristupa drugih fajlova kroz mrežu. Na neke wrapper e ovaj parametar ne utiče, pa treba proveriti za konkretan wrapper) Dozvola reading (Ova operacija omogućava čitanje podatka upotrebom wrapper a. Većina wrapper a ovo podržava, ali ne i php://stdout p i php://stderr) p Dozvola writing (Ova operacija omogućava upis podatka upotrebom wrapper a. Većina wrapper a ovo podržava, ali ne i http://) Allows appending (Ova operacija omogućava ć dodavanje d podataka na postojeće stanje Ovo je omogućeno sa wrapper om compress.zlib:// ali ne i sa ftp:// wrapper.) Dozvola simultanog reading i writing (Ova operacija omogućava otvaranje fajla za upis i čitanje podatka upotrebom wrapper a. Većina wrapper a ovo ne podržava, ali podržava ili jednu ili drugu pojedinačnu opciju)
Opisi Podrška za stat(), Ova funkcija omogućava dobijanje informacija u vezi sa fajlom. Podrška za unlink(), Ova funkcija omogućava da se fajl izbriše. Ne podržavaju svi wrapper i ovu mogućnost. Podrška za rename(), Ova funkcija omogućava da se ime fajla promeni. Ne podržavaju svi wrapper i ovu mogućnost. Podrška za mkdir(), Ova funkcija omogućava da se kreira folder tj. direktorijum. ij Ne podržavaju dž svi wrapper i ovu mogućnost. Podrška za rmdir(), Ova funkcija omogućava da se izbriše folder tj. direktorijum. Ne podržavaju svi wrapper i ovu mogućnost.
Upotreba file wrapper a Kada se pomoću fopen() selektuje file wrapper mogu se koristiti sledeće funkcije file sistema Pojedini file wrapper i ne podržavaju neko od ovih funkcija i mogu vratiti error
fgets() Funkcija fgets() vraća kompletnu liniju teksta u odnosu na karakter koji predstavlja kraj linje U principu, fgets() traži default grupu karaktera ne vodeči računa iz kog operativnog sistema dolazi fajl Opcija auto_detect_line_endings u php.ini omogućava da se promeni način rada fgets(). Ako se ova opcija podesi na on, tada fgets() vodi računa kako je u konkretnom fajlu definisan kraj linije, umesto što koristi default nu grupu karaktera
Još po nešto o file wrapper u Nakon rada sa wrapper om, dobra je praksa da se on zatvori pomoću fclose() Od verzije PHP a 4.3.0 postoji nekoliko funkcija koje se mogu koristiti za rad sa wrappper ima, kada se radi sa fajlovima: copy() file_get_contents() file() readfile()
Stream Stream je način kako PHP pristupa fajlu ili mrežnom servisu PHP kreira stream u pozadini i svakog pristupa fajlu
Stream Stream se sastoji od velikog broja manjih komponenti Svaki stream ima transport, najčešće file wrapper, jednu ili dva kanala i neki sadržaj. PHP čuva metadata za svaki stream. Metadata za stream sadrži: Koje komponente je stream ima Dodatne informacije u wrapper u kojima se ne može pristupiti it iti primenom fread() ili sličniih iih Veliki broj podataka dostupan PHP skripti za čitanje Podatak da li je vreme konekcije isteklo ili ne Da li je stream blokiran ili ne Da li su svi podaci iz stream a pročitani ili ne
stream_get_meta_data() Dohvatananje podataka iz metadata streama je pomoću stream_get_meta_data() <?php // we will create a stream by opening this stream, and then we ll // dump the metadata out to see what s there echo Metadata for file:. FILE. \n\n ; $fp = fopen( FILE, r ); var_dump(stream_get_meta_data($fp)); fclose($fp);?> array(6) { [ wrapper_type ]=> string(9) plainfile [ stream stream_type type ]=> string(5) STDIO [ unread_bytes ]=> int(0) [ timed_out ]=> bool(false) [ blocked ]=> bool(true) [ eof ]=> bool(false) }
Primer <?php // http file wrapper // we will create a stream by opening a connection to the PHP // Project s own web server, and then dump the metadata to see // what we have echo Metadata from a connection to: http://www.php.net/\n\n ; $fp $p= fopen( http://www.php.net/, p p p /, r ); stream_filter_append($fp, string.rot13 ); var_dump(stream_get_meta_data($fp)); fclose($fp);?>
Kanali za transport Podaci u stream u prenose se korz jedan ili dva kanala Podaci poslati u stream od strane PHP koda ka nekom fjl fajlu ili mreži Podaci koji se prihvataju od strane fajla ili mrežnog servera. Neki stream ima oba kanala, dok neki ima samo jedan od njih (read pipeline tj. write pipeline)
Stream Transport Na kraju kanala, gledano od strane PHP koda, je stream transport Stream transport je deo koda koji omogućava file wrapperu da direktno komunicira sa bilo kojim stream om na koji je konektovan PHP ima veliki broj ugrađenih transport a STDIO (transport za klasične fajlove, posebno resurse kao što je stdin i stdout) Socket (transport za komunikaciju sa serverom kroz mrežu) PHP automatski bira najbolji transport koji će koristiti sa j j p j file wrapper om koji je definisao programer.
Stream Context Stream context, ili sadržaj stream a, je deo podataka koji se prenosi putem stream a Koristi se za prenos dodatnih opcija za file wrapper ili stream transport. Ovaj sadržaj se generiše upotrebom funkcije stream_context_create(), create() a zatim se prenosi kao parametar funkcije fopen() ili fsockopen(). Različiti file wrapper i i stream transporti prihvataju različite opcije. Na primer, mogu se preneti i opcije za file wrapper i osnovni sadržaj stream transporta u isto vreme. U realnom životu, programer se sa stream om najčešće susreće kroz upotrebu funkcije fopen(), a ređe sa drugim
Koji mrežni transport podržava PHP tcp (konekcija upotrebom Transmission Control Protocol dela TCP/IP udp (konekcija upotrebom User Datagram dela TCP/IP ) ssl (konekcija upotrebom Secure Sockets Layer encryption. SSL radi preko TCP konekcije) j) tls (konekcija upotrebom Transport Layer Security encryption.tls radi preko TCP konekcije) unix (konekcija k na servise koji rade na lokalnom l računaru upotrebom connection orientated UNIX Domain protokola) udg (konekcija na servise koji rade na lokalnom računaru upotrebom connection less UNIX Domain protokola)
Soket Kada se pristupa udeljenom serveru kroz mrežnu infrastrukturu, sva komunikacija se realizuje od strane operativnog sistema računara. Kada se pristupa nekom fajlu na udaljenom dl računara, operativni sistem kreira file handle, ali ako se pristupa serveru, kreira se resurs koji se zove soket. File handle i sockets su vrlo slični i i PHP pokušava da međusobne razlike drži na minimumu. Neki file wrapper i omogućavaju da se pristupmi mrežnom serveru (http) U tom smislu, soket se mora koristiti samo kada file wrapper ne može da uradi neku aktivnost ili kada wrapper ne postoji za neku konkretnu akciju (npr. slanje XML RPC message)
Otvaranje soket a Kreiranje soketa je moguće upotrebom funkcije fsockopen() (konekcija se automatski zatvara kada se skript završi)i pfsockopen(nakonzatvaranja i ponovnog otvaranja koristi se predhodna konekcija) Nakon otvaranja potrebno je definisati koji tip transporta će se koristiti uz definisanje imena ili IP adrese servera na koji se želi konektovati.
Primer <?php // Using fsockopen() // we will open a connection to the PHP Project s website, and download // their front page // note that what comes back is a redirect, and not the front page itself // this is an example of one of the many things that the http file wrapper // automatically ti (and transparently) tl handles for us $fp = fsockopen ( tcp://www.php.net, 80, $sock_errno, $sock_errmsg); fwrite ($fp, GET /\n ); while (!feof($fp)) f( f { echo fgets($fp). \n ; } fclose($fp);?>
Rad sa soketima Ako se ne definiše parametar timeout za fsockopen(), PHP koristi vrednost iz default_socket_timeout unutar php.ini setingsa Ovaj parametar utiče samo na otvaranje soketa, ali ne i na operacije čitanja i pisanja Nakon otvaranja soketa, čitanje se vrči pomoću fread() i sličnih funkcija, dok pisanje pomoću fwrite() i sl. Kada PHP napravi soket on ulazi u blocking mod za taj stream, i čitanje za druge je nemoguće dok se soket ne zatvori od strane udaljenog dlj servera
Timeout za read/write Da bi se izbeglo isključenje blocking moda, može se koristiti stream_set_timeout() da se definiše timeout za čitanje ili pisanje. <?php $fp= fsockopen( tcp://wwwphpnet tcp://www.php.net, 80, $sock_errno, $sock_errmsg); stream_set_timeout($fp, 10); echo Attempting to read from the stream... this will timeout in 10 secs\n\n ; $result = fgets($fp); fl fclose($fp); f echo The fgets() has timed out, and returned:\n ; var_dump($result);?>
Zatvaranje soketa Nakon završenog rada sa soketom, potrebno ga je što pre zatvoriti Računar na kome se izvršava PHP kod ima limitiran broj soketa Zatvaranje soketa je pomoću fclose() <?php $fp = fsockopen ( tcp://www.php.net, 80, $sock_errno, $sock_errmsg); fclose($fp); echo We have opened and closed the stream. When we attempt to read from\n ; echo the stream, PHP will output an error on your screen.\n ; echo fgets($fp);?>
Zend Technologies
Napredno web programiranje