PHP'de file_get_contents () işlevi uyarısını nasıl işleyebilirim?


312

Ben böyle bir PHP kodu yazdım

$site="http://www.google.com";
$content = file_get_content($site);
echo $content;

Ancak "http: //" dizinini kaldırdığımda $siteşu uyarıyı alıyorum:

Uyarı: file_get_contents (www.google.com) [function.file-get-content]: akış açılamadı:

Denedim tryve catchancak işe yaramadı.


2
Ayrıca ilginç bir yaklaşım: stackoverflow.com/questions/6718598/…
Hugo Stieglitz


Burada belirtildiği gibi set_error_handler-fonksiyonu ile try-catch kullanın stackoverflow.com/a/3406181/1046909
MingalevME

2
Http: // adresini url'den kaldırırsanız, yerel diskinizde bir "www.google.com" dosyası arıyorsunuz.
Rauli Rajande

Bu nasıl bu kadar ilgi ve upvotes alabilir. Protokol bilgilerini neden kaldırdınız? 2008'de bile FTP ve HTTPS'niz vardı.
Daniel W.

Yanıtlar:


507

1.Adım: Dönüş kodunu kontrol edin: if($content === FALSE) { // handle error here... }

2.Adım: file_get_contents () çağrısının önüne bir hata kontrol operatörü (ie @) koyarak uyarıyı bastırın : $content = @file_get_contents($site);


86
Sıkı karşılaştırma kullanmayı unutmayın: eğer ($ content === FALSE) .Dosya "0" içeriyorsa, yanlış negatif tetikler.
Aram Kocharyan

7
Merhaba, bu benim için işe yaramadı, @ ekleyerek hala E_WARNING bazı global (benim değil) hata işleyicisi tarafından yakalanmasına neden olur ve komut dosyası, dönüş değerini işlemek için bir şansı olmadan önce ölür. Herhangi bir fikir? tnx.
Sagi Mann

1
Yan etki algılandı: dosya yoksa, komut dosyası @dosya_get_içerik satırında durur.
Dax

Doğru çözüm olmak üzereyken bu benim için işe yaramıyor. Hiçbir veri alınan bir zaman aşımı uyarısı var, ancak $ content === FALSE "tetiklenir" ($ site bir localhost sunucusundan çağrılıyor, url bir tarayıcıya kendimi yapıştırırsanız hızlı bir şekilde veri var unutmayın).
Oliver

4
Cevap çok eski olmasına rağmen, yanıtınıza kullanmanın @performansı olumsuz etkileyebileceğine dair bir not eklemenizi öneririz . Bu yanıtı , oldukça iyi açıklayan ilgili bir gönderide görün .
Fr0zenFyr

148

Hata işleyicinizi İstisna çağıran anonim bir işlev olarak da ayarlayabilir ve bu istisnada bir dene / yakala kullanabilirsiniz.

set_error_handler(
    function ($severity, $message, $file, $line) {
        throw new ErrorException($message, $severity, $severity, $file, $line);
    }
);

try {
    file_get_contents('www.google.com');
}
catch (Exception $e) {
    echo $e->getMessage();
}

restore_error_handler();

Küçük bir hatayı yakalamak için çok fazla kod gibi görünüyor, ancak uygulamanızda istisnalar kullanıyorsanız, bunu yalnızca bir kez, en üstte (örneğin, dahil edilen bir yapılandırma dosyasında) yapmanız gerekir ve tüm hatalarınızı tümüyle İstisnalara dönüştürün.


Şimdiye kadar gördüğüm en büyük PHP geliştirmelerinden biri. Thank you enobrev
Tomasz Smykowski

@enobrev, Neden hem hata numarası hem de önem derecesi için aynı değeri veriyorsunuz?
Pacerier

Set_error_handler bir hata numarası değişkeni (maalesef) sunmadığından, $ exception-> getCode () işlevinde faydalı bir şey sunmanın bir nedeni yoktur.
enobrev

1
@enobrev İstisna atmadan önce anonim fonksiyon içindeki hata işleyicisini geri yüklemeyi unutmayın. İstisna ele alınabilir ve bu durumda işleyici hala beklenmedik olarak gelebilecek ve istisna işlemede başka bir hata olduğunda garip, hata ayıklaması zor davranışları ortaya çıkarabilecek bu istisnayı atmaya ayarlıdır.
Josef Sábl

1
Nihayet bloğa restore_error_handler () çağrısı dahil
etmenizi

67

Bunu yapmanın en sevdiğim yolu oldukça basit:

if (!$data = file_get_contents("http://www.google.com")) {
      $error = error_get_last();
      echo "HTTP request failed. Error was: " . $error['message'];
} else {
      echo "Everything went better than expected";
}

Ben try/catchyukarıdaki @enobrev denedikten sonra buldum , ama bu daha az uzun (ve IMO, daha okunabilir) kod sağlar. Biz sadece error_get_lastson hatanın metnini almak için kullanırız ve hata file_get_contentsdurumunda yanlış döndürür, böylece basit bir "if" bunu yakalayabilir.


2
Bu, bu sorun için en kolay ve en iyi çözümdür! Belki @file_get_contentsde tarayıcıya bildirilen hataların bastırılmasını sağlayın.
EDP

1
Tüm cevaplar arasında bunun tek mantıklı olduğunu itiraf ediyorum - eğer @file_get_contentsuyarıyı bastırmak ve sonuç değerini kullanarak test etmek için kullanacak olursak === FALSE.
kostix

11
Bu, bir gövdeyi döndürmeyen veya yanlış olarak değerlendirilen başarılı isteklerin hatalarını tetikler. Olmalıif (false !== ($data = file_get_contents ()))
GordonM

Belgeler bunu netleştirmiyor, ancak @ kullanmak error_get_lastdeneyimimde hiçbir şeyin geri dönmemesine neden olabilir
Glenn Schmidt

33

Başına bir @ ekleyebilirsiniz: $content = @file_get_contents($site);

Bu, herhangi bir uyarıyı bastırır - idareli kullanın! . Bkz. Hata Kontrol Operatörleri

Düzenleme: 'http: //' dosyasını kaldırdığınızda artık bir web sayfası aramıyorsunuz, ancak diskinizde "www.google ....." adlı bir dosya arıyorsunuz


Bu gerçekten işe yarayan tek şey - "akışı açamadı" iletisini başka bir şekilde bastıramadım.
Olaf

21

Bir alternatif, hatayı bastırmak ve daha sonra yakalayabileceğiniz bir istisna atmaktır. Bu, özellikle kodunuzda file_get_contents () için birden fazla çağrı varsa yararlıdır, çünkü bunların tümünü elle bastırmanız ve işlemeniz gerekmez. Bunun yerine, tek bir try / catch bloğunda bu işleve birkaç çağrı yapılabilir.

// Returns the contents of a file
function file_contents($path) {
    $str = @file_get_contents($path);
    if ($str === FALSE) {
        throw new Exception("Cannot access '$path' to read contents.");
    } else {
        return $str;
    }
}

// Example
try {
    file_contents("a");
    file_contents("b");
    file_contents("c");
} catch (Exception $e) {
    // Deal with it.
    echo "Error: " , $e->getMessage();
}

15

İşte böyle yaptım ... Try-catch bloğuna gerek yok ... En iyi çözüm her zaman en basit olanıdır ... Keyfini çıkarın!

$content = @file_get_contents("http://www.google.com");
if (strpos($http_response_header[0], "200")) { 
   echo "SUCCESS";
} else { 
   echo "FAILED";
} 

4
-1: 404 hatası veya başka bir şey alırsanız çalışır, ancak sunucuya hiç bağlanamıyorsanız (örneğin yanlış etki alanı adı) işe yaramaz. $http_response_headerHiçbir HTTP yanıtı alınmadığından, bu durumda güncelleştirilmedi düşünüyorum .
Nathan Reed

1
@NathanReed'in dediği gibi, $ içerik yanlış olmadığını kontrol etmelisiniz (===), çünkü istek hiç bağlantı kuramazsa bu geri dönüş alır
Seb

15
function custom_file_get_contents($url) {
    return file_get_contents(
        $url,
        false,
        stream_context_create(
            array(
                'http' => array(
                    'ignore_errors' => true
                )
            )
        )
    );
}

$content=FALSE;

if($content=custom_file_get_contents($url)) {
    //play with the result
} else {
    //handle the error
}

Bu işe yaramıyor. Eğer $url404 bulunmazsa, uyarı hala görünecektir.
Raptor

Doğru Raptor, ben stream_context_create () ile cevap geliştirdik; Daha iyi bir şey yok ... "@" önerilmez
RafaSashi

1
ignore_errorsHTTP bağlamına HTTP yanıt durumu kodlarını> = 400 hata olarak yorumlamamasını bildirir . Marjinal olarak ilişkili olsa da, PHP hata işleme sorusuna cevap vermez.
Paz

ignore_errorsSeçenek için teşekkürler ! İhtiyacım olan bu!
Modder

6

İşte nasıl ele alacağım:

$this->response_body = @file_get_contents($this->url, false, $context);
if ($this->response_body === false) {
    $error = error_get_last();
    $error = explode(': ', $error['message']);
    $error = trim($error[2]) . PHP_EOL;
    fprintf(STDERR, 'Error: '. $error);
    die();
}

4

En iyi şey, bir dosyaya giriş yapmak veya kritik olanları e-postayla göndermek gibi yararlı bir şey yapacak kendi hata ve istisna işleyicilerinizi ayarlamak olacaktır. http://www.php.net/set_error_handler


1

Bu komut dosyasını kullanabilirsiniz

$url = @file_get_contents("http://www.itreb.info");
if ($url) {
    // if url is true execute this 
    echo $url;
} else {
    // if not exceute this 
    echo "connection error";
}

Bunun sıkı bir karşılaştırmaya ihtiyacı vardır: if ($url === true)...çünkü bir yanıt olarak 0veya boş kalırsanız , bağlantı hatası ortaya çıkar.
Daniel W.

1

PHP 4 error_reporting () kullandığından :

$site="http://www.google.com";
$old_error_reporting = error_reporting(E_ALL ^ E_WARNING);
$content = file_get_content($site);
error_reporting($old_error_reporting);
if ($content === FALSE) {
    echo "Error getting '$site'";
} else {
    echo $content;
}

1

Bunu yapmanın en basit yolu dosya_get_içeriklerinden önce bir @ başına gelmektir, i. e .:

$content = @file_get_contents($site); 

1

böyle bir şey:

public function get($curl,$options){
    $context = stream_context_create($options);
    $file = @file_get_contents($curl, false, $context);
    $str1=$str2=$status=null;
    sscanf($http_response_header[0] ,'%s %d %s', $str1,$status, $str2);
    if($status==200)
        return $file        
    else 
        throw new \Exception($http_response_header[0]);
}

1
if (!file_get_contents($data)) {
  exit('<h1>ERROR MESSAGE</h1>');
} else {
      return file_get_contents($data);
}

-2

File_get_contents () öğesini kullanmadan önce file_exists () işlevini kullanmalısınız. Bu şekilde php uyarısını önleyeceksiniz.

$file = "path/to/file";

if(file_exists($file)){
  $content = file_get_contents($file);
}

Bu, yalnızca yerel bir dosyayı çağırırsanız ve varsa yerel dosyayı denetlemek için doğru izinlere
sahipseniz çalışır

-3

Php.ini dosyasını değiştirin

allow_url_fopen = On

allow_url_include = On

Bunu yapma. Özellikle url içerir izin vermeyin. Bana inanma. # C99 çok iyi bir nedenden dolayı varsayılan olarak devre dışı bırakılmıştır.
Daniel W.

-3

Bu, verileri almayı deneyecek, eğer işe yaramazsa, hatayı yakalayacak ve yakalama içinde ihtiyacınız olan her şeyi yapmanıza izin verecektir.

try {
    $content = file_get_contents($site);
} catch(\Exception $e) {
    return 'The file was not found';
}

-3
try {
   $site="http://www.google.com";
   $content = file_get_content($site);
   echo $content;
} catch (ErrorException $e) {
    // fix the url

}

set_error_handler(function ($errorNumber, $errorText, $errorFile,$errorLine ) 
{
    throw new ErrorException($errorText, 0, $errorNumber, $errorFile, $errorLine);
});

file_get_content her zaman bir istisna oluşturmaz
marlar

Cevabınızı düzenlemek ve file_get_content'in ne zaman istisnalar attığını bize bildirmek ister misiniz?
Ravinder Payal

1
Bu kod soruyu cevaplayabilirken, bu kodun soruyu neden ve / veya nasıl cevapladığı konusunda ek bağlam sağlamak uzun vadeli değerini arttırır.
Jay Blanchard

-3

Ayrıca

allow_url_use = On 

Gözlerinde farklı php.iniuyarıları almayı durdurmak için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.