[PHP] Config file schijven met gebruik van template file

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik probeer uit te vogelen hoe ik het beste een config file kan wegschrijven op een server gebruikmakend van PHP en een template file waar {variabelen} in staan.

Dit blijkt lastiger dan gedacht.

Ik ben me aan het focussen op file_get_contents() omdat dit hier zeer geschikt voor zou zijn. Ik kom alleen vrijwel geen bruikbare voorbeelden tegen, ook niet op de site van PHP zelf.

Mijn inziens is een template veel makkelijker als je file_get_contents() gebruikt omdat je dan je code schoner houdt en aanpassingen makkelijker door te voeren zijn.

Ik heb uiteraard ook naar fopen(), fwrite(), fclose() gekeken, echter zie ik hier geen voordelen van in.

Ik zoek dus een duwtje in de rug om hier even wat beter mee op gang te komen :)

Acties:
  • 0 Henk 'm!

  • Speedener
  • Registratie: September 2000
  • Laatst online: 07:00
Wat ik doe bij het maken van configfiles is inderdaad een template file met variabelen (%VAR1%, %VAR2%) inlezen met file_get_contents(). Dan de variabelen replacen en dan (terug)schrijven met fopen, fwrite, fclose.

Let alleen even op de rechten en eigenaar die het bestand dan krijgt.

LG Therma V Split WP: HU143MA.U33-HN1636M NK5


Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
gebruik file_get_contents in combinatie met sprintf of str_replace

dit is behoorlijk simpel te realiseren dus ga het je niet helemaal vertellen wat je moet doen ;)

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Ik zou het gewoon regel voor regel verwerken icm een standaard str_replace.

Hoe ziet je config file eruit? Is het enkel een kwestie van commentaar regels die beginnen met een # en verder regels met label = waarde waarbij waarde vervangen moet worden, of zitten ze ingewikkelder in elkaar?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Kettrick
  • Registratie: Augustus 2000
  • Laatst online: 04:24

Kettrick

Rantmeister!

Als je helemaal vrij bent in het opbouwen, kan je ook gebruik maken van

http://www.php.net/parse_ini_file

Zonder verdere info is het moeilijk te zeggen of dit geschikt is in jouw geval, maar het doet volgens mij precies wat je wil :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben hier weer mee aan de gang gegaan omdat het me toch redelijk boeit.

Ik ben ook aan het uitzoeken hoe webmin dit doet bijvoorbeeld aangezien je daar gewoon een optie uit kunt zetten. Ik vraag mij dus af of het "write script" dat eigenlijk perl based is uit gaat van alle opties en met if() statements bepaalt of het erin moet ja of de nee.

Alleen met rewrites heb je een probleem of je moet dit loopen totdat ze op zijn en dan verder gaan met de rest ?

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 19:24

Patriot

Fulltime #whatpulsert

Het is een beetje hoe je het wilt. Je kunt ook de bovenstaande parse_ini_file functie gebruiken in de configuratiebestanden. Dan hoef je alleen config.ini te wijzigen, en zou config.php die gewoon op moeten pakken. Dat is de makkelijkste (en snelste, maar bij dit soort dingen verwaarloosbaar sneller) oplossing.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Je kunt inderdaad met parse_ini_file met arrays werken, dit kan erg handig zijn. Ik wil wat zaken in een database opslaan en dan dynamisch de config files aan kunnen passen.

Ik moet even kijken wat en hoe ik alles in mijn DB op ga slaan, zal wel een database van redelijk formaat worden als je naar alle apache opties kijkt welke je zou willen gebruiken.

Pear heeft ook een dergelijke optie welke goed moet werken, ik denk alles aan de PHP kant houden is makkelijker :)

Acties:
  • 0 Henk 'm!

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Het Zend Framework biedt ook wel leuke functies voor configuratie files:
Zend_Config en Zend_Config_Writer

Wat daar vooral handig aan is, is dat je secties kunt laten overerven. bijvoorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
; Production site configuration data
[production]
database.adapter            = pdo_pgsql
database.params.host        = www.bla.nl
database.params.username    = naampje
database.params.password    = geheim
database.params.dbname      = projectje

; Development site configuration data inherits from production and
; overrides values as necessary
[development : production]
database.params.host        = localhost
database.params.username    = andernaampje
database.params.password    = anderwachtwoord


Ook kun je verschillende configuraties mergen, misschien dat je daar nog wat aan hebt, als je bijvoorbeeld eerst een template config inleest, en daarna een site specifieke config.
If you have two Zend_Config objects, you can merge them into a single object using the merge() function. For example, given $config and $localConfig, you can merge data from $localConfig to $config using $config->merge($localConfig);. The items in $localConfig will override any items with the same name in $config.

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


Verwijderd

Topicstarter
Zend wil ik helaas niet gebruiken, wellicht later eens voor een projectje wat ik bedenk.

Ik vraag me alleen af waarom ik parse_ini_file zou gebruiken ?

Ik haal in dat geval alle instellingen uit een ini file en maak daar een array van. Die array uit een database is niet zo lastig, het probleem is dit goed in een template file te zetten waar je een sectie hebt voor bijvoorbeeld redirects maar je nooit weet hoeveel je er in je array hebt staan...

Dat is eigenlijk mijn mainissue.

  • Patriot
  • Registratie: December 2004
  • Laatst online: 19:24

Patriot

Fulltime #whatpulsert

Je kunt wel een database gebruiken, maar daar heb je over het algemeen weer configuratie voor nodig. Een tool die een .ini bestand wegschrijft is een stuk simpeler, en bovendien werkt hij dan ook op systemen waar überhaupt geen database aanwezig is.

Naar mijn idee krijg je de volgende constructie:

1) configtool.php die een config.ini wegschrijft
2) config.php die met parse_ini_file config.ini inlaadt

Verwijderd

Topicstarter
Die constructie kom je inderdaad op uit, maar het uigangspunt is dat ik juist mijn info uit een database haal omdat dit voor mij makkelijker te managen valt.

  • Marientjuh
  • Registratie: Oktober 2004
  • Laatst online: 21-09 16:59

Marientjuh

Fullstack developer

Waar wil je dan je database gegevens vandaan halen?

Respect begint waar eigen kunnen ophoudt! - Kinderkleding webshop van vrouwlief: coz-adore.nl


Verwijderd

Topicstarter
Marientjuh schreef op donderdag 18 december 2008 @ 14:42:
Waar wil je dan je database gegevens vandaan halen?
Uit een MySQL database waar ik ze uiteraard via een script eerst in zet.

Ik kan hier verschillende kanten mee op hoe ik de config in de database zet, het euvel is alleen hoe krijg ik bijvoorbeeld meerdere redirects goed onder elkaar in een config file weggeschreven.

Ik wil voor iedere configoptie een record maken, dit kan ik wel met ID's en dergelijke aan elkaar relateren, echter ik heb oplossingen gezien waar de gehele vhost config in een MySQL record staat, alleen dan maak je de config file dus in princiepe vooraf, ik doe het achteraf... ik moet even kijken wat de minste load op een systeem doet.

Mijn voorkeur gaat uit iedere config optie een DB record en dit dan via een template-file met wat loops voor zaken waar meerdere regels voor zijn naar een configfile schrijven.

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 19:24

Patriot

Fulltime #whatpulsert

Verwijderd schreef op donderdag 18 december 2008 @ 17:59:
[...]


Uit een MySQL database waar ik ze uiteraard via een script eerst in zet.

Ik kan hier verschillende kanten mee op hoe ik de config in de database zet, het euvel is alleen hoe krijg ik bijvoorbeeld meerdere redirects goed onder elkaar in een config file weggeschreven.

Ik wil voor iedere configoptie een record maken, dit kan ik wel met ID's en dergelijke aan elkaar relateren, echter ik heb oplossingen gezien waar de gehele vhost config in een MySQL record staat, alleen dan maak je de config file dus in princiepe vooraf, ik doe het achteraf... ik moet even kijken wat de minste load op een systeem doet.

Mijn voorkeur gaat uit iedere config optie een DB record en dit dan via een template-file met wat loops voor zaken waar meerdere regels voor zijn naar een configfile schrijven.
Dat is zijn vraag niet. Zijn punt is: Hoe ga je via de config file inloggen op de database als de logingegevens van die database in de configdatabase zelf staan. Dat werkt natuurlijk niet.

Waar je het nu over hebt zijn overigens meteen heel andere dingen. Jij wilt meteen PHP.ini, httpd.conf (of .htaccess bestanden) gaan wijzigen met je tool. Dat is alweer van een andere orde dan een simpel configuratiebestandje maken.

Dat euvel van je volg ik overigens niet. Wat bedoel je met redirects, en waarom is 10 achter elkaar moeilijker dan slechts één zo'n ding?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Patriot schreef op vrijdag 19 december 2008 @ 12:27:
[...]


Dat is zijn vraag niet. Zijn punt is: Hoe ga je via de config file inloggen op de database als de logingegevens van die database in de configdatabase zelf staan. Dat werkt natuurlijk niet.

Waar je het nu over hebt zijn overigens meteen heel andere dingen. Jij wilt meteen PHP.ini, httpd.conf (of .htaccess bestanden) gaan wijzigen met je tool. Dat is alweer van een andere orde dan een simpel configuratiebestandje maken.

Dat euvel van je volg ik overigens niet. Wat bedoel je met redirects, en waarom is 10 achter elkaar moeilijker dan slechts één zo'n ding?
Ik denk dat je mijn vraag zelf niet helemaal begrijpt.

Ik wil gewoon een apache config schrijven uit een MySQL database via een bashscript dat door PHP aangestuurd wordt. Dit heeft opzich weinig met inloggen te maken aangezien een frontend los staat van een backend, we hebben het hier over de backend.

Een dergelijke config file zal je waarschijnlijk per regel opbouwen. Het probleem waar je tegenaan loopt is dat als je de redirects (bijvoorbeeld 10 stuks) hebt gehad dat je de volgende items zal moeten gaan schrijven, dit kan dus ook een </directory> or whatever zijn... dat moet je dus detecteren in je script, de vraag is op PHP of op bash niveau.

Dat je met een loop zal moeten werken is logisch natuurlijk.

Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 22:02
Denk je niet veel te moeilijk? Stel je VirtualHost template ziet er ongeveer zo uit:
code:
1
2
3
4
5
6
7
<VirtualHost *>
  ServerName www.example.com
  DocumentRoot /var/www/example.com/web

  [%REDIRECTS%]

</VirtualHost>


Deze file lees je in, met php, regel voor regel, en schrijf je regel voor regel weg naar de juiste configuratiefile. Als je in dit bestand een bepaalde tag tegenkomt (in bovenstaand voorbeeld dus [%REDIRECTS%]) dan vraag je uit de database het lijstje met 0 of meer redirects op. Voor elk resultaatrij uit de database schrijf je dan een regel weg naar de doelfile, waarbij je ervoor zorgt dat de speciale tag [%REDIRECTS%] nooit in de apache config kan komen (want dit levert een niet-startende apache server op). Bovenstaande template kan dan resulteren in:

code:
1
2
3
4
5
6
7
8
<VirtualHost *>
  ServerName www.example.com
  DocumentRoot /var/www/example.com/web

  Redirect /test   http://test.example.com/
  Redirect /google http://www.google.com/

</VirtualHost>

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@ naamgenoot ;)

Precies wat ik bedoel ! Ik denk wellicht wat moeilijk om juist op een zo simpel mogelijke oplossing te komen, dat lukt op deze manier zo te zien best wel.

Met een loop valt iets als [%redirects%] best te vullen, dit kan ik vast wel ergens opsnorren.

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 19:24

Patriot

Fulltime #whatpulsert

Ik ben een weekje op vakantie geweest, maar wilde toch nog even reageren.
Verwijderd schreef op zaterdag 20 december 2008 @ 22:22:
[...]


Ik denk dat je mijn vraag zelf niet helemaal begrijpt.
Dat denk ik ook ja :)
Ik wil gewoon een apache config schrijven uit een MySQL database via een bashscript dat door PHP aangestuurd wordt. Dit heeft opzich weinig met inloggen te maken aangezien een frontend los staat van een backend, we hebben het hier over de backend.
Dat het alleen om de apache config ging was mij niet geheel duidelijk, ik dacht dat het over configuratie in het algemeen ging. Mijn punt wat betreft het inloggen hing daar ook een beetje op, dus daar maak ik geen woorden meer aan vuil.
Een dergelijke config file zal je waarschijnlijk per regel opbouwen. Het probleem waar je tegenaan loopt is dat als je de redirects (bijvoorbeeld 10 stuks) hebt gehad dat je de volgende items zal moeten gaan schrijven, dit kan dus ook een </directory> or whatever zijn... dat moet je dus detecteren in je script, de vraag is op PHP of op bash niveau.

Dat je met een loop zal moeten werken is logisch natuurlijk.
Je bedoelt dus dat er verschillende soorten onderdelen zijn binnen zo'n configuratie files (als voorbeeld neem ik <Directory>'s, Aliases, Redirects), en jij wilt weten wanneer en waar je die moet plaatsen?

Dat lijkt me de kern van je probleem, ook gezien de reacties hierboven. Dat is namelijk best makkelijk op te lossen (je naamgenoot kwam met de oplossing wat dat betreft), ik zag gewoon een ander probleem dan jij ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Patriot schreef op dinsdag 30 december 2008 @ 20:54:

Je bedoelt dus dat er verschillende soorten onderdelen zijn binnen zo'n configuratie files (als voorbeeld neem ik <Directory>'s, Aliases, Redirects), en jij wilt weten wanneer en waar je die moet plaatsen?

Dat lijkt me de kern van je probleem, ook gezien de reacties hierboven. Dat is namelijk best makkelijk op te lossen (je naamgenoot kwam met de oplossing wat dat betreft), ik zag gewoon een ander probleem dan jij ;)
Ja, miscommunicatie kan gebeuren toch, je was aan vakantie toe ;)

Ik bedoel inderdaad exact wat je zegt. Mijn naamgenoot heeft zeker de juiste oplossing, echter moet ik nog even kijken hoe dit te gebruiken aangezien ik er niet 1,2,3 uit kwam tijdens het zoeken naar voorbeelden met placeholders (tenminste, dat zouden het moeten zijn).
Pagina: 1