Question PHP robuste inclut pour gérer les erreurs?


J'ai une application PHP "index.php" qui, pour diverses raisons, doit exécuter d’autres scripts PHP en utilisant include_once sur cet autre script. Cet autre script n'est pas très stable, il y a donc un moyen de faire un coffre-fort include_once cela n'arrêtera pas l'appelant?

c'est à dire.:

<?php

safely_include_once('badfile.php'); // MAY throw syntax error, parse error, other badness
echo "I can continue execution after error";

?>

(Je sais quelle mauvaise idée cela peut être, etc., soyez assuré que ce n'est pas du matériel de production.)


14
2017-10-06 18:48


origine


Réponses:


Vous pouvez juste

@include "fileWithBadSyntax.php";

Qui, à partir de mes tests rapides, fonctionne à la fois pour les erreurs d'analyse ou les erreurs générées avec trigger_error ().

MODIFIER: C'est complètement faux. Voir la réponse de sneak, qui est correcte, si quelque peu inutile.


6
2017-10-06 18:53



Aucune de ces réponses ne fonctionnera. Le plus voté, qui dit à @include (), terminera toujours le premier script s'il y a une erreur d'analyse dans le fichier inclus.

Vous ne pouvez pas l'evaluer (), vous ne pouvez pas essayer / attraper, et tous les moyens d'appeler comprennent ou exigent se terminent tout exécution dans le script.

Cette question reste ouverte et non résolue.

http://bugs.php.net/bug.php?id=41810

Ceci est un bogue de PHP, et cette fonctionnalité est absente depuis au moins 2006. Ils ont classé le bogue comme "faux" parce que, selon eux, includes () et requires () se produisent à la compilation.

Cela sort de la fenêtre si vous générez les arguments de chaîne à include () et / ou require () à l'exécution, ou effectuez un eval () sur une chaîne contenant du code qui exécute un include ().


36
2017-07-02 10:43



La seule vraie solution, pensant que ce n’est pas le plus élégant mais qui fonctionne, c’est appeler un autre interpréteur php qui analyse et exécute le script pour rien sinon vérifier si elle génère une erreur d’analyse ou un message No errors detecté Erreur blablabla. comme ce code fait:

<?php
function ChkInc($file){
   return file_exists($file) && (substr(exec("php -l $file"), 0, 28) == "No syntax errors detected in");
}
?>

Cette idée est venue de Gillis'commentaire à include page de manuel de fonction à PHP doc.


10
2017-12-10 05:56



Serait-il possible de modifier votre architecture et de transformer "badfile.php" en un service Web? Au lieu de l'inclure directement dans votre base de code, vous l'appelleriez sur le réseau et analyseriez ou incluriez sa sortie. Cela vous évitera les erreurs d'analyse, vous pouvez également éviter le code potentiellement malveillant si l'environnement de badfile.php est limité de manière appropriée (en utilisant safe_mode ou en exécutant un processus de serveur Web distinct avec des privilèges limités).


2
2017-10-06 18:56



Vous pouvez faire un bloc try / catch

<?php
try {
    include("someFile.php");
} catch (Exception $e) {
    // Should probably write it to a log file, but... for brevity's sake:
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
?>

Maintenant, il n'inclura que le fichier s'il n'y a pas d'erreur. S'il y a une erreur, il suffit de sauter cette information et d'écrire l'exception (comme dans les commentaires, de préférence dans un fichier journal ou autre).

Pour plus d'informations: http://us2.php.net/manual/en/language.exceptions.php


2
2017-10-06 19:38



Solution de contournement gracieuse pour include-file-not-found ....

function safe_require ($ incfile, $ showfn = 1) {
  $ a = explose (":", get_include_path ());
  $ a [] = "";
  $ b = 0;
  foreach ($ a comme $ p) {
    if (! empty ($ p)) $ p. = "/";
    $ f = $ p. $ incfile;
    if (file_exists ($ f)) {
      $ b = 1;
      Pause;
    }
  }
  si (! $ b)
    exit ("Impossible de continuer, fichier requis".
          (($ showfn)? $ incfile: ""). "est indisponible ou le serveur a expiré."
        );
  require_once ("$ f");
}

2
2017-11-22 17:54



Dans badfile.php, vous pouvez lui faire retourner une valeur:

<?php
//inestable instructions.


return true; ?>

puis sur le fichier principal, vous pouvez faire:

 <?php

 if (require($badFile)) {
     //if it was true continue with normal execution
 } else {
     echo "Error: ". error_get_last();
 }

-1
2017-10-07 00:54



Voici la seule vraie solution que j'ai pu trouver:

function safe_include($fn) {
        $fc = file_get_contents($fn);
        if(!eval($fc)) {
                return 0;
        }
        return 1;
}

Notez que le code ci-dessus signifie que vous devez extraire les déclarations d'ouverture de vos fichiers à inclure ou procédez comme suit:

eval("?>" . $fc)

Le problème est que vous ne pouvez pas appeler require () ou include () ou leurs variantes _once () à tout moment et s'attendre à ce qu'ils ne se terminent pas tout, y compris les gestionnaires d'erreurs. PHP cessera complètement de tout traiter lorsqu'il rencontrera une erreur d'analyse.

La seule exception à cela est la chaîne à l'intérieur d'un eval (). Le problème est que vous ne pouvez pas vraiment faire ceci:

eval('require($fn);'); 

... parce que require () dans la chaîne eval'd sera encore Arrêtez. Vous devez lire le contenu, prier que le fichier en question n'inclue pas () ou require () plus loin, et eval () il

La vraie solution? Ignorer PHP. : /


-3
2017-07-04 20:24