Bygg en CMS phpPress

I de siste opplæringsprogrammene har jeg vist deg hvordan du lager et flatt filsystems innholdshåndteringssystem (CMS) ved hjelp av Go, Node.js og Ruby. 

I denne opplæringen skal jeg ta samme designmodell og bygge en server ved hjelp av PHP. Siden PHP ikke er en server av seg selv, men vanligvis er parret med Apache-webserveren, viser jeg deg hvordan du konfigurerer Apache-webserveren i et virtuelt Vagrant-system.

Oppsett og innlasting av biblioteker

For å starte, må du ha PHP installert på systemet. Gå til PHP-nettstedet og last ned versjonen for systemet ditt. De fleste Linux-distribusjoner og alle Mac OS X-systemer har PHP allerede installert.

Deretter installerer du Komponist, en pakkebehandling for PHP lik npm for Node.js. For å installere Komponist skriver du inn følgende i en terminal:

php -r "readfile ('https://getcomposer.org/installer');" | php

Med Composer installert, installeres bibliotekene for serveren neste. Først opprett en katalog for prosjektet med filene fra å bygge et CMS: Structure and Styling eller trekk ut nedlastingen for denne opplæringen. Når du er satt opp, gå til den katalogen og skriv inn:

komponist krever slank / slank "^ 3.0" komponist krever erusev / parsedown komponist krever zordius / lightncandy: dev-master komponist krever "talesoft / tale-jade: *" komponist installere

Disse linjene installerer de fire bibliotekene som utgjør serveren: Slim Router er rutebiblioteket for å behandle innkommende serverforespørsler, Parsedown oversetter Markdown til HTML, Handlebars er det templerende biblioteket, og Jade-biblioteket er en kortfattet form for HTML som Jeg bruker til å lage indekssider for innlegg.

Opprette index.php

Opprett filen index.php øverst i prosjektkatalogen. Apache-serveren forventer at hovedsiden for nettstedet skal ha dette navnet. I denne filen, legg inn følgende kode:

 

Krever utsagnet tillater PHP å laste inn de forskjellige bibliotekene som er installert med Composer. Deretter forteller du PHP for å bruke LightnCandy og Jade-bibliotekene.

// // Slim Router: http://www.slimframework.com/ // use \ Psr \ Http \ Message \ ServerRequestInterface som forespørsel; bruk \ Psr \ Http \ Message \ ResponseInterface som svar; $ app = new \ Slim \ App; // // Angi en feilhåndterer. // $ c = $ app-> getContainer (); $ c ['errorHandler'] = funksjon ($ c) returfunksjon ($ forespørsel, $ respons, $ unntak) bruk ($ c) return $ c ['response'] -> withStatus (400) -> withHeader 'Content-Type', 'text / html') -> skriv (ProcessPage ($ parts ['layout'], "ErrorPage")); ; ; // // Denne linjen vil føre til at Slim ikke tar feil. Vennligst forplikte seg til // produksjonsserver. // unset ($ app-> getContainer () ['errorHandler']);

Deretter setter du opp Slim-ruteren ved å lage en forekomst av Slim-appobjektet og angi feilbehandleren. Med feilhåndteringssettet får du aldri feilsøkingsinformasjon når det oppstår en feil. Derfor, mens du utvikler, må du deaktivere feilbehandleren. Men for produksjon, kommentere siste linje med unset.

// // Få server.json informasjonen til globale variabler i webområdet. // $ site = __DIR__. '/nettstedet'; $ style = "Basic"; $ layout = "SingleCol"; $ styleDir = './themes/styling/'. $ Stil; $ layoutDir = './themes/layouts/'. $ Layout; $ parts = Array (); $ parts ["CurrentLayout"] = "SingleCol"; $ parts ["CurrentStyling"] = "Basic"; $ parts ["ServerAddress"] = "http: // localhost: 8080"; $ parts ["SiteTitle"] = "Test Site"; $ deler ["Sitebase"] = "./site/"; $ deler ["TemplatBase"] = "./themes/"; $ deler ["Cache"] = false; $ deler ["MainBase"] = ""; // // Last inn relevante elementer i oppsettkatalogen. // $ parts ["layout"] = file_get_contents ($ layoutDir. '/template.html'); // // Last inn relevante elementer i stilarkatalogen. // $ parts ["404"] = file_get_contents ($ styleDir. '/404.html'); $ deler ["footer"] = file_get_contents ($ styleDir. '/footer.html'); $ deler ["header"] = file_get_contents ($ styleDir. '/header.html'); $ parts ["sidebar"] = file_get_contents ($ styleDir. '/sidebar.html'); $ deler ["ErrorPage"] = "

