PingController.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. use Log;
  6. /**
  7. * PING检测工具
  8. *
  9. * Class PingController
  10. *
  11. * @package App\Http\Controllers\Api
  12. */
  13. class PingController extends Controller
  14. {
  15. public function ping(Request $request)
  16. {
  17. $token = $request->input('token');
  18. $host = $request->input('host');
  19. $port = $request->input('port', 22);
  20. $transport = $request->input('transport', 'tcp');
  21. $timeout = $request->input('timeout', 0.5);
  22. if (empty($host)) {
  23. echo "<pre>";
  24. echo "使用方法:";
  25. echo "<br>";
  26. echo "GET /api/ping?token=toke_value&host=www.baidu.com&port=80&transport=tcp&timeout=0.5";
  27. echo "<br>";
  28. echo "token:.env下加入API_TOKEN,其值就是token的值";
  29. echo "<br>";
  30. echo "host:检测地址,必传,可以是域名、IPv4、IPv6";
  31. echo "<br>";
  32. echo "port:检测端口,可不传,默认22";
  33. echo "<br>";
  34. echo "transport:检测协议,可不传,默认tcp,可以是tcp、udp";
  35. echo "<br>";
  36. echo "timeout:检测超时,单位秒,可不传,默认0.5秒,建议不超过3秒";
  37. echo "<br>";
  38. echo "成功返回:1,失败返回:0";
  39. echo "</pre>";
  40. exit();
  41. }
  42. // 验证TOKEN,防止滥用
  43. if (env('API_TOKEN') != $token) {
  44. return response()->json(['status' => 0, 'message' => 'token invalid']);
  45. }
  46. // 如果不是IPv4
  47. if (false === filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
  48. // 如果是IPv6
  49. if (filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
  50. $host = '[' . $host . ']';
  51. }
  52. }
  53. try {
  54. $host = gethostbyname($host); // 这里如果挂了,说明服务器的DNS解析不给力,必须换
  55. $fp = stream_socket_client($transport . '://' . $host . ':' . $port, $errno, $errstr, $timeout);
  56. if (!$fp) {
  57. Log::info("$errstr ($errno)");
  58. $ret = 0;
  59. $message = 'port close';
  60. } else {
  61. $ret = 1;
  62. $message = 'port open';
  63. }
  64. fclose($fp);
  65. return response()->json(['status' => $ret, 'message' => $message]);
  66. } catch (\Exception $e) {
  67. Log::info($e);
  68. return response()->json(['status' => 0, 'message' => 'port close']);
  69. }
  70. }
  71. }