PingController.php 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. use Log;
  6. class PingController extends Controller
  7. {
  8. public function ping(Request $request)
  9. {
  10. $host = $request->input('host');
  11. $port = $request->input('port', 22);
  12. $transport = $request->input('transport', 'tcp');
  13. $timeout = $request->input('timeout', 0.5);
  14. if (empty($host)) {
  15. echo "使用方法:";
  16. echo "<br>";
  17. echo "GET /api/ping?host=www.baidu.com&port=80&transport=tcp&timeout=0.5";
  18. echo "<br>";
  19. echo "host:检测地址,必传,可以是域名、IPv4、IPv6";
  20. echo "<br>";
  21. echo "port:检测端口,可不传,默认22";
  22. echo "<br>";
  23. echo "transport:检测协议,可不传,默认tcp,可以是tcp、udp";
  24. echo "<br>";
  25. echo "timeout:检测超时,单位秒,可不传,默认0.5秒,建议不超过3秒";
  26. echo "<br>";
  27. echo "成功返回:1,失败返回:0";
  28. exit();
  29. }
  30. // 如果不是IPv4
  31. if (false === filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
  32. // 如果是IPv6
  33. if (filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
  34. $host = '[' . $host . ']';
  35. } else {
  36. $host = gethostbyname($host);
  37. }
  38. }
  39. $transport = $transport . '://';
  40. try {
  41. $fp = stream_socket_client($transport . $host . ':' . $port, $errno, $errstr, $timeout);
  42. if (!$fp) {
  43. Log::info("$errstr ($errno)");
  44. $ret = 0;
  45. } else {
  46. $ret = 1;
  47. }
  48. fclose($fp);
  49. return $ret;
  50. } catch (\Exception $e) {
  51. Log::info($e);
  52. return 0;
  53. }
  54. }
  55. }