Det oppstod en serverfeil!

“; // // Legg alt i delkatalogen. // $ d = dir ($ site. '/ parts /'); mens (false! == ($ entry = $ d-> les ())) if ((strcmp ($ entry, "...")! = 0) && (strcmp ($ entry, ".")! = 0 )) $ pathparts = pathinfo ($ entry); $ parts [basename ($ pathparts ['filnavn'])] = figurePage ($ site. '/ parts /'. $ pathparts ['filnavn']); $ d-> lukk ();

Den neste delen av koden er opprettelsen av $ deler hashbord for lagring av brikkene med informasjon som brukes i malene. Programmet legger deretter til alt i nettstedets delkatalog til hashbordet. På den måten kan du opprette gjenbrukbare brikker for å legge til en hvilken som helst side.

// // Funksjon: SetBasicHeader // // Beskrivelse: Denne funksjonen vil sette grunnleggende overskrift // informasjon som trengs. // // Inputs: // $ response Svaret objektet skal // sendes til nettleseren. // funksjon SetBasicHeader ($ respons) $ newResponse = $ response-> withAddedHeader ("Cache-Control", "max-age = 2592000, cache"); $ newResponse = $ newResponse-> withAddedHeader ("Server", "phpPress - et CMS skrevet i PHP fra Custom Computer Tools: http://customct.com."); avkastning ($ newResponse); 

De SetBasicHeader () funksjonen angir returteksten for alle sidene. Dette angir hurtigkontrollfunksjonene og navnet på serveren. Hvis du trenger mer headerinformasjon, er dette her du ville sette den.

// // Array of shortcodes og deres funksjoner. // $ shcodes = Array ('box' => funksjon ($ args, $ inside) return ("
". $ innsiden. “
“); , 'Column1' => funksjon ($ args, $ innsiden) return ("
". $ innsiden. “
“); , 'Column2' => funksjon ($ args, $ inside) return ("
". $ innsiden. “
“); , 'Column1of3' => funksjon ($ args, $ inside) return ("
". $ innsiden. “
“); , 'Column2of3' => funksjon ($ args, $ innsiden) return ("
". $ innsiden. “
“); , 'Column3of3' => funksjon ($ args, $ inside) return ("
". $ innsiden. “
“); , 'php' => funksjon ($ args, $ inside) return ("
". $ innsiden. “
“); , 'js' => funksjon ($ args, $ innsiden) return ("
". $ innsiden. “
“); , 'html' => funksjon ($ args, $ innsiden) return ("
". $ innsiden. “
“); , 'css' => funksjon ($ args, $ inside) return ("
". $ innsiden. “
“); );

De $ shcodes hash-tabellen inneholder alle kortnummerfunksjonene for behandling av elementer på en nettside. Funksjonene jeg skrev her er enkle, men de kan være mer komplekse om nødvendig. Dette gir en måte å legge inn mer dynamisk kode i websidene dine.

