আমি পিএইচপি-তে ফাইল_জেট_কন্টেন্টস () ফাংশনের সতর্কতাটি কীভাবে পরিচালনা করতে পারি?


312

আমি এই জাতীয় একটি পিএইচপি কোড লিখেছিলাম

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

তবে আমি যখন "http: //" সরিয়ে ফেলি তখন আমি $siteনিম্নলিখিত সতর্কতাটি পাই:

সতর্কতা: ফাইল_জেট_কন্টেন্টস (www.google.com) [ফাংশন.ফাইল-গেট-সামগ্রী]: স্ট্রিমটি খুলতে ব্যর্থ হয়েছে:

আমি চেষ্টা tryএবং catchকিন্তু এটা কাজ করে নি।


2
এছাড়াও একটি আকর্ষণীয় পদ্ধতির: স্ট্যাকওভারফ্লো.com
হুগো স্টিগ্লিটজ

সংশ্লিষ্ট: stackoverflow.com/q/2002610
Fr0zenFyr

Set_error_handler ফাংশনের সাথে ব্যবহারের চেষ্টা-ধরা এখানে বলেন stackoverflow.com/a/3406181/1046909
MingalevME

2
আপনি যদি url থেকে http: // মুছে ফেলেন তবে আপনি নিজের স্থানীয় ডিস্কে একটি ফাইল "www.google.com" সন্ধান করছেন।
রাউলি রাজান্ডে

এটি কীভাবে এত বেশি মনোযোগ এবং অগ্রাধিকার পেতে পারে। আপনি কেন প্রোটোকল তথ্য সরিয়ে ফেলবেন। এমনকি ২০০৮ সালে আপনার এফটিপি এবং এইচটিটিপিএস ছিল।
ড্যানিয়েল ডাব্লু।

উত্তর:


506

পদক্ষেপ 1: রিটার্ন কোডটি পরীক্ষা করুন: if($content === FALSE) { // handle error here... }

পদক্ষেপ 2: ফাইল_জেট_কন্টেন্টস () - এ কলের সামনে ত্রুটি নিয়ন্ত্রণ অপারেটর (যেমন @) রেখে সতর্কতা দমন করুন : $content = @file_get_contents($site);


86
কঠোর তুলনাটি ব্যবহার করতে ভুলবেন না: যদি ($ সামগ্রী === মিথ্যা) the যদি ফাইলটিতে "0" থাকে তবে এটি একটি মিথ্যা নেতিবাচক ট্রিগার করবে।
আরম কোচার্যান

7
হাই, এটি আমার পক্ষে কার্যকর হয়নি, @ যোগ করার পরেও E_WARNING কে কিছু বিশ্বব্যাপী (আমার নয়) ত্রুটি হ্যান্ডলার দ্বারা ধরা পড়বে এবং আমার স্ক্রিপ্টটি আমার কাছে ফেরতের মানটি হ্যান্ডেল করার আগেই মারা যায়। কোন ধারনা? tnx।
সাগী মান

1
পার্শ্ব প্রতিক্রিয়া সনাক্ত করা হয়েছে: ফাইলটি যদি না থাকে তবে স্ক্রিপ্টটি @ ফাইল_জেট_কন্টেন্টস লাইনে থামবে।
ডেক্স

এটি আমার পক্ষে কার্যকর হয় না, যদিও এটি সঠিক সমাধান হতে চলেছে। আমার কাছে কোনও ডেটা প্রাপ্ত হওয়ার সাথে একটি টাইমআউট সতর্কতা রয়েছে, তবে $ সামগ্রী === ফলস "ট্রিগারড" নয় (a সাইটটি লোকালহোস্ট সার্ভার থেকে কল করা হচ্ছে, নোট করুন যে আমি ব্রাউজারে নিজেকে ইউআরএল পেস্ট করি তবে আমার কাছে দ্রুত ডেটা রয়েছে)।
অলিভার

4
যদিও উত্তরটি খুব পুরানো, তবুও আমি আপনার উত্তরে একটি নোট যুক্ত করার পরামর্শ দিচ্ছি যে @ব্যবহারটি পারফরম্যান্সকে নেতিবাচকভাবে প্রভাবিত করতে পারে। দেখুন এই উত্তরটি একটি সম্পর্কিত পোষ্টের মোটামুটি ভাল ব্যাখ্যা করে করেন।
ফ্র0zenFyr

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

একটি সামান্য ত্রুটি ধরার জন্য প্রচুর কোডের মতো মনে হচ্ছে, তবে আপনি যদি নিজের অ্যাপ্লিকেশন জুড়ে ব্যতিক্রম ব্যবহার করেন তবে আপনাকে কেবল একবারে এটি করতে হবে, শীর্ষে (উদাহরণস্বরূপ একটি অন্তর্ভুক্ত কনফিগারেশন ফাইলটিতে), এবং এটি হবে আপনার সমস্ত ত্রুটিগুলি সম্পূর্ণ ব্যতিক্রমগুলিতে রূপান্তর করুন।


এটি এখন পর্যন্ত আমি যে সর্বাধিক উন্নত করেছি সেগুলি পিএইচপি উন্নতি। ধন্যবাদ এনোব্রেভ
টমাসজ স্ম্যকভস্কি

@ ইউনব্রেভ, আপনি ত্রুটি সংখ্যা এবং তীব্রতা উভয়ের জন্য কেন একই মান রাখেন?
পেসারিয়ার

_ ব্যতিক্রম-> getCode () এ দরকারী কিছু সরবরাহ করার উপায় ছাড়া নির্দিষ্ট কারণ নেই কারণ সেট_অরর_হ্যান্ডলার ত্রুটি সংখ্যার ভেরিয়েবল সরবরাহ করে না (দুর্ভাগ্যক্রমে)।
enobrev

1
@enobrev ব্যতিক্রম ছোঁড়ার আগে বেনামে ফাংশনটির ভিতরে ত্রুটি হ্যান্ডলারটি পুনরুদ্ধার করতে ভুলবেন না। ব্যতিক্রম হ্যান্ডেল করা যেতে পারে এবং সেক্ষেত্রে হ্যান্ডলারটি এখনও এই নির্দিষ্ট ব্যতিক্রমটি ছুঁড়ে ফেলার জন্য প্রস্তুত রয়েছে যা অপ্রত্যাশিত হিসাবে উপস্থিত হতে পারে এবং অস্বাভাবিক, ডিবাগ করা শক্ত, আচরণ যখন ব্যতিক্রম হ্যান্ডলিংয়ে অন্য কোনও ত্রুটি ঘটবে তখন পরিচয় করিয়ে দেয়।
জোসেফ সাবল

1
আমি অবশেষে ব্লকটিতে পুনরুদ্ধার_আরর_হ্যান্ডলার () কলটি অন্তর্ভুক্ত করার জন্য সুপারিশ করব
peschanko

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উপরের @ ইউনব্রেভ থেকে পরীক্ষার পরে আমি এটি পেয়েছি তবে এটি কম দীর্ঘ (এবং আইএমও, আরও পঠনযোগ্য) কোডের জন্য মঞ্জুরি দেয়। আমরা কেবল error_get_lastসর্বশেষ ত্রুটির পাঠ্য পেতে ব্যবহার করি এবং file_get_contentsব্যর্থতায় মিথ্যা প্রত্যাবর্তন করি, তাই একটি সাধারণ "যদি" এটি ধরতে পারে।


2
এটি এই সমস্যার সহজতম এবং সেরা সমাধান! সম্ভবত এটি @file_get_contentsব্রাউজারে ত্রুটি প্রতিবেদন দমন করার জন্য তৈরি করুন।
ইডিপি

1
আমি স্বীকার করি যে সমস্ত উত্তরের মধ্যে এটিই একমাত্র বুদ্ধিমান - আমরা যদি @file_get_contentsএটি সতর্কতা দমন করতে ব্যবহার করতে এবং ফলাফলের মানটি ব্যবহার করে পরীক্ষার জন্য এটি ব্যবহার করতে চাই === FALSE
kostix

11
এটি সফল অনুরোধগুলির জন্য ত্রুটিগুলি ট্রিগার করবে যা কোনও দেহ ফেরত দেয় না বা মিথ্যা হিসাবে মূল্যায়ন করে এমনটি ফিরিয়ে দেয়। হওয়া উচিতif (false !== ($data = file_get_contents ()))
গর্ডনএম

ডকুমেন্টেশনটি এটি পরিষ্কার করে দেয় না, তবে @ ব্যবহারের ফলে error_get_lastআমার অভিজ্ঞতাতে কোনও কিছুই ফেরত আসতে পারে
গ্লেন

33

আপনি একটি @ শোধ করতে পারেন: $content = @file_get_contents($site);

এটি কোনও সতর্কতা দমন করবে - খুব কম ব্যবহার করুন! । দেখুন ত্রুটি কন্ট্রোল অপারেটর

সম্পাদনা: আপনি যখন 'http: //' সরিয়ে ফেলেন তখন আপনি আর ওয়েব পৃষ্ঠা খুঁজছেন না, তবে আপনার ডিস্কে একটি ফাইল "www.google ....." বলে


এটিই কেবলমাত্র সত্যই কাজ করে - আমি অন্য কোনওভাবে "স্ট্রিম খুলতে ব্যর্থ" বার্তাটি দমন করতে পারিনি।
ওলাফ

21

একটি বিকল্প হ'ল ত্রুটিটি দমন করা এবং একটি ব্যতিক্রম ছুঁড়ে দেওয়া যা আপনি পরে ধরতে পারেন। আপনার কোডটিতে ফাইল_জেট_কন্টেন্টস () -তে একাধিক কল থাকলে এটি বিশেষত কার্যকর, যেহেতু আপনাকে সমস্তটি ম্যানুয়ালি দমন ও পরিচালনা করার দরকার নেই। পরিবর্তে, একক চেষ্টা / ক্যাচ ব্লকে এই ফাংশনটিতে বেশ কয়েকটি কল করা যেতে পারে।

// 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
@ নাথানরিদ যেমন বলেছে, আপনার পরীক্ষা করা উচিত $ সামগ্রীটি মিথ্যা নয় (সাথে ===) যা অনুরোধটি
কোনওভাবেই

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 পাওয়া যায় না, সতর্কতা এখনও উপস্থিত হবে।
র‌্যাপটার

ডান র‌্যাপ্টর, আমি উত্তর_প্রবাহ_কন্টেক্সট () দিয়ে উন্নত করেছি; এর চেয়ে ভাল আর কিছু নয় ... "@" প্রস্তাবিত নয়
রাফাশী

1
ignore_errorsকেবল HTTP প্রসঙ্গটি HTTP প্রতিক্রিয়া স্থিতি কোড> = 400 ত্রুটি হিসাবে ব্যাখ্যা না করার নির্দেশ দেয় । প্রান্তিকভাবে সম্পর্কিত থাকাকালীন, এটি পিএইচপি ত্রুটি পরিচালনার প্রশ্নের উত্তর দেয় না।
সূর্য

ignore_errorsবিকল্পের জন্য ধন্যবাদ ! এটাই আমার দরকার!
মোড্ডার

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

যেহেতু পিএইচপি 4 টি ত্রুটি_বর্ধনা () ব্যবহার করে :

$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 = "path/to/file";

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

এটি কেবল তখনই কাজ করবে, যদি আপনি একটি স্থানীয় ফাইল কল করেন এবং স্থানীয় ফাইল উপস্থিত থাকলে তা পরীক্ষা করার জন্য আপনার কাছে সঠিক অনুমতি রয়েছে
রুও 7777

-3

Php.ini ফাইলটি পরিবর্তন করুন

allow_url_fopen = On

allow_url_include = On

এটি করবেন না। বিশেষত ইউআরএল অন্তর্ভুক্ত করার অনুমতি দেবেন না। বিশ্বাস করো না। এটি একটি খুব ভাল কারণের জন্য ডিফল্টরূপে অক্ষম করা হয়েছে # 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);
});

ফাইল_জেট_সামগ্রী সর্বদা একটি ব্যতিক্রম ছুঁড়ে না
মার্চার

আপনি কি নিজের উত্তরটি সম্পাদনা করতে এবং আমাদের বলতে চান যে কোন সময় ফাইল_জেট_ কনটেন্ট ব্যতিক্রম ছোঁড়ে?
রবীন্দ্র পায়েল

1
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কেন এবং / অথবা এই কোডটির প্রশ্নের উত্তর কীভাবে তার দীর্ঘমেয়াদী মানকে উন্নত করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করে।
জে

-3

আপনারও সেট করা উচিত

allow_url_use = On 

আপনার php.iniসতর্কতা গ্রহণ বন্ধ করতে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.