[PHP] parse errors in include files afvangen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een basissysteem waarop kleine uitbreidingen gemaakt kunnen worden, door het plaatsen van eenvoudige php bestanden in een directory. Bij het uitvoeren van het script worden de bestanden uit die directory ge-include, en er is een stukje functionaliteit bij.

Probleem is dat 1 typo in een include file alles plat legt, terwijl dat niet de bedoeling is. Ik wil dat een include met een parse error een waarschuwing genereert, en dat de rest gewoon verder gaat. De functionaliteiten van de includes zijn namelijk ook weer niet onmisbaar.

Ik weet dat je via de commandline php een bestand op parse errors kan laten checken, kan dit ook vanuit php, zonder systeemcommando's uit te voeren? Helemaal mooi is ook nog in de waarschuwing de foutmelding tonen zoals php die normaal zou tonen.

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Als het commandline kan, dan is je probleem toch geen probleem,
Je kunt vanuit een script een commanline command uitvoeren.
PHP:
1
system('ls', $retval);


in $retval zit nu de inhoud van de huidige directory.

Misschien kan het ook vanuit het script zelf (weet ik niet), of met een errorhandler. ( set_error_handler('foo'); )

Je zou ook met file() kunnen werken en alleen de resultaten van de plugin (=uitvoer van het include script) in je mainscript op kunnen nemen, maar of dat kan is maar de vraag, dat kan alleen als het include script geen variabelen uit het main script moet krijgen.

[ Voor 3% gewijzigd door beetle71 op 07-08-2004 15:20 ]


Acties:
  • 0 Henk 'm!

  • Billie
  • Registratie: Januari 2003
  • Laatst online: 16-09 20:27
Op php.net/include staat toch echt het volgende:
The documentation below also applies to require(). The two constructs are identical in every way except how they handle failure. include() produces a Warning while require() results in a Fatal Error. In other words, use require() if you want a missing file to halt processing of the page. include() does not behave this way, the script will continue regardless. Be sure to have an appropriate include_path setting as well. Be warned that parse error in required file doesn't cause processing halting.
Of zit ik helemaal verkeerd? :X

Acties:
  • 0 Henk 'm!

  • igmar
  • Registratie: April 2000
  • Laatst online: 03-09 22:58

igmar

ISO20022

Billie schreef op 07 augustus 2004 @ 15:21:
Op php.net/include staat toch echt het volgende:
Of zit ik helemaal verkeerd? :X
Dat gaat over de include zelf, niet over code die geinclude wordt.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nou je zit niet helemaal fout, maar dat is afhankelijk van versie en instellingen. Uit de php5 changelist:
Fixed problem with parse error in include() file not stopping PHP's execution. (Ilia)

Ik ga er maar voor kiezen inderdaad het systeemcommando uit te voeren, dat kan ik namelijk ook gelijk de parse error in de waarschuwing krijgen, wat me anders niet gaat lukken volgensmij.

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Zou je als het gelukt is, voor de volledigheid van dit topic :) je oplossing kunnen tonen?

waarschijnlijk iets als:
PHP:
1
2
3
4
system('php -l /dir1/dir2/test.php', $retval);
if(strstr($retval[1],'No syntax errors')){
     include('/dir1/dir2/test.php');
}


Maar ik ben wel benieuwd of je het daarmee vertrouwd, en anders hoe je het registreerd, want het is een beetje performance killing elk script eerst te testen, en vervolgens uit te voeren. Zo'n test zou eenmalig moeten zijn, totdat de file weer gewijzigd is of zo.

[ Voor 72% gewijzigd door beetle71 op 07-08-2004 16:12 ]


Acties:
  • 0 Henk 'm!

Verwijderd

beetle71 schreef op 07 augustus 2004 @ 16:03:
Zou je als het gelukt is, voor de volledigheid van dit topic :) je oplossing kunnen tonen?

waarschijnlijk iets als:
PHP:
1
2
3
4
system('php -l /dir1/dir2/test.php', $retval);
if(strstr($retval[1],'No syntax errors')){
     include('/dir1/dir2/test.php');
}


Maar ik ben wel benieuwd of je het daarmee vertrouwd, en anders hoe je het registreerd, want het is een beetje performance killing elk script eerst te testen, en vervolgens uit te voeren. Zo'n test zou eenmalig moeten zijn, totdat de file weer gewijzigd is of zo.
dan vind ik zelf het gebruik van http://nl2.php.net/manual...ntax.php]php_check_syntax net iets netter, maarja.. dat werkt alleen met php5

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Verwijderd schreef op 07 augustus 2004 @ 16:39:
[...]

dan vind ik zelf het gebruik van http://nl2.php.net/manual...ntax.php]php_check_syntax net iets netter, maarja.. dat werkt alleen met php5
Tsja, :) :) dat vind ik ook netter, maar wat ik eigenlijk wil weten is of de TS elke keer dat hij een script wil includen het eerst gaat syntax checken. Dit lijkt me namelijk nogal overbodig en slecht voor de performance.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
beetle71 schreef op 07 augustus 2004 @ 18:42:
[...]
Tsja, :) :) dat vind ik ook netter, maar wat ik eigenlijk wil weten is of de TS elke keer dat hij een script wil includen het eerst gaat syntax checken. Dit lijkt me namelijk nogal overbodig en slecht voor de performance.
Als je modulair gaat werken e.d. is het vaak sowieso al handig om een soort van module-beheer te maken. Daar zou je deze controles kunnen doen. Maar: een syntax error komt toch nooit terecht op een productie-server/site? Als er een fout zit in een file zal je deze er toch al tijdens het ontwikkelen uithalen? Alleen denk-fouten e.d. zouden door je controle heen kunnen gaan omdat die veel moeilijker te herkennen zijn.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik had intussen al een oplossing gemaakt die bijna gelijk is aan het stukje code zoals hier boven staat, die vervolgens netjes de parse error toont wanneer nodig.

Wat betreft performance is het geen probleem, het is namelijk geen script voor een website maar een doorlopend proces. (inderdaad in php ja, en dat gaat perfect :) )

De oplossing die ik gemaakt heb werkt goed, maar ik ga nu de php_check_syntax functie gebruiken (precies wat ik zocht!) dat is toch wat netter dan 20 keer php laden voor het checken van een bestandje.

Normaal test je inderdaad eerst zodat de syntax errors er uit zijn. Maar als die er toch in komen (niet getest of hoe dan ook) wil ik dat het gewoon netjes afgehandeld wordt.
Pagina: 1