// // Funksjon: processShortcodes // // Beskrivelse: Denne funksjonen vil utvide alle // kortkoder på siden som er gitt til // den. // funksjonsprosessKortkoder ($ side) global $ shcodes; $ resultat = ""; mens (preg_match ("/ \ - \ [(\ w +) (. *) \] \ - / i", $ side, $ match) == 1) $ num = count ($ match); $ command = $ match [1]; $ cmdarg = ""; hvis ($ num> 2) $ cmdarg = $ match [2];  $ spos = strpos ($ side, "- [$ command"); $ resultat. = substr ($ side, 0, $ spos); $ side = substr ($ side, $ spos + 4 + strlen ($ kommando) + strlen ($ cmdarg)); $ sepos = strpos ($ side, "- [/ $ command] -"); $ inside = trim (substr ($ side, 0, $ sepos)); hvis (strcmp ($ inside, "")! = 0) $ inside = processShortcodes ($ inside);  $ side = substr ($ side, $ sepos + 5 + strlen ($ kommando)); // // Hvis kommandoenavnet finnes i // shortcodes hash-tabellen, kjør du // -funksjonen. // hvis (array_key_exists ($ command, $ shcodes)) $ result. = call_user_func ($ shcodes [$ command], $ cmdarg, $ inside);  $ resultat. = $ side; avkastning ($ resultat); 

De processShortCodes () funksjonen finner, utfører og legger inn resultatene av en kortkode. Denne funksjonen finner alle kortkoder på en side ved å kalle seg rekursivt på vedlagte innhold og resten av siden.

En kortkode har følgende syntaks:

-[navn arg] - innhold - [/ navn]-

Navnet er navnet på kortnummeret, arg Er argumentene overført til kortnummeret, og innhold er delen av siden som kortnummeret omslutter. De -[ og ]- handle akkurat som < og > i HTML.

// // Opprett HandleBar helpers array. // $ helpers = Array ('flags' => LightnCandy :: FLAG_HANDLEBARS | LightnCandy :: FLAG_ADVARNAME | LightnCandy :: FLAG_EXTHELPER, 'helpers' => Array ('lagre' => 'save_helper', 'date' => 'date_helper ',' cdate '=>' cdate_helper ')); // // Funksjon: save_helper // // Beskrivelse: Denne hjelperen lagrer den oppgitte teksten til // det oppgitte navnet. Det navnet kan brukes // sistnevnte i dokumentet. // // Inputs: // $ args Argumentene sendes til // -hjelpfunksjonen. // funksjon save_helper ($ args) global $ parts; $ arg = implode ("", $ args); $ hparts = eksplodere ("|", $ arg); hvis (telle ($ hparts) == 2) $ deler [$ hparts [0]] = $ hparts [1]; returner $ hparts [1];  ellers return $ parts [$ hparts [0]];  // // Funksjon: date_helper // // Beskrivelse: Denne funksjonen formaterer gjeldende dato // i henhold til formateringsstrengen som er gitt. // // Inputs: // $ args Argumenter sendt til hjelperen // funksjon date_helper ($ args) $ dateFormat = implode ("", $ args); returdato ($ dateFormat);  // // Funksjon: cdate_helper // // Beskrivelse: Denne funksjonen formaterer datoen gitt // i henhold til formateringsstrengen som er gitt. // // Inputs: // $ args Argumenter sendt til hjelperen // funksjon cdate_helper ($ args) returdato ($ args [0], $ args [1]); 

Den neste delen inneholder hjelpefunksjonene for å legge til hjelpere til håndtaksmalmotoren. Hjelperfunksjonene er lagre, Dato, og cdate. De lagre funksjonen tar et navn og litt tekst. Uansett er navnet gitt i en makro, vil teksten gitt erstatte den. Datofunksjonen tar gjeldende dato og formaterer den i henhold til formateringsstrengen som er gitt. De cdate funksjonen tar en dato og en formateringstreng. Det vil sette den oppgitte datoen til det oppgitte formatet.

