मैं PHP में file_get_contents () फ़ंक्शन की चेतावनी कैसे संभाल सकता हूं?


312

मैंने इस तरह से एक PHP कोड लिखा

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

लेकिन जब मैं "http: //" निकालता हूं तो मुझे $siteनिम्नलिखित चेतावनी मिलती है:

चेतावनी: file_get_contents (www.google.com) [function.file-get-content]: स्ट्रीम खोलने में विफल:

मैंने कोशिश की tryऔर catchकाम नहीं किया।


2
इसके अलावा एक दिलचस्प दृष्टिकोण: stackoverflow.com/questions/6718598/…
ह्यूगो स्टीलगिट्ज

संबंधित: stackoverflow.com/q/2002610
Fr0zenFyr


2
यदि आप url से http: // हटाते हैं, तो आप अपने स्थानीय डिस्क पर "www.google.com" फ़ाइल की तलाश कर रहे हैं।
राउली राजन्डे

यह इतना ध्यान और उत्थान कैसे प्राप्त कर सकता है। आप प्रोटोकॉल जानकारी क्यों निकालेंगे 2008 में भी, आपके पास FTP और HTTPS था।
डैनियल डब्ल्यू।

जवाबों:


507

चरण 1: रिटर्न कोड की जाँच करें: if($content === FALSE) { // handle error here... }

चरण 2: फ़ाइल के@ लिए file_get_contents () के सामने एक त्रुटि नियंत्रण ऑपरेटर (यानी ) डालकर चेतावनी को दबाएं : $content = @file_get_contents($site);


86
सख्त तुलना का उपयोग करने के लिए याद रखें: यदि ($ सामग्री === FALSE)। यदि फ़ाइल में "0" है, तो यह गलत नकारात्मक ट्रिगर करेगा।
अराम कोचरन

7
नमस्ते, यह मेरे लिए काम नहीं किया, @ जोड़ने के कारण अभी भी E_WARNING को कुछ वैश्विक (मेरा नहीं) त्रुटि हैंडलर द्वारा पकड़ा जा सकता है, और रिटर्न स्क्रिप्ट को संभालने का मौका देने से पहले मेरी स्क्रिप्ट मर जाती है। कोई विचार? tnx।
सागी मान

1
साइड इफेक्ट का पता चला: यदि फ़ाइल मौजूद नहीं है, तो स्क्रिप्ट @file_get_contents लाइन पर बंद हो जाती है।
डेक्स

यह मेरे लिए काम नहीं करता है, भले ही यह सही समाधान हो। मेरे पास कोई डेटा प्राप्त न होने के साथ एक टाइमआउट चेतावनी है, लेकिन $ सामग्री === FALSE "ट्रिगर" नहीं है (स्थानीय साइट से एक साइट को कॉल किया जा रहा है, ध्यान दें कि मेरे पास जल्दी से डेटा है यदि मैं खुद को एक ब्राउज़र में यूआरएल पेस्ट करता हूं)।
ओलिवर

4
हालाँकि इसका उत्तर बहुत पुराना है, फिर भी मैं आपके उत्तर में एक नोट जोड़ने का सुझाव देता हूँ कि @प्रदर्शन को नकारात्मक रूप से प्रभावित कर सकता है। एक संबंधित पोस्ट पर यह उत्तर देखें जो काफी अच्छी तरह से समझाता है।
Fr0zenFyr

148

आप अपनी त्रुटि हैंडलर को एक अनाम फ़ंक्शन के रूप में भी सेट कर सकते हैं जो अपवाद को कॉल करता है और उस अपवाद पर एक कोशिश / पकड़ का उपयोग करता है।

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();

एक छोटी सी त्रुटि को पकड़ने के लिए बहुत सारे कोड की तरह लगता है, लेकिन यदि आप अपने पूरे ऐप में अपवादों का उपयोग कर रहे हैं, तो आपको केवल एक बार ऐसा करना होगा, शीर्ष पर (उदाहरण के लिए एक कॉन्फ़िगर फ़ाइल में), और यह होगा अपनी सभी त्रुटियों को अपवाद में बदलें।


यह अब तक मैंने देखे गए सबसे बड़े PHP सुधारों में से एक है। शुक्रिया enobrev
टॉमाज़ स्म्यकोव्स्की

@enobrev, आप त्रुटि संख्या और गंभीरता दोनों के लिए समान मूल्य क्यों रखते हैं?
पचेरियर

$ अपवाद-> getCode () में कुछ उपयोगी प्रदान करने के साधनों के अलावा कोई विशेष कारण नहीं है, क्योंकि set_error_handler एक त्रुटि संख्या चर (दुर्भाग्य से) प्रदान नहीं करता है।
enobrev

1
@enobrev अपवाद फेंकने से पहले अनाम फ़ंक्शन के अंदर त्रुटि हैंडलर को पुनर्स्थापित करना न भूलें। अपवाद को संभाला जा सकता है और उस मामले में हैंडलर अभी भी इस विशेष अपवाद को फेंकने के लिए तैयार है, जो अप्रत्याशित रूप से आ सकता है और अजीब से परिचय कर सकता है, हार्ड को डीबग करना, अपवाद हैंडलिंग में एक और त्रुटि होने पर व्यवहार।
जोसेफ सेबल


67

ऐसा करने का मेरा पसंदीदा तरीका काफी सरल है:

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

मैंने इसे try/catch@enobrev से ऊपर प्रयोग करने के बाद पाया , लेकिन यह कम लंबाई (और IMO, अधिक पठनीय) कोड के लिए अनुमति देता है। हम केवल error_get_lastअंतिम त्रुटि के पाठ को प्राप्त करने के लिए उपयोग करते हैं, और file_get_contentsविफलता पर झूठे होते हैं, इसलिए एक सरल "यदि" उसे पकड़ सकता है।


2
यह इस समस्या का सबसे आसान और सबसे अच्छा समाधान है! हो सकता है कि यह @file_get_contentsब्राउजर को रिपोर्ट करने में त्रुटि को दबाए।
EDP

1
मैं मानता हूं कि सभी उत्तरों के बीच यह एकमात्र समझदार है - अगर हम इसे @file_get_contentsचेतावनी को दबाने और परिणाम मान का उपयोग करने का परीक्षण करने के लिए उपयोग करने के लिए बढ़ाएँगे === FALSE
कोस्टिक्स

11
यह सफल अनुरोधों के लिए त्रुटियों को ट्रिगर करेगा जो एक शरीर को वापस नहीं करते हैं, या एक को वापस करते हैं जो गलत का मूल्यांकन करता है। होना चाहिएif (false !== ($data = file_get_contents ()))
गॉर्डन

प्रलेखन स्पष्ट नहीं करता है, लेकिन @ का उपयोग error_get_lastकरने से मेरे अनुभव में कुछ भी नहीं लौट सकता है
ग्लेन श्मिट

33

आप एक पूर्व निर्धारित कर सकते हैं: $content = @file_get_contents($site);

यह किसी भी चेतावनी को दबा देगा - संयम से उपयोग करें! त्रुटि नियंत्रण ऑपरेटर देखें

संपादित करें: जब आप 'http: //' को हटाते हैं, तो आप अब एक वेब पेज की तलाश नहीं कर रहे हैं, लेकिन आपकी डिस्क पर एक फ़ाइल जिसे "Tgoogle" कहा जाता है ...


केवल यही एक चीज है जो वास्तव में काम करती है - मैं किसी अन्य तरीके से "स्ट्रीम खोलने में विफल" संदेश को दबा नहीं सका।
ओलाफ

21

एक विकल्प यह है कि त्रुटि को दबाएं और एक अपवाद भी फेंक दें जिसे आप बाद में पकड़ सकते हैं। यह विशेष रूप से उपयोगी है यदि आपके कोड में file_get_contents () के लिए कई कॉल हैं, क्योंकि आपको उन सभी को मैन्युअल रूप से दबाने और संभालने की आवश्यकता नहीं है। इसके बजाय, इस फ़ंक्शन को एक ही कोशिश / कैच ब्लॉक में कई कॉल किए जा सकते हैं।

// 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

यहाँ बताया गया है कि मैंने यह कैसे किया ... ट्राइ-कैच ब्लॉक की कोई आवश्यकता नहीं ... सबसे अच्छा समाधान हमेशा सबसे सरल होता है ... आनंद लें!

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

4
-1: यह काम करता है यदि आपको 404 त्रुटि या कुछ और मिलता है, लेकिन यदि आप सर्वर से कनेक्ट करने में विफल होते हैं (उदाहरण के लिए गलत डोमेन नाम)। मुझे लगता $http_response_headerहै कि उस मामले में अद्यतन नहीं किया गया है, क्योंकि कोई HTTP प्रतिक्रिया प्राप्त नहीं हुई है।
नाथन रीड

1
जैसा कि @NathanReed ने कहा, आपको जांच करनी चाहिए कि $ सामग्री झूठी नहीं है (=== के साथ) क्योंकि जो भी रिटर्न मिलता है, अगर वह अनुरोध को पूरा करने में विफल रहता है तो
SE

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
}

यह काम नहीं करता है। यदि $url404 नहीं मिला है, तब भी चेतावनी दिखाई देगी।
रैप्टर

राइट रैप्टर, मैंने stream_context_create () के साथ उत्तर में सुधार किया है; कुछ भी बेहतर नहीं ... "@" अनुशंसित नहीं
राफाशीष

1
ignore_errorsकेवल HTTP संदर्भ को HTTP प्रतिक्रिया स्थिति कोड> = 400 त्रुटियों के रूप में व्याख्या नहीं करने के लिए निर्देश देता है । जबकि मामूली रूप से संबंधित, कि PHP त्रुटि हैंडलिंग के सवाल का जवाब नहीं है।
सूर्य

ignore_errorsविकल्प के लिए धन्यवाद ! यह वही है जो मुझे चाहिए था!
Modder

6

यहां बताया गया है कि मैं इसे कैसे संभालता हूं:

$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

सबसे अच्छी बात यह होगी कि आप अपनी त्रुटि और अपवाद हैंडलर सेट करें जो किसी उपयोगी चीज को किसी फाइल में लॉग इन करने या महत्वपूर्ण लोगों को ईमेल करने जैसे काम करेगा। http://www.php.net/set_error_handler


1

आप इस स्क्रिप्ट का उपयोग कर सकते हैं

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

इसके लिए सख्त तुलना की आवश्यकता है: if ($url === true)...क्योंकि यदि आपको प्रतिक्रिया 0या रिक्तता मिलती है , तो यह कनेक्शन त्रुटि को बढ़ाता है।
डैनियल डब्ल्यू।

1

चूंकि PHP 4 का उपयोग error_reporting () :

$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

कुछ इस तरह:

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]);
}


-2

File_get_contents () का उपयोग करने से पहले आपको file_exists () फ़ंक्शन का उपयोग करना चाहिए। इस तरह आप php की चेतावनी से बचेंगे।

$file = "path/to/file";

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

यह केवल तभी काम करेगा, यदि आप किसी स्थानीय फ़ाइल को कॉल करते हैं और आपके पास स्थानीय फ़ाइल की जाँच करने के लिए सही अनुमति है यदि वह मौजूद है
rubo77

-3

फ़ाइल php.ini बदलें

allow_url_fopen = On

allow_url_include = On

यह मत करो। विशेष रूप से url को शामिल करने की अनुमति न दें। मुझे विश्वास मत करो। यह डिफ़ॉल्ट रूप से एक बहुत अच्छे कारण # c99 के लिए अक्षम कर दिया गया है।
डैनियल डब्ल्यू।

-3

यह डेटा प्राप्त करने की कोशिश करेगा, अगर यह काम नहीं करता है, तो यह त्रुटि को पकड़ लेगा और आपको कुछ भी ऐसा करने की अनुमति देगा जो आपको पकड़ने की आवश्यकता है।

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 हमेशा एक अपवाद फेंक नहीं है
marlar

क्या आप अपना उत्तर संपादित करना चाहेंगे और हमें बताएँगे कि किस समय file_get_content अपवादों को फेंकता है?
रविंदर पायल

1
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह कोड क्यों और / या इस बारे में अतिरिक्त संदर्भ प्रदान करता है कि यह प्रश्न इसके दीर्घकालिक मूल्य में सुधार करता है।
Jay Blanchard

-3

आपको भी सेट करना चाहिए

allow_url_use = On 

php.iniचेतावनी प्राप्त करने से रोकने के लिए अपने में ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.