PingController.php 2.1 KB

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