// // Funksjon: ProcessPage // // Beskrivelse: Denne funksjonen vil behandle en side i // mal, behandle alle mustache // makroer, og behandle alle kortkoder. // // Inputs: // $ layout Oppsettet for siden // $ side Sidene hovedinnhold // funksjon ProcessPage ($ layout, $ side) global $ site, $ parts, $ helpers; // // Vi trenger en midlertidig fil for å lage // Handlebars rendering funksjonen. Du må / / må endre dette avhengig av systemet ditt. // $ php_inc = "/var/tmp/handlebarsTemp.php"; // // Få innholdet på siden. // $ parts ['content'] = figurePage ($ side); // // Først må du sende håndtakene. // $ phpStr = LightnCandy :: kompilere ($ layout, $ helpers); file_put_contents ($ php_inc, $ phpStr); $ renderer = include ($ php_inc); $ side = $ renderer ($ deler); // // Behandle kortkodene. // $ pageShort = processShortcodes ($ side); // // andre passerer styrene. // $ phpStr = LightnCandy :: kompilere ($ sideShort, $ helpers); file_put_contents ($ php_inc, $ phpStr); hvis ($ phpStr! = "") $ renderer = include ($ php_inc); $ side = $ renderer ($ deler);  // // Retur resultatene. // retur ($ side); 

Den neste funksjonen er ProcessPage (). Denne funksjonen tar oppsettet for siden og innholdet på siden. Den vil kombinere dem ved hjelp av LightnCandy Handlebars malmotor. Den resulterende siden blir deretter søkt etter kortkoder. Den resulterende siden etter det kjøres igjen gjennom LightnCandy. Nettleseren mottar utgangen fra LightnCandy.

// // Oppsett ruteplanene. // funksjonsside ($ sideAddress) global $ site, $ parts; $ page = ProcessPage ($ parts ['layout'], "$ site / pages / $ pageAddress"); avkastning ($ side); 

De side() funksjonen bestemmer hvilken side som skal sendes til brukeren. Funksjonen mottar sidenadressen fra ruteren og samtalene ProcessPage () å lage siden.

funksjonsposter ($ postType, $ blog, $ pageAddress) global $ site, $ parts; $ page = ProcessPage ($ parts ['layout'], "$ site / posts / $ postType / $ blog / $ sideAddress"); avkastning ($ side); 

De innlegg () funksjon fungerer akkurat som side() funksjon for innleggsinnhold. Ruteren sender posttype, blogg og sideadresse verdier fra ruten. Denne funksjonen bruker deretter ProcessPage () å opprette siden for å returnere.

funksjon figurePage ($ side) global $ site, $ parts; $ resultat = ""; hvis (isset ($ parts [$ side])) // // Et nettsted delvis ble spesifisert. Bruk det. // $ resultat = $ deler [$ side];  annet hvis (file_exists ("$ page .html")) // // Det er et HTML-stykke. Bare kjøp den og send den videre. // $ result = file_get_contents ("$ side .html");  annet hvis (file_exists ("$ page .md")) // // Det er et markdown-stykke. Behandle inn i HTML og passere // den på. // $ Parsedown = ny Parsedown (); $ result = file_get_contents ("$ side .md"); $ result = $ Parsedown-> text ($ resultat); $ result = str_replace ("" "," \ "", $ resultat); annet hvis (file_exists ("$ side .amber")) // // Det er en Jade (ved hjelp av golangnavnet for // $ jade = nytt Jade \ Renderer (); $ jade-> addPath (dirname ($ side)); $ resultat = $ jade-> gjengi (basenavn ($ side)); else  $ result = $ parts ["404"]; // // gi det resulterende sideinnholdet. // retur ($ resultat);

De figurePage () funksjonen får riktig sideinnhold basert på navnet gitt. Funksjonen vil se etter en fil med .html-utvidelsen. Hvis det er en, leser det det inn og sender det til kallingsrutinen. 

Deretter ser funksjonen etter en .md-utvidelse. Hvis det er en, leser det det, konverterer Markdown til HTML, og returnerer det til kallingsrutinen. Deretter ser funksjonen om det er en med .amber-utvidelsen. Hvis det er en, leser det det, konverterer Jade-syntaks til HTML, og returnerer det til kallingsfunksjonen.

// // Denne ruten håndterer hoved- eller hjemmesiden. // $ app-> få ('/', funksjon (forespørsel $ forespørsel, svar $ respons) $ newResponse = SetBasicHeader ($ respons); $ newResponse = $ newResponse-> getBody () -> skriv ')); returnere ($ newResponse););

Denne rutefunksjonen kartlegger hoved- eller hjemmesiden for nettstedet. Dette vil brann for alle forespørsler til domenenavnet med eller uten en '/'.

// // Denne ruten håndterer favicon-lastingen. // $ app-> get ('/ favicon.ico', funksjon (Request $ request, Response $ response) global $ site; $ newResponse = SetBasicHeader ($ respons); $ newResponse = $ newResponse-> withAddedHeader -type "," bilde / ico "); $ newResponse-> getBody () -> skriv (file_get_contents (" $ site /images/favicon.ico ")); returnere ($ newResponse););

Denne rutedefinisjonen kartlegger den spesifikke forespørselen: /favicon.ico. Dette gir favicon for nettstedet. Den returnerer bildet "/images/favicon.ico" i nettstedskatalogen.

// // Denne ruten håndterer alle stilarkene som lastes inn som ett // ark. // $ app-> get ('/ stylesheets', funksjon (Request $ request, Response $ respons) global $ site; $ newResponse = $ response-> withHeader ("Content-type", "text / css"); $ newResponse = SetBasicHeader ($ newResponse); $ newResponse-> getBody () -> skriv (file_get_contents ("$ site /css/final/final.css")); returnere ($ newResponse););

Denne ruten får det sammensatte stilarket og returnerer det til søkeren. Det sammensatte stilarket er alltid "/css/final/final.css".

// // Denne ruten håndterer lastingen av skriptene. // $ app-> get ('/ scripts', funksjon (Request $ request, Response $ respons) global $ site; $ newResponse = $ response-> withAddedHeader ("Content-type", "text / javascript"); $ newResponse = SetBasicHeader ($ newResponse); $ newResponse-> getBody () -> skriv (file_get_contents ("$ site /js/final/final.js")); returnere ($ newResponse););

Denne ruten returnerer alltid kompilert JavaScript-fil funnet på "/js/final/final.js".

// // Denne ruten håndterer alle bilderuter. // $ app-> get ('/ images / image', funksjon (forespørsel $ forespørsel, svar $ respons) global $ site; $ ext = pathinfo ($ request-> getAttribute ('image'), PATHINFO_EXTENSION) ; $ newResponse = SetBasicHeader ($ respons); $ newResponse = $ newResponse-> withAddedHeader ("Innholdstype", "image / $ ext"); $ newResponse-> getBody () -> skriv (file_get_contents ("$ site  / bilder / ". $ request-> getAttribute ('image'))); returnere ($ newResponse););

Denne ruten behandler alle forespørsler om bilder. De bilde forteller rutekoden for å gi bildenavnet til funksjonen. Anropet til $ Forespørsel-> getAttribute () funksjonen henter verdien.

// // Denne ruten håndterer alle videoelementene. // $ app-> get ('/ videos / video', funksjon (forespørsel $ forespørsel, svar $ respons) global $ site; $ newResponse = SetBasicHeader ($ response); $ newResponse = $ response-> withAddedHeader "Innholdstype", "video / mp4"); $ newResponse-> getBody () -> skriv (file_get_contents ("$ site / video /". $ Request-> getAttribute ('video'))) ($ newResponse););

Denne ruten får alle videoanmodningene og sender dem til nettleseren.

// // Denne ruten håndterer alle blogginnleggssidene. // $ app-> get ('/ posts / blogs / blog', funksjon (Request $ request, Response $ response) $ newResponse = SetBasicHeader ($ respons); $ newResponse-> getBody () -> skriv innlegg ("blogger", $ request-> getAttribute ('blog'), "index")); returnere ($ newResponse););

Denne ruten returnerer en liste over bloggoppføringer og deres oppsummeringer. De Blog variabel vil være bloggnavnet for å liste oppføringer.

$ app-> get ('/ posts / blogs / blog / post', funksjon (forespørsel $ forespørsel, svar $ respons) $ newResponse = SetBasicHeader ($ respons); $ newResponse-> getBody () -> skriv (innlegg ("blogger", $ request-> getAttribute ('blog'), $ request-> getAttribute ('post'))); returnere ($ newResponse););

Denne ruten får en individuell bloggoppføring. Blog er navnet på bloggen, og post er blogginnlegget å få.

// // Denne ruten håndterer alle nyhetsinnleggssidene. // $ app-> get ('/ posts / news / news', funksjon (forespørsel $ forespørsel, svar $ respons) $ newResponse = SetBasicHeader ($ respons); $ newResponse-> getBody () -> skriv innlegg ("nyheter", $ request-> getAttribute ('news'), "index")); returnere ($ newResponse);); $ app-> get ('/ posts / news / news / post', funksjon (forespørsel $ forespørsel, svar $ respons) $ newResponse = SetBasicHeader ($ respons); $ newResponse-> getBody () -> skriv (innlegg ("nyheter", $ request-> getAttribute ('news'), $ request-> getAttribute ('post'))); returnere ($ newResponse););

Nyhetsrouterforespørsler fungerer akkurat som bloggerforespørsler.

// // Denne ruten vil behandle alle sidene. Siden dette bør // fange alle typer ruter annet enn hjemmesiden, bør denne // ruten også håndtere de ukjente sidene. // $ app-> get ('/ page', funksjon (forespørsel $ forespørsel, svar $ respons) $ newResponse = SetBasicHeader ($ response); $ newResponse-> getBody () -> skriv -> getAttribute ('page'))); returnere ($ newResponse););

Dette er den generiske sidelinjen. Alle forespørsler som ikke samsvarer med noen av de forrige forespørsler, vil utløse denne forespørselen.

// Svar på forespørsler. // $ app-> run (); ?>

Denne siste koden starter serveren. Denne funksjonen vil gjøre all behandling for forespørselen. Ved retur, avsluttes PHP-tolken og lukker koblingen til brukerens nettleser.

Denne PHP-serveren virker helt annerledes enn de andre serverne i denne serien. Denne rutinen starter og slutter for hver forespørsel, mens de andre serverne fortsetter å behandle forespørsler. Derfor tar denne PHP-serveren lengre tid å behandle forespørsler på grunn av lasting og lossing av rutinene.

Få serveren opp

Nå for å sette opp serveren. En av de enkleste måtene å få en Apache og PHP stack er å bruke Vagrant. For å installere på en Mac, bruk Homebrew med denne kommandoen:

brew cask install vagrant

Hvis du har et Windows- eller Linux-system, må du bruke installatørene fra Vagrant-nettstedet. Nettstedet har også et frittstående installasjonsprogram for Mac, men ved å installere med Homebrew, kan du få automatiske oppdateringer ved å kjøre:

bryg oppdatering

Når du er installert, opprett en fil med navnet Vagrant i prosjektkatalogen. I denne filen, legg inn følgende kode:

Vagrant.configure ("2") do | config | config.vm.box = "ubuntu / trusty64" config.vm.provision: shell, bane: "bootstrap.sh" config.vm.network: forwarded_port, vert: 8080, gjest: 8080 config.vm.synced_folder "/ full / sti / til / kode / katalog "," / vagrant "-end

Dette er Vagrants konfigurasjonsfil. Den forteller Vagrant hvilken virtuell maskinboks som skal bygges på, skriptet skal løpe for å sette opp boksen for serveren din, hvilke porter i den virtuelle maskinen som skal kartlegges til porter på hoveddatamaskinen din, og mappen som skal synkroniseres med mappen / vagrant i den virtuelle maskinen. Du må sette hele banen til katalogen på datamaskinen i stedet for / Full / sti / til / code / katalog.

Deretter lager du filen bootstrap.sh og legg til dette skriptet til det:

sudo apt-get oppdatering sudo apt-get install -y apache2 # # Oppsettmoduler i apache som trengs. # sudo ln -s /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load sudo ln -s /etc/apache2/mods-available/rewrite.load / etc / apache2 / mods-enabled / rewrite.load # # Setup apache på port 8080 og konfigurere apache for å lese .htaccess-filene for # tilgangsendringer. # sudo cat /etc/apache2/sites-available/000-default.conf | sed / s / 80/8080 / g '> /var/tmp/sites.conf sudo mv /var/tmp/sites.conf /etc/apache2/sites-available/000-default.conf sudo cat / etc / apache2 / ports.conf | sed 's / 80/8080 / g'> /var/tmp/ports.conf sudo mv /var/tmp/ports.conf/etc/apache2/ports.conf sudo cat /etc/apache2/apache2.conf | sed 's / AllowOverride Ingen / AllowOverride All /'> /var/tmp/apache2.conf sudo mv /var/tmp/apache2.conf /etc/apache2/apache2.conf ## setup php5 # sudo apt-get install -y php5 # # Konfigurer serverens rotkatalog # sudo rm -rf / var / www / html sudo ln -fs / vagrant / var / www / html # # Oppdater apache # sudo service apache2 Oppdater

Dette skriptet lastes inn på Apache webserveren og konfigurerer det. Med Apache konfigurert, installerer den deretter PHP versjon 5, setter opp rotkatalogen for serveren, og starter Apache-tjenesten. Alt dette vil konfigurere den virtuelle maskinen etter behov for dette prosjektet og få rootkatalogen til serveren å få filer fra prosjektets katalog. Eventuelle endringer du gjør i prosjektkatalogen din, er umiddelbart tilgjengelige for serveren.

I prosjektkatalogen, opprett en fil med navnet .htaccess og plasser denne koden:

RewriteEngine On RewriteCond% REQUEST_FILENAME! -F RewriteCond% REQUEST_FILENAME! -D RewriteRule ^ index.php [QSA, L] # 1 ÅR  Header sett Cache-Control "max-age = 29030400, offentlig"  # 1 UKE  Overskrift set Cache-Control "max-age = 604800, offentlig"  # 2 DAGER  Overskrift sett Cache-Control "max-age = 172800, proxy-revalidate"  # 1 MINUTT  Topptekst Cache-Control "maksimal alder = 60, privat, proxy-revalidate" 

Dette forteller Apache-serveren hvordan man håndterer forespørsler for dette nettstedet og for automatisk caching av forespørsler. Index.php-filen får hver forespørsel til serveren.

Kjører serveren

For å starte serveren, kjør følgende kommando i prosjektkatalogen:

vagrant opp

Dette laster ned den virtuelle maskinen hvis den ikke allerede har på systemet ditt, kjører provisjonsskriptet og starter serveren. For å se nettstedet, åpne nettleseren din til http: // localhost: 8080.

 phpPress hovedside

Nettleseren skal vise ovenstående side. Serveren er nå online og klar for tilleggene dine.

Hvis nettstedet ikke er synlig, bør du sjekke tillatelsene for alle filene på nettstedet. OS X har ofte dem satt til å eie bare tilgjengelig. Du må gjøre dem verdenslesbare med følgende kommando i prosjektkatalogen:

chmod -R a + r .

Det vil sikre at Apache-serveren i den virtuelle maskinen kan lese filene.

For å stoppe serveren, kjør følgende kommando i prosjektkatalogen:

vagranthalt

For å lære mer om bruk av Vagrant, vennligst les Vagrant Documentation. Du kan også sjekke ut de mange Vagrant-opplæringene her på Envato Tuts +. Jeg brukte verktøyet Hobo for å lage min Vagrant-filer. Det er et flott verktøy for konfigurering, kjøring og styring av Vagrant-systemer på OS X.

Konklusjon

Nå som du vet hvordan du bygger en enkel, men likevel kraftig webserver med PHP-språket, er det på tide å eksperimentere. Opprett nye sider, innlegg, embeddable deler og kortkoder. Denne enkle plattformen er langt raskere enn å bruke WordPress, og det er helt i din kontroll. 

I motsetning til de andre webserverne i denne serien, kan dette PHP-baserte CMS kjøre på en hvilken som helst delt hosting-konto. Jeg bruker den til min departements nettside på DreamHost. Jeg har ikke optimalisert bildene noen, men det gjør det fortsatt ganske bra. Fortell meg om serveren din i kommentarene nedenfor.