Hvordan jobbe med PHP og FTP

I denne opplæringen er målet vårt å lage en FTP-klasse med PHP som er godt skrevet, nyttig og utvidbart.

Beskriver vårt mål

Det er alltid viktig å først skisse nøyaktig hvilken funksjonalitet klassen din skal inneholde. I vårt tilfelle:

  • kobler til en server
  • lag en mappe på serveren
  • Last opp en fil
  • endre katalogen
  • henter katalogoppføringen
  • Last ned en fil

Når vil jeg bruke en FTP klasse?

Det er flere tilfeller når man kan bruke denne typen klasse. Et par scenarier kan være:

  • Automatiser opplasting av bilder, for eksempel et galleri, til en kundes nettside (ideelt, i forbindelse med min bildeformatering)
  • Utfør off-site sikkerhetskopier ved å overføre en database backup fil fra din server til en annen. (Merk: Dette anbefales ikke for sensitiv informasjon, da FTP ikke er en veldig sikker protokoll.)

Merk: Det er lett å løse problemer med FTP på grunn av forskjellige serverkonfigurasjoner. Denne koden har blitt testet på en rekke FTP-servere.


Hva er FTP?

FTP: "En standard nettverksprotokoll som brukes til å kopiere en fil fra en vert til en annen."

FTP, eller File Transfer Protocol, er, som definert av Wikipedia: "En standard nettverksprotokoll som brukes til å kopiere en fil fra en vert til en annen over et TCP / IP-basert nettverk, for eksempel Internett."

I hovedsak lar det deg kopiere en fil (er) fra en datamaskin til en annen.


Trinn 1 - Fremstilling

Vi starter så enkelt som mulig. I det nye prosjektets rot, opprett to filer: index.php og ftp_class.php.

De index.php filen er vår hovedside som lager objektet og kaller de nødvendige metodene. De ftp_class.php er bare det: vår ftp-klasse.

I neste trinn skal vi lage skjelettet for vår klasse. Når dette er på plass, kan du følge med og prøve hvert steg.


Trinn 2 - Konfigurere klassen

Styrken på Objektorienterte Programmering (OOP) er å gi komplisert kode et brukervennlig grensesnitt. Ved å lage en klasse - tenk på en klasse som et mønster - kan du inkapslere dataene, som bare er jargong for et begrep som refererer til å skjule dataene. Vi kan da gjenbruke denne klassen igjen og igjen uten å måtte omskrive noen av koden. I stedet trenger du bare å ringe til de riktige metodene (begrepet "metode" er det samme som funksjon).

La oss begynne å lage vår ftp-klasse. Åpne din ftp_class.php fil, og legg til følgende kode. Dette er en grunnleggende klasseskelettstruktur, som jeg har kalt 'FTPClient'.

De konstruere funksjon, kjent som en konstruktør, er en spesialklassemetode som automatisk kalles av klassen når du oppretter et nytt objekt, eller forekomst av klassen. Dette er vanligvis et bra sted å legge til noen initialisering; men for dagens formål trenger vi ikke det. Likevel beholder vi det her for fremtidig bruk.

 Klasse FTPClient // *** Klassevariabler offentlig funksjon __construct () 

Vær oppmerksom på at vi bruker en dobbelt understrek for det konstruere metode.


Trinn 3 - Klassevariabler

Deretter stiller vi inn noen klassevariabler eller egenskaper.

 privat $ connectionId; privat $ loginOk = false; privat $ messageArray = array ();

"privat"prefiks definerer variabelenes omfang. I dette tilfellet betyr det at variabelen ikke kan nås fra hvor som helst utenfor klassen.

De $ connectionId variabel lagrer vår tilkoblingsstrøm. De andre to lagrer statusen og eventuelle meldinger. $ loginOk vil være nyttig når du bestemmer om vi er riktig koblet til.


Trinn 4 - Enkel meldingslogging

I nesten alle metoder skal vi kalle en metode som heter 'logMessage. Dette er en veldig enkel meldingshåndterer som lar oss fange opp meldinger som er opprettet av vår klasse, slik at vi kan gi brukeren tilbakemelding.

Legg merke til at vi ikke gjør det komme tilbake de faktiske meldingene fra våre metoder. I stedet vender vi tilbake ekte eller falsk, basert på om en bestemt operasjon var vellykket. Dette har sine fordeler, men også ikke detaljert til brukeren hva som skjer.

Legg til følgende to metoder, slik at vi kan finne ut hva som er vellykket.

Denne metoden aksepterer en variabel, $ melding. Innholdet i denne variabelen lagres deretter i vårt klassearrangement, takket være linjen: $ this-> messageArray [] = $ message;

 privat funksjon logMessage ($ melding) $ this-> messageArray [] = $ message; 

Fordi $ messageArray er en klassevariabel, vi kan få tilgang til den via $ Dette-> notasjon.

Innenfor en klasse, $ dette refererer til selve objektet.

For å hente meldingen, ringer vi getMessages.

 offentlig funksjon getMessages () return $ this-> messageArray; 

Denne metoden er en offentlig metode. Som nevnt tidligere, refererer denne private / offentlige virksomheten ganske enkelt til omfanget av variabelen, eller i dette tilfellet metoden. En privat metode (eller variabel) kan ikke nås utenfor klassen, mens en offentlig metode (eller variabel) kan.

Fordi vår variabel er privat, trenger vi en måte å få tilgang til den. Vi gjør dette ved å gi vår klasse a offentlig metode, som vi kan få tilgang til utenfor klassen. Du lurer kanskje på hvorfor vi ikke bare kan gjøre messageArray variabel offentlig. Vi kan; Når det er sagt, er det bare ikke en god praksis.

Merk: Det er mange eksempler på nettet av fullblåste meldingshåndterere, eller klasser dedikert til dem. Vi jobber med en enkel implementering for formålet med denne opplæringen.


Trinn 5 - Tilkobling

I dette trinnet legger vi til koble metode. Dette vil tillate oss å koble til en FTP-server.

 offentlig funksjonstilkobling ($ server, $ ftpUser, $ ftpPassword, $ isPassive = false) // *** Konfigurer grunnleggende tilkobling $ this-> connectionId = ftp_connect ($ server); // *** Logg inn med brukernavn og passord $ loginResult = ftp_login ($ this-> connectionId, $ ftpUser, $ ftpPassword); // *** Setter passiv modus på / av (standard av) ftp_pasv ($ this-> connectionId, $ isPassive); // *** Kontroller tilkobling hvis ((! $ This-> connectionId) || (! $ LoginResult)) $ this-> logMessage ('FTP-tilkoblingen har mislyktes!'); $ this-> logMessage ('Forsøk på å koble til'. $ server. 'for bruker'. $ ftpUser, true); returner falsk;  ellers $ this-> logMessage ('Koblet til'. $ server. ', for bruker'. $ ftpBruger); $ this-> loginOk = true; returnere sant; 

Vi sender i vår forbindelsesinformasjon: serveren ($ serveren), brukernavn ($ ftpUser), og passord ($ ftpPassword) slik at vi kan etablere en forbindelse.

Den første linjen med kode åpner en FTP-tilkobling, med ftp_connect, til den angitte serveren. Vi lagrer vår forbindelse til klassevariabelen, $ connectionId beskrevet ovenfor.

Koden, ftp_login logger oss inn i den angitte forbindelsen, passerer i vår tilkoblings-ID, vårt brukernavn og passord.

Du har kanskje lagt merke til ftp_pasv linje med kode. Dette, som kommentaren antyder, slår på / av passiv modus. Jeg vil foreslå at du legger den av, men hvis du har problemer med å koble til, kan du prøve å slå den på. Passiv modus kan forårsake litt av en hoppe når du kobler via FTP.

Vi avgjør om tilkoblingen var vellykket. Vi logger deretter resultatene ved å ringe vår enkle meldingshåndteringsmetode, logMessage (), og pass strenget for å logge. Husk: vi bruker $ Dette-> å få tilgang logMessage (), som det er en klassevariabel.


Trinn 6 - Kaller objektet

Nå som vår klasse jobber, kan vi teste det ut! Åpne din index.php fil, og legg til følgende kode.

Du trenger tilgang til en FTP-server for å kunne spille sammen. Hvis du ønsker å sette din egen server opp, prøv Filezilla - det er gratis også.

Du vil legge merke til at jeg har lagt til FTP-serverens detaljer her. Ideelt sett vil disse bli lagret i ditt config fil. Endre disse for å matche innstillingene til FTP-serveren din.

Etter å ha definert våre FTP-serverdetaljer, inkluderer vi klassen med omfatte ( 'ftp_class.php');. Dette betyr: gjør klassen tilgjengelig fra denne siden. Neste linje oppretter et objekt i vår FTP-klasse, og lagrer den i variabelen, $ ftpObj. $ ftpObj Vil nå bli brukt til å få tilgang til alle offentlige metoder i vår klasse. Dette gjøres ved å bruke -> notasjon, akkurat som den følgende linjen gjør ved å ringe $ ftpObj -> koble til metode og passerer det våre serverdetaljer.

 // *** Definer verts-, brukernavn og passord definere ('FTP_HOST', '192.168.1.88'); define ('FTP_USER', 'Blimpf'); define ('FTP_PASS', 'steinbit'); // *** Inkluder klassen inkluderer ('ftp_class.php'); // *** Opprett FTP-objektet $ ftpObj = nytt FTPClient (); // *** Koble $ ftpObj -> koble til (FTP_HOST, FTP_USER, FTP_PASS);

Som du kan se, når vår klasse er på plass, er det ganske enkelt å koble til vår FTP-server!


Trinn 6b - Vise utgangen

I det siste trinnet kunne vi pakke sammen anropet i en hvis uttalelse, som vist nedenfor. Så, hvis vi ikke kobler til, vil den avhengige koden ikke bli utført. Vi kan deretter sende ut eventuelle meldinger til brukeren, for eksempel "tilkoblet" eller "mislyktes".

 // *** Koble til hvis ($ ftpObj -> koble til (FTP_HOST, FTP_USER, FTP_PASS)) // *** Legg deretter til FTP-kode her ekko 'koblet';  ellers echo 'klarte ikke å koble til'; 

Dette er greit, selv om vår kode raskt blir oppblåst med IF / ELSE-setninger, hvis vi legger til dette i alle våre samtaler. I stedet vil jeg tilby et alternativ som gjør ting litt renere og enklere å følge.

Husker du meldingshåndteringsmetodene vi har lagt til? Hvis du ønsker å se meldingene som er produsert av klassen - nyttig for feilsøking / tilbakemelding - kan du legge til følgende kode etter hvilken som helst metode du ringer.

 print_r ($ ftpObj -> getMessages ());

Dette vil vise klassemeldingen.


Trinn 7 - Å lage vår første katalog

Utmerket, nå er det på tide å gjøre noe nyttig. Den første metoden vi skal lage er makeDir metode. Som forventet, vil denne metoden opprette kataloger for oss på serveren. Den eneste parameteren vi vil passere er katalogbanen og mappenavnet; vi ringer det $ katalog. Den magiske linjen her er ftp_mkdir innebygd funksjon. Den bruker vår lagrede "connectionId"og passerte inn $ katalog variabel for å lage mappen.

Legg til følgende kode i din ftp_class.php fil:

 offentlig funksjon makeDir ($ katalog) // *** Hvis du oppretter en katalog, lykkes det? if (ftp_mkdir ($ this-> connectionId, $ directory)) $ this-> logMessage ('Directory' '. $ katalog.' "created successfully '); returnere sant;  ellers // ***? Else, feil. $ this-> logMessage ('Mislyktes med å opprette katalog' '. $ directory.' "'); returner falsk; 

Og å ringe det fra din index.php fil, legg til:

 $ dir = 'photos'; // *** Lag katalogen $ ftpObj-> makeDir ($ dir);

Variabelen, $ dir er satt til navnet på mappen vi vil opprette på serveren. I dette tilfellet: "bilder".

Neste linje kaller metoden som vil opprette mappen.

Hvis du mottar en "Tillatelse nektet" -feil, må du kontrollere at du kan skrive i den angitte mappen. Du må kanskje lage mappen i en katalog, for eksempel / httpdocs.


Trinn 8 - Laster opp en fil

Fortsett på, la oss laste opp et bilde, kalt zoe.jpg. Når du laster opp en fil, må vi spesifisere hvilken type fil vi laster opp - binær eller ascii? I utgangspunktet, hvis du laster opp en tekstfil, bør vi bruke ascii; ellers bør den settes til binær.

Vi begynner med å sette opp en matrise med alle utvidelsene som vi skal bruke for en ascii skriv opplasting.

 $ asciiArray = array ('txt', 'csv');

Da henter vi utvidelsen av filen, så vi kan teste om det er en av ascii typer. Vi bestemmer dette ved å få utvidelsen av filen vi laster opp. Den raske og skitne metoden jeg har brukt her er
ved å "eksplodere" filen ved hjelp av ".'som avgrenseren. Dette vil dele filen i stykker, og lagre dem som en matrise. Ved å bruke en annen innebygd PHP-funksjon, "slutt", velger vi sist matrise element som inneholder utvidelsen vår. Det er en ryddig liten kode.

 $ extension = end (eksplodere ('.', $ fileFrom));

Deretter tester vi om utvidelsen vår vises i listen (med in_array) av filutvidelser som skal lastes opp som type ascii. Hvis det vises i listen, angir vi variabelen $ modus til FTP_ASCII; Ellers antar vi at det er av binær type, og tilordne $ modus verdien FTP_BINARY.

 in_array ($ extension, $ asciiArray)

ftp_put laster opp en fil fra din lokale plassering til en ekstern fil på ftp-serveren. Vi sender det vår "connectionId", banen til filen vi vil laste opp til ($ fileTo), banen
av filen vi vil laste opp ($ fileFrom), og modusen ($ modus) som vi nettopp har bestemt oss for.

Deretter legger du til følgende metode for din ftp_class.php fil:

 offentlig funksjon uploadFile ($ fileFrom, $ fileTo) // *** Sett overføringsmodus $ asciiArray = array ('txt', 'csv'); $ extension = end (eksplodere ('.', $ fileFrom)); hvis (in_array ($ extension, $ asciiArray)) $ mode = FTP_ASCII;  ellers $ modus = FTP_BINARY;  // *** Last opp filen $ upload = ftp_put ($ this-> connectionId, $ fileTo, $ fileFrom, $ modus); // *** Kontroller opplastingsstatus hvis (! $ Opplasting) $ this-> logMessage ('FTP opplasting har mislyktes!'); returner falsk;  andre $ this-> logMessage ('Uploaded' '. $ fileFrom.' "som" '. $ fileTo); return true;

Sikkert, du kan opprette eller laste opp et hvilket som helst mappenavn du ønsker! Legg til denne neste kodestykket til din index.php fil, og juster deretter.

 $ fileFrom = 'zoe.jpg'; $ fileTo = $ dir. '/'. $ FileFrom; // *** Last opp lokal fil til ny katalog på server $ ftpObj -> uploadFile ($ fileFrom, $ fileTo);

Nå skal du komme til uttrykk for hvor enkelt denne klassen er å bruke! Vi gjør bare enkeltsamtaler for å utføre våre oppgaver - alt takket være objektorientert programmering!


Trinn 9 - Viser filene

La oss nå bekrefte at filen vår er i bilde mappe. Vi kan gjøre det ved å navigere til "bilde'mappe på vår server, og deretter vise innholdet.

De changeDir metoden bruker "ftp_chdir"for å endre gjeldende katalog på ftp serveren. Bare pass i katalogen for å bytte til. Enkel og søt.

ftp_class.php:

 offentlig funksjon changeDir ($ katalog) if (ftp_chdir ($ this-> connectionId, $ directory)) $ this-> logMessage ('Gjeldende katalog er nå:'. ftp_pwd ($ this-> connectionId)); returnere sant;  ellers $ this-> logMessage ('Kunne ikke endre katalogen'); returner falsk; 

getDirListing vil vise innholdet i katalogen du er inne ved å bruke funksjonen "ftp_nlist"Denne funksjonen returnerer en liste over filer i en gitt katalog. Gjeldende katalog er satt som standard, slik at du ikke trenger å angi noen parametere.

Hvis du ønsker det, kan du overstyre dette ved å passere i $ katalog sti du ønsker å se innholdet på. De $ parametere variable standardinnstillinger til '-la'. Dette er en Linux-kommando for å vise mer informasjon om katalogen. Du er velkommen til å fjerne den eller sende den i en tom streng.

ftp_class.php:
 offentlig funksjon getDirListing ($ directory = '.', $ parameters = '-la') // få innholdet i gjeldende katalog $ contentArray = ftp_nlist ($ this-> connectionId, $ parameters. contentArray;

De getDirListing Metoden returnerer en matrise som inneholder vår katalogoppføring.

index.php
 // *** Endre til mappe $ ftpObj-> changeDir ($ dir); // *** Få mappeinnhold $ contentArray = $ ftpObj-> getDirListing (); // *** Utfør vårt utvalg av mappeinnhold ekko '
'; print_r ($ contentsArray); ekko '

';

Ditt resultat skal se slik ut:


Trinn 10 - Last ned en fil

Når vi presser mot konklusjonen av denne opplæringen, fortsetter vi videre med å laste ned filen. Metoden starter med samme kode som Last opp fil, ved at det avgjør om filen vi vil laste ned er ascii eller binær.

For denne metoden passerer du bare i filnavnet (og muligens banen, avhengig av om du er i samme mappe som filen du vil laste ned) av filen du vil laste ned, og navnet du ønsker at filen skal ha på klientmaskinen din.

For å laste ned en fil, må du ringe ftp_get.

 ftp_get ($ this-> connectionId, $ fileTo, $ fileFrom, $ modus, 0)

Dette laster ned en fil fra en ekstern server til vår lokale maskin. Den aksepterer følgende parameter: vårt tilkoblings-ID, banen og filnavnet for å lagre som lokalt (vil bli overskrevet hvis det
eksisterer allerede) ($ fileTo), plasseringen og navnet på filen på den eksterne serveren ($ fileFrom), og modusen ($ modus).

ftp_class.php
 offentlig funksjon downloadFile ($ fileFrom, $ fileTo) // *** Sett overføringsmodus $ asciiArray = array ('txt', 'csv'); $ extension = end (eksplodere ('.', $ fileFrom)); hvis (in_array ($ extension, $ asciiArray)) $ mode = FTP_ASCII;  ellers $ modus = FTP_BINARY;  // Prøv å laste ned $ remote_file og lagre det til $ handle if (ftp_get ($ this-> connectionId, $ fileTo, $ fileFrom, $ modus, 0)) return true; $ this-> logMessage ('file' '. $ fileTo.' "vellykket lastet ned ');  ellers return false; $ this-> logMessage ('Det oppstod en feil å laste ned filen' '. $ fileFrom.' "til" '. $ fileTo.' "'); 

Vi skal laste ned den samme filen vi lastet opp ved å lagre den med et annet navn på vår klientmaskin.

Merk: Igjen, sørg for at tillatelsene dine er angitt riktig!

Fordi vi nå skal være inne i vår bilde mappe, legger vi ikke til en bane til $ fileFrom variabel - bare filnavnet.

index.php
 $ fileFrom = 'zoe.jpg'; # Plasseringen på serveren $ fileTo = 'zoe-new.jpg'; # Lokal dir å lagre til // *** Last ned fil $ ftpObj-> downloadFile ($ fileFrom, $ fileTo);

Trinn 11 - Etterbehandling

For å fullføre vår klasse, la oss legge til klassen magiske metoden, __deconstruct. Denne metoden lukker forbindelsen vår når referansen til objektet ikke lenger eksisterer - kanskje siden ble stengt. Under alle omstendigheter kjøres denne koden og forbindelsen er stengt. Det er alltid en god praksis å inkludere dette, selv om det ikke er helt nødvendig.

 offentlig funksjon __deconstruct () hvis ($ this-> connectionId) ftp_close ($ this-> connectionId); 

Konklusjon

Vel det gjør det! Jeg håper du nå har en bedre forståelse av hvordan du bruker FTP med PHP. Du bør nå ha de nødvendige ferdighetene til å utvide denne klassen ytterligere for å støtte andre vanlige oppgaver, for eksempel å omdøpe eller slette filer og mapper.

Sørg for å gi oss beskjed hvis du lager noen kule PHP FTP klienter!