Sağlam PHP hataları işlemek için içerir?

10 Cevap php

Ben çeşitli nedenlerle, diğer senaryo üzerinde include_once ile diğer PHP komut dosyalarını çalıştırmak için gereken, bir PHP uygulaması "index.php" var. Diğer komut böylece arayan durmayacaktır güvenli bir include_once yapmak için bir yol var, çok kararlı değil mi?

yani:

<?php

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

?>

(Ben dinlenme bu üretim-çevre şeyler değil emin, vb, kötü bir fikir bu ne olabilir biliyorum.)

10 Cevap

Bana sadece

@include "fileWithBadSyntax.php";

Benim hızlı testler, trigger_error () ile atılan iki ayrıştırma hataları veya hatalar için çalıştığı,.

EDIT: Bu tamamen yanlıştır. Biraz yararsızdır eğer, doğru SNEAK cevabı, bkz.

Bu yanıtların hiçbiri çalışacaktır. @ Diyor üst olarak bir, bir ayrıştırma hatası dahil dosyasında var ise), yine ilk komut sonlandırılacak (içerir.

Sen eval Yapamam () it, sen onu yakalamak / denemek ve dahil çağıran her yolu veya komut all yürütme sonlandırılacak talep edemez.

Bu soru AÇIK ve çözümsüz kalır.

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

Bu PHP bir hata olduğunu ve bu işlevi en azından 2006 yılından bu yana kayıptı. Onlar iddia, çünkü, "sahte" olarak sınıflandırılan hata içerir () ve () derleme zamanında gerçekleşmesi gerekir.

Eğer include () ve / veya RUNTIME () gerektiren veya include () çalışan bir dize içeren kod üzerinde bir eval () yapıyor dize argümanları üreten bu pencereden dışarı gidiyor.

Tek gerçek çözüm, en zarif bir düşünce değil ama çalışır PHP Parse gibi hata iletileri filtrelemek için bir ayrıştırma hatası ya da bir hata yok tespit mesaj verir eğer kontrol dışında başka bir şey için komut dosyası ayrıştırır ve yürütmek başka bir php Interpretor aramak için Hata blablabla. gibi bu kod yapar:

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

Bu fikir here geldi

Gillis TAKETHISAWAY dot'tadır php dot itibaren Comment nokta fi gillis

Sen bir try / catch bloğu yapabilirdi

<?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";
}
?>

Hiçbir hata varsa Şimdi, sadece dosyasını içerecektir. Bir hata varsa, bu sadece (tercihen bir günlük dosyası falan, yorum, gibi) bu şeyler atlamak ve özel yazacağım.

For more info: http://us2.php.net/manual/en/language.exceptions.php

Dahil-dosyası-bulunamadı için .... zarif çözüm

function safe_require( $incfile, $showfn=1 ) {
  $a = explode( ":", get_include_path() ) ;
  $a[] = "";
  $b = 0;
  foreach( $a as $p ) {
    if( !empty( $p )) $p .= "/";
    $f = $p.$incfile;
    if( file_exists( $f )) {
      $b = 1;
      break;
    }
  }
  if( !$b ) 
    exit( "Cannot proceed, required file " . 
          (($showfn) ? $incfile : "" ) . " is unavailable or server has timed out." 
        );
  require_once( "$f" );
}

Sizin mimarisi değiştirmek ve bir web hizmeti içine "badfile.php" çevirmek mümkün olurdu? Bunun yerine kod temeli içine doğrudan dahil, ağ üzerinden aramak ve çıkışını ayrıştırmak ya da içerir. Eğer (safe_mode kullanarak, ya da sınırlı ayrıcalıklara sahip ayrı bir web sunucu işlemi çalıştıran) gerektiği gibi sınırlı badfile.php bulunduğu ortamı varsa bu ayrıştırma hataları etrafında alacak, aynı zamanda potansiyel olarak zararlı kod önlemek olabilir.

PHP 5.3 + görmek için php.net:

Böyle hata bastırma kullanın:

<?php
@include "class.php";
function __autoload($myclass) {
    echo "Want to load $myclass.\n";
    throw new Exception("Unable to load $myclass.\n");
}
$obj = "Object is not loaded\n"; 

try {
    //this only works if included
    $obj = myclass::$obj;
} catch (Exception $e) {
    //this does not work
    echo $e->getMessage(), "\n";
}

echo $obj;
?>

Ya da yüklü olmayabilir class.php dosyası olarak bu ile.

<?php
    class myclass {
    static  $obj = 'Loaded object' ;
    }
?>

Sen hataları işlemek için aşağıdaki kodu kullanabilirsiniz.

if(!(@include($path))){

    echo 'file not found';
}

Badfile.php bunu bir değer döndürür yapabilir:

<?php
//inestable instructions.


return true; ?>

ardından ana dosya üzerinde yapabileceği:

 <?php

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

Burada bulmak mümkün oldum tek gerçek çözüm:

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

Yukarıdaki kod size-be-dahil dosyaları açılış ifadeleri çıkarmak, veya aşağıdaki yapmak zorunda anlamına geldiğini unutmayın:

eval("?>" . $fc)

Sorun gerektiren çağrı () veya () veya _once (dahil) herhangi bir noktada varyantları ve bunları herhangi bir hata eylemci de dahil olmak üzere, everything sonlandırmak için değil bekleyemezsiniz olmasıdır. PHP tamamen bir ayrıştırma hatası karşılaştığında her şeyi işleme duracaktır.

Bunun tek istisnası, eval içinde dizedir (). Sorun gerçekten bu yapamam, olsa,:

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

... () Gerektiğinden eval'd dize içinde still duracaktır. Sen, içeriği okumak zorunda söz dosya include () ya da daha fazla () gerektirmez dua ve eval () bunu.

Gerçek çözüm? PHP atlayın. :/