PHP file_get_contents在执行之前是否在线检查源

时间:2018-12-21 02:06:42

标签: php file-get-contents

我正在使用PHP file_get_contents读取文本文件数据。

假设我有2个IP地址,有1个在线和1个离线:

192.168.180.181 - Online
192.168.180.182 - Offline

和PHP

$fileAccept = file_get_contents("\\\\192.168.180.181\\Reports\\".$dModel['MODEL_NAME'].$source."\\Accept\\Accept_".$dDtl['MODEL_CODE']."_".$dateCode."_".$dDtl['TS_CODE'].".txt");

我们知道IP地址192.168.180.182处于脱机状态,因此我尝试运行该代码。结果页面总是加载。

我的问题,如何防止它可能首先需要检查IP是否有效,如果还可以,则可以继续下一步。

也许是这样的:

if(IP IS OFFLINE)
{
    echo "do not do anything";
}
else
{
    echo "do something";
}

2 个答案:

答案 0 :(得分:0)

您可以尝试类似的方法

$scc = stream_context_create(array('http'=>
    array(
        'timeout' => 120,  //120 seconds 
    )
));
$url = "http://192.168.180.181/....";
$handle =  file_get_contents('$url, false, $scc);

您可以创建两个句柄并使用if语句检查是否可以,当然您可以将超时更改为您要使用的套件

更新: 如果在本地访问文件,则可以检查此stream_set_timeout()函数,documentation is here

答案 1 :(得分:0)

此解决方案基于ping您需要检查的IP

class IPChecker{

    public static function isIPOnline($ip){

        switch (SELF::currentOS()){
            case "windows":
                $arg = "n";
                break;
            case "linux":
                $arg = "c";
                break;
            default: throw new \Exception('unknown OS');
        }

        $result = "";
        $output = [];
        // to debug errors add 2>&1 to the command to fill $output
        // https://stackoverflow.com/questions/16665041/php-why-isnt-exec-returning-output
        exec("ping -$arg 2 $ip " , $output, $result);
        // if 0 then the there is no errors like "Destination Host Unreachable"
        if ($result === 0) return true;
        return false;
    }


    public static function currentOS(){
        if(strpos(strtolower(PHP_OS), "win") !== false) return 'windows';
        elseif (strpos(strtolower(PHP_OS), "linux") !== false) return 'linux';
        //TODO: extend other OSs here
        else return 'unknown';

    }

}

用法示例

var_dump( IPChecker::isIPOnline("192.168.180.181") );// should outputs bool(true) 
var_dump( IPChecker::isIPOnline("192.168.180.182") );// should outputs bool(false) 

我在答案中使用了以下答案(12