Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果没有internet连接,则持续加载_Php_Apache_Raspberry Pi_Raspberry Pi3 - Fatal编程技术网

Php 如果没有internet连接,则持续加载

Php 如果没有internet连接,则持续加载,php,apache,raspberry-pi,raspberry-pi3,Php,Apache,Raspberry Pi,Raspberry Pi3,我目前正在开发一个在线控制的家庭,但我有一个与互联网连接检查器的问题 我有这个代码来检测是否有互联网连接或没有互联网连接 $check = @fsockopen("www.google.com", 80); if($check){ return true; fclose($check); }else{ return false; fclose($check); } 但问题是,当我的Raspberry Pi没有互联网连接时,它会永远持续加载页面 完整的脚本在

我目前正在开发一个在线控制的家庭,但我有一个与互联网连接检查器的问题

我有这个代码来检测是否有互联网连接或没有互联网连接

$check = @fsockopen("www.google.com", 80); 
if($check){
    return true;
    fclose($check);
}else{
     return false;
     fclose($check);
}
但问题是,当我的Raspberry Pi没有互联网连接时,它会永远持续加载页面

完整的脚本在这里

<?php
    function checkConnection(){
        $check = @fsockopen("www.google.com", 80); 
        if($check){
            return true;
            fclose($check);
        }else{
             return false;
             fclose($check);
        }
    }
    if(checkConnection()==true){
        echo '[{"status":"success","result":"Internet Connection is Available"}]';
    }else{
        echo '[{"status":"fail","result":"No Internet Connection"}]';
    }
?>

也许对您的功能进行一点小小的更改就可以说明这种情况。例如:

   function checkConnection() {
         $fp = @fsockopen("www.google.com", 80, $errno, $errstr, 3); 
         if (!$fp) {
             return "$errstr ($errno)<br />\n";
         } else {
             return true;
         }
    }
    $con = checkConnection();
    if ($con===true) {
        echo json_encode( ["status" => "success","result" => "Internet Connection is Available"] );
    } else {
        //  should not be - No Internet Connection is Available
        echo json_encode( ["status" => "fail","result" => $con] );
    }
您可能希望在设置
gethostbyname
的可选选项时检查这一点

将超时作为最后一个参数,仅在连接套接字时应用

DNS查找也可能是一个因素,因为您无法控制超时,除非您打算使用
gethostbyname()
,在这种情况下,您可以使用

putenv('RES_OPTIONS=retrans:1重试:1超时:1次尝试:1')

将DNS查找限制为1s

根据你的代码,我将如何实现它

function is_connected()
{
    //1. provide a timeout to your socket
    //2. use example.com as a domain, that's what it's made for (testing)
    $socket = @fsockopen("www.example.com", 80, $err_no, $err_str, 5);
    if ($socket){
        fclose($socket);
        return true; 
    }
    return false;
}

$success = json_encode(["status" => "success","result" => "Internet is Available"]);
$failure = json_encode(["status" => "fail","result" => "Internet is Unavailable"]);

echo is_connected() ? $success : $failure;

仅当成功连接时才关闭套接字连接使用
json_encode
回送您的响应,例如,
echo json_encode([“状态”=>“成功”,“结果”=>“Internet连接可用”])我尝试了你的两个建议,但结果仍然是一样的:(当没有internet连接时,你的功能将无法工作,因为DNS将无法解析主机名。?尝试使用IP并在末尾设置超时。还要检查google是否允许端口80连接!!实际上我的建议不是关于这个问题:)只是一个提示,正如@ CoderSam所说,DNS将尝试解决Google .com域,这将需要很长时间才能超时,考虑将超时参数添加到您的<代码> FSOCKOPEN(…,$TimeOutt);<代码>它仍在加载。永无止境load@MarverickM. 根据本问题中给出的代码片段和在PHPFiddle中完成的测试,您应该会得到一个错误。请发布可能有助于解决此问题的任何其他相关代码。@MarverickM。此外,您可能需要更改此示例函数的位,以便在DNS查找失败时提供错误
function is_connected()
{
    //1. provide a timeout to your socket
    //2. use example.com as a domain, that's what it's made for (testing)
    $socket = @fsockopen("www.example.com", 80, $err_no, $err_str, 5);
    if ($socket){
        fclose($socket);
        return true; 
    }
    return false;
}

$success = json_encode(["status" => "success","result" => "Internet is Available"]);
$failure = json_encode(["status" => "fail","result" => "Internet is Unavailable"]);

echo is_connected() ? $success : $failure;