【问题标题】:PHP - Ping exec on Linux hangs scriptPHP - Linux 上的 Ping exec 挂起脚本
【发布时间】:2016-05-27 06:26:38
【问题描述】:

我有一个简单的 PHP 脚本设置来检查我的服务器的状态。它使用标准的 ping 命令,通过 exec() 运行。

  • 在 Windows 上,脚本在服务器在线和 下来时。
  • 在 Linux 上,脚本在服务器在线时工作,但在服务器在线时挂起 服务器已关闭。超时似乎对后者没有影响。

通过控制台使用相同的命令进行 Ping 可以正常工作并正确超时。


是什么原因,如何解决?

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
  $exec_string = 'ping -n 1 -i 255 -w 2 ' . $host;
} else {
  $exec_string = 'ping -n -c 1 -t 255 -w 2 ' . $host;
}
exec($exec_string, $output, $return);

【问题讨论】:

    标签: php linux exec ping freeze


    【解决方案1】:

    我会避免直接使用exec() ping。我用这个脚本,found here,你也可以设置端口和超时:

    function ping($host, $port = 80, $timeout = 6) {
        $fsock = fsockopen($host, $port, $errno, $errstr, $timeout);
        if (!$fsock) {
            return false;
        } else {
            return true;
        }
    }
    
    $host = 'www.example.com';
    
    if(ping($host)) {
        echo "HOST UP";
    } else {
        echo "HOST DOWN";
    }
    

    【讨论】:

    • 我同意这是一个合适的解决方案,特别是因为如果系统函数调用不可用,这将有效。但你没有解释为什么你会避免使用 exec 执行 ping 操作?
    • fsockopen 已被用作备份解决方案,因此未包含在问题中。
    • 我倾向于避免使用exec(),因为出于安全原因,它们经常被禁用。
    • 链接已过时。
    【解决方案2】:

    我不确定为什么,但是从 suPHP 切换到 fastCGI(都启用了 suEXEC)似乎可以解决问题并且 ping 正常超时。

    如果有人对此有解释,我很想知道,无论是评论还是回答格式。

    【讨论】:

      猜你喜欢
      • 2015-03-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 2016-04-01
      • 2011-05-12
      • 2016-11-16
      相关资源
      最近更新 更多