PHP ping始终返回活动状态

时间:2018-11-23 11:17:12

标签: php laravel ping

你好,我在尝试ping IP地址时遇到了一个问题。脚本始终返回该IP处于活动状态,尽管我知道这些IP未处于活动状态。 我真的不知道我的逻辑是不好还是ping脚本写得不好。 先感谢您。 这就是我所拥有的:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Ping;

class ping_controller extends Controller
{

    /**
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function ping()
    {
        $ipcount = Ping::count();
        $ip =[];
        $i = 1;

        for($i = 1; $i <= $ipcount; $i++)
        {
            $ip[$i] = Ping::where('id',$i)->pluck('ip_adress');
            $newip = str_replace('["', '', $ip[$i]);
            $newip2 = str_replace('"]', '', $newip);
            exec("ping -n 1 " . $newip2 . " | head -n 2 | tail -n 1 | awk '{print $7}'", $ping);
            $ping_time = implode("", $ping);
            if($ping_time<=1000)
            {
                $status[$i] = "PC $newip2 is active";
            }
            else
            {
                $status[$i] = "PC $newip2 is inactive";
            }
        }
    $on = implode(" , ",$status);
    return view("/home")->with("status", $on);
}

1 个答案:

答案 0 :(得分:0)

我认为,您必须像这样处理 exec 函数的最后一个参数:

exec("ping -c 1 localhost", $output, $result)

根据docs

  

字符串exec(字符串$ command [,数组&$ output [,int&$ return_var]])

     

return_var

     

如果return_var参数与输出参数一起出现,   然后执行命令的返回状态将被写入   变量。

所以您必须检查$ result变量是0还是1:

0->成功

1->否则

所以这个:

            exec("ping -c 1 " . $newip2, $ping, $result);
            if($result == 0)
            {
                $status[$i] = "PC $newip2 is active";
            }
            else
            {
                $status[$i] = "PC $newip2 is inactive";
            }

代替:

            exec("ping -c 1 " . $newip2 . " | head -n 2 | tail -n 1 | awk '{print $7}'", $ping);
            $ping_time = implode("", $ping);
            if($ping_time<=1000)
            {
                $status[$i] = "PC $newip2 is active";
            }
            else
            {
                $status[$i] = "PC $newip2 is inactive";
            }