เป็นไปได้หรือไม่ที่จะปิงเซิร์ฟเวอร์จาก Javascript


152

ฉันกำลังสร้างเว็บแอปที่ต้องการให้ฉันตรวจสอบว่าเซิร์ฟเวอร์ระยะไกลออนไลน์หรือไม่ เมื่อฉันเรียกใช้จากบรรทัดคำสั่งโหลดหน้าของฉันขึ้นไปเต็ม 60s (สำหรับ 8 รายการมันจะขยายขนาดเชิงเส้นมากขึ้นด้วย)

ฉันตัดสินใจที่จะไปเส้นทางของการส่งเสียงแหลมในตอนท้ายของผู้ใช้ ด้วยวิธีนี้ฉันสามารถโหลดหน้าเว็บและให้พวกเขารอข้อมูล "เซิร์ฟเวอร์ออนไลน์" ขณะเรียกดูเนื้อหาของฉัน

หากใครมีคำตอบสำหรับคำถามข้างต้นหรือถ้าพวกเขารู้วิธีแก้ปัญหาเพื่อให้หน้าของฉันโหลดได้อย่างรวดเร็วฉันก็จะขอบคุณมันแน่นอน

คำตอบ:


134

ฉันได้พบใครบางคนที่ประสบความสำเร็จในเรื่องนี้ด้วยการใช้งานImageวัตถุพื้นเมืองอย่างชาญฉลาด

จากแหล่งที่มาของพวกเขานี่คือฟังก์ชั่นหลัก (มันมีการพึ่งพาส่วนอื่น ๆ ของแหล่งที่มา แต่คุณได้รับความคิด)

function Pinger_ping(ip, callback) {

  if(!this.inUse) {

    this.inUse = true;
    this.callback = callback
    this.ip = ip;

    var _that = this;

    this.img = new Image();

    this.img.onload = function() {_that.good();};
    this.img.onerror = function() {_that.good();};

    this.start = new Date().getTime();
    this.img.src = "http://" + ip;
    this.timer = setTimeout(function() { _that.bad();}, 1500);

  }
}

สิ่งนี้ใช้ได้กับเซิร์ฟเวอร์ทุกประเภทที่ฉันทดสอบ (เว็บเซิร์ฟเวอร์, เซิร์ฟเวอร์ ftp และเซิร์ฟเวอร์เกม) นอกจากนี้ยังทำงานกับพอร์ต หากใครพบกรณีใช้ที่ล้มเหลวโปรดโพสต์ในความคิดเห็นและฉันจะอัปเดตคำตอบของฉัน

อัปเดต : ลบลิงก์ก่อนหน้านี้ หากใครพบหรือใช้ข้างต้นโปรดแสดงความคิดเห็นและฉันจะเพิ่มลงในคำตอบ

อัปเดต 2 : @trante ดีพอที่จะมอบ jsFiddle

http://jsfiddle.net/GSSCD/203/

อัปเดต 3 : @Jonathon สร้าง repo GitHub ด้วยการใช้งาน

https://github.com/jdfreder/pingjs

อัปเดต 4 : ดูเหมือนว่าการใช้งานนี้ไม่น่าเชื่อถืออีกต่อไป ผู้คนยังรายงานว่า Chrome ไม่สนับสนุนอีกต่อไปทั้งหมดโดยมีnet::ERR_NAME_NOT_RESOLVEDข้อผิดพลาดเกิดขึ้น หากใครบางคนสามารถตรวจสอบการแก้ปัญหาทางเลือกฉันจะใส่ว่าเป็นคำตอบที่ยอมรับ


48
นี่คือสิ่งที่ฉันใช้ อย่างไรก็ตามมีข้อบกพร่องหนึ่งข้อและนั่นคือ "รูปภาพ" ถูกแคช เมื่อฉัน ping IP ที่กำหนดเริ่มแรกฉันจะได้รับ 304 ms - แต่ถ้าฉัน ping ครั้งที่สองโดยไม่โหลดหน้าซ้ำฉันจะได้ 2 ms แทน สิ่งนี้สามารถหลีกเลี่ยงได้โดยผนวกท้าย"/?cachebreaker="+new Date().getTime();ถึง img src หากจำเป็น
Meshaal

2
สิ่งนี้ไม่ทำงานสำหรับฉันชื่อโฮสต์ที่ไม่ถูกต้องที่ทราบผลลัพธ์ในคำขอ Ping ไม่สามารถหาโฮสต์...ได้ แต่เนื่องจาก onerror คือ 'ดี' สิ่งนี้บอกว่ามันตอบ
Maslow

5
การทดสอบเพิ่มเติมพบว่าสิ่งนี้ไม่น่าเชื่อถือโดยสิ้นเชิง
Leo

2
Ping API ที่ @Jonathon สร้างขึ้นจะประสบความสำเร็จในการ ping ทุกอย่าง ไซต์ที่ไม่มีอยู่จริงและตัวอักษรแบบสุ่ม
IE5Master

2
Ping API ล้มเหลวจริง ๆ กับ onerror อย่างไรก็ตามถ้า URL เป้าหมายแสดงถึงรูปภาพมันจะเปิดใช้งาน onload ซึ่งยอดเยี่ยม! ข้ามการตรวจสอบ CORS
Martin Vysny

20

Ping เป็น ICMP แต่หากมีพอร์ต TCP ใด ๆ ที่เปิดอยู่บนเซิร์ฟเวอร์ระยะไกลก็สามารถทำได้ดังนี้:

function ping(host, port, pong) {

  var started = new Date().getTime();

  var http = new XMLHttpRequest();

  http.open("GET", "http://" + host + ":" + port, /*async*/true);
  http.onreadystatechange = function() {
    if (http.readyState == 4) {
      var ended = new Date().getTime();

      var milliseconds = ended - started;

      if (pong != null) {
        pong(milliseconds);
      }
    }
  };
  try {
    http.send(null);
  } catch(exception) {
    // this is expected
  }

}


ฉันชอบทางออกที่ยุ่งยากนี้ ต้องให้ฟังก์ชั่นสำหรับพงษ์แทนที่จะส่งกลับตัวเลขเป็นเรื่องแปลกสำหรับฉัน แต่ใช้การได้
Nick

@ armen: คุณต้องจัดเตรียมฟังก์ชันเป็นอาร์กิวเมนต์ที่สามสำหรับ ping () ค่าของอาร์กิวเมนต์นี้เรียกว่า pong ภายในฟังก์ชัน
finitud

2
ping("example.com", "77", function(m){ console.log("It took "+m+" miliseconds."); })ตัวอย่างการโทร
jave.web

@Nick: นี่คือสิ่งที่ไม่ตรงกันดังนั้นในขณะที่วิธีการส่งคืนวิธีonreadystatechangeยังไม่ได้ยิง ซึ่งหมายความว่าคุณต้องโทรกลับเพื่อรับเมื่อสถานะมีการเปลี่ยนแปลง
ความกลัว

สิ่งที่ฉันเลือกสำหรับโฮสต์, พงษ์ () ถูกเรียกว่า ping ( test.zzzzzzzzz, "77", ฟังก์ชั่น (m) {console.log ("ใช้" + m + "miliseconds.");}) พิมพ์“ มันใช้เวลา 67 miliseconds” ping ( stackoverflow.com, "80", ฟังก์ชัน (m) {console.log ("ใช้" + m + "miliseconds.");}) ให้ CORS-Error: developer.mozilla.org/en-US/docs/Web/ HTTP / CORS / ข้อผิดพลาด / ... ฉันไม่เห็นวิธีที่ฉันสามารถตรวจสอบด้วยรหัสนี้หากคอมพิวเตอร์ระยะไกลออนไลน์
Tux

18

คุณสามารถลองสิ่งนี้:

วางping.htmlบนเซิร์ฟเวอร์โดยมีหรือไม่มีเนื้อหาใด ๆ บน javascript จะทำเช่นเดียวกับด้านล่าง:

<script>
    function ping(){
       $.ajax({
          url: 'ping.html',
          success: function(result){
             alert('reply');
          },     
          error: function(result){
              alert('timeout/error');
          }
       });
    }
</script>

1
เซิร์ฟเวอร์ที่ส่งเสียงดังนั้นไม่ใช่ตัวฉันเองดังนั้นฉันจึงไม่มีตัวเลือกนั้น ขอบคุณแม้ว่า
Chuck Callebs

9
@dlchambers ไม่ใช่ค่าธรรมเนียมถึง CORS แต่เนื่องจากจะข้ามโดเมนอย่างรุนแรง CORS อนุญาตให้เซิร์ฟเวอร์ระบุต้นกำเนิดรวมทั้งจะต้องได้รับการสนับสนุนจากเบราว์เซอร์ ดังนั้นจึงเป็นเหมือนปัญหาข้ามโดเมนมากขึ้น
Royi Namir

คำขอประเภท HEAD จะไม่ทำงานเนื่องจาก CORS เช่นกัน ทดสอบกับ Chromium 55 การรับข้อผิดพลาดเดียวกันกับรหัส http 0 เช่นเดียวกับในกรณี net :: CONNECTION_REFUSED
Martin Vysny

นี่คือเบราว์เซอร์ข้ามที่มากขึ้นอย่างแน่นอน
Gabriel

14

คุณไม่สามารถ "ping" ใน javascript โดยตรง อาจมีวิธีอื่นไม่กี่:

  • อาแจ็กซ์
  • การใช้แอปเพล็ต java พร้อมisReachable
  • การเขียนสคริปต์ฝั่งเซิร์ฟเวอร์ซึ่งส่ง Ping และใช้ AJAX เพื่อสื่อสารกับเซิร์ฟเวอร์สคริปต์ของคุณ
  • คุณยังสามารถ ping ในแฟลชได้ (actioncript)

1
Java isReachable นั้นไม่น่าเชื่อถือเลยทีเดียว .... แต่ปี 2018 และ Java Applets นั้นล้าสมัยไปแล้ว
dreua

8

คุณไม่สามารถ ping ปกติใน Javascript ของเบราว์เซอร์ แต่คุณสามารถค้นหาว่าเซิร์ฟเวอร์ระยะไกลยังมีชีวิตอยู่หรือไม่ตัวอย่างเช่นการโหลดรูปภาพจากเซิร์ฟเวอร์ระยะไกล หากการโหลดล้มเหลว -> เซิร์ฟเวอร์หยุดทำงาน

คุณสามารถคำนวณเวลาในการโหลดได้โดยใช้ onload-event นี่คือตัวอย่างวิธีการใช้งาน onload event


4
สิ่งที่โชคร้ายเกี่ยวกับนั่นคือเซิร์ฟเวอร์ที่ฉันส่ง Ping ไม่ใช่เว็บเซิร์ฟเวอร์ พวกเขาเป็นเซิร์ฟเวอร์เกม
Chuck Callebs

1
จากนั้นคุณต้องทำการกระตุกบนฝั่งเซิร์ฟเวอร์ - หรือคุณอาจพิจารณา http-server ที่บางเบา
Epeli

คุณรู้วิธีการรวมปิงหรือไม่? นั่นคือการชะลอตัวหลักของฉันรอคำขอหนึ่งให้เสร็จก่อนที่จะเริ่มต้นอื่น ๆ
Chuck Callebs

คุณต้อง ping เซิร์ฟเวอร์พร้อมกัน คุณสามารถบรรลุผลได้ด้วยการเลือกเธรดหรือกระบวนการ สำหรับโซลูชันที่ไม่ยอมใครง่ายๆจริงๆคุณสามารถใช้ Eventmachine
Epeli

1
คุณอาจใช้ประโยชน์จากคำสั่งบรรทัดpingคำสั่ง มันเป็นจุดแข็งของอุตสาหกรรม หรือมีแอพฟรี / โอเพนซอร์สทุกประเภทเพื่อตรวจสอบว่าโฮสต์ทำงานอยู่หรือไม่โดยใช้การตรวจสอบการเต้นของหัวใจหลายประเภท
Tin Man

7

ทอยด้วยโซลูชัน websocket ...

function ping(ip, isUp, isDown) {
  var ws = new WebSocket("ws://" + ip);
  ws.onerror = function(e){
    isUp();
    ws = null;
  };
  setTimeout(function() { 
    if(ws != null) {
      ws.close();
      ws = null;
      isDown();
    }
  },2000);
}

การisUp();โทรไม่ควรอยู่ในonopenตัวจัดการเหตุการณ์หรือไม่ :)
jave.web

1
มันใช้โปรโตคอล websocket แต่สมมติว่าไม่มีเซิร์ฟเวอร์ websocket รอการเชื่อมต่อ นี่เป็นเพียงการส่ง Ping 'IP เก่า ๆ '
Antony Woods

แต่คุณจะตรวจสอบได้อย่างไรว่า WebSocket ไม่รองรับหรือมีข้อผิดพลาดจริง ๆ :)
jave.web

ถ้าคิดว่าคุณจะโชคร้ายพอ Ping An IP ที่สามารถยอมรับการเชื่อมต่อ WebSocket พอร์ต 80 แล้วใช่คุณควรนอกจากนี้ยังเพิ่มisUp();การเรียกกลับว่า หรือลดขนาดนั้นโดยการเพิ่มพอร์ตที่ไม่ใช่ websocket-y อย่างชัดเจน
Antony Woods

ฉันโหวตสิ่งนี้เพราะฉันมาที่นี่เพื่อหาทางแก้ไขสิ่งที่เกิดขึ้นเมื่อเซิร์ฟเวอร์ websocket ของฉันถูกรีบูทและคำตอบนี้แสดงให้ฉันเห็นว่าฉันสามารถตั้งค่า Timeout ในตัวจัดการข้อผิดพลาดของซ็อกเก็ตและพยายามเชื่อมต่อใหม่ อาจไม่ใช่วิธีปฏิบัติที่ดีที่สุด แต่แก้ไขปัญหาของฉัน :)
mynameisnafe

6

เพื่อให้การร้องขอของคุณรวดเร็วขึ้นให้แคชผลลัพธ์ทางเซิร์ฟเวอร์ของ ping และอัปเดตไฟล์ ping หรือฐานข้อมูลทุกสองสามนาที (หรือถูกต้องตามที่คุณต้องการ) คุณสามารถใช้ cron เพื่อรันคำสั่งเชลล์ด้วย 8 ปิงของคุณและเขียนเอาต์พุตลงในไฟล์เว็บเซิร์ฟเวอร์จะรวมไฟล์นี้ไว้ในมุมมองของคุณ


ฉันคิดว่านี่เป็นวิธีที่น่าเชื่อถือที่สุดและเป็นไปได้ที่ดีที่สุดสำหรับผลลัพธ์ที่แม่นยำ อย่างไรก็ตามเนื่องจากมันยังต้องใช้งานบนเซิร์ฟเวอร์ฉันจะบอกว่ามันไม่ใช่วิธีที่ฉลาด
Chetabahana

5

หากสิ่งที่คุณพยายามที่จะดูคือว่าเซิร์ฟเวอร์ "อยู่" คุณสามารถใช้ต่อไปนี้:

function isValidURL(url) {
    var encodedURL = encodeURIComponent(url);
    var isValid = false;

    $.ajax({
      url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22" + encodedURL + "%22&format=json",
      type: "get",
      async: false,
      dataType: "json",
      success: function(data) {
        isValid = data.query.results != null;
      },
      error: function(){
        isValid = false;
      }
    });

    return isValid;
}

สิ่งนี้จะส่งคืนการบ่งชี้ที่เป็นเท็จหรือไม่ว่าเซิร์ฟเวอร์นั้นมีอยู่จริงหรือไม่

หากคุณต้องการเวลาตอบสนองการแก้ไขเล็กน้อยจะทำ:

function ping(url) {
    var encodedURL = encodeURIComponent(url);
    var startDate = new Date();
    var endDate = null;
    $.ajax({
      url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22" + encodedURL + "%22&format=json",
      type: "get",
      async: false,
      dataType: "json",
      success: function(data) {
        if (data.query.results != null) {
            endDate = new Date();
        } else {
            endDate = null;
        }
      },
      error: function(){
        endDate = null;
      }
    });

    if (endDate == null) {
        throw "Not responsive...";
    }

    return endDate.getTime() - startDate.getTime();
}

การใช้งานนั้นเล็กน้อย:

var isValid = isValidURL("http://example.com");
alert(isValid ? "Valid URL!!!" : "Damn...");

หรือ:

var responseInMillis = ping("example.com");
alert(responseInMillis);

แม้ว่าลิงก์นี้อาจตอบคำถามได้ดีกว่าหากรวมส่วนสำคัญของคำตอบไว้ที่นี่และให้ลิงก์สำหรับการอ้างอิง คำตอบสำหรับลิงก์เท่านั้นอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงมีการเปลี่ยนแปลง
vonbrand

1
นี่เป็นโซลูชันที่ยอดเยี่ยม แต่น่าเสียดายที่บริการค้นหาโดเมน yahoo ดูเหมือนจะให้ผลลัพธ์ที่หลากหลาย ตัวอย่างเช่นหากคุณลองใช้ URL ต่อไปนี้ start-download .com startfreedownload. com จะกลับมาเป็นไม่ได้ลงทะเบียน แต่ถ้าคุณไปที่ URL เหล่านั้น URL เหล่านั้นจะถูกลงทะเบียนอย่างชัดเจน มีความคิดอะไรเกิดขึ้นที่นี่? (ฉันได้เพิ่มช่องว่างให้กับชื่อโดเมนในตัวอย่างเหล่านี้เพื่อหลีกเลี่ยงการให้น้ำ google ออกในการทดสอบของฉันฉันไม่มีที่ว่างในนั้น)
user280109

คุณกำลังส่งคำขอไปยัง Yahoo! API, ping จะไม่เหมือนเดิมหากคุณทำคำขอจากเครื่องของคุณ ไม่มีเหตุผล
Andre Figueiredo

การNo 'Access-Control-Allow-Origin' header is present on the requested resource. Originโทรกลับด้วยสาเหตุและความสำเร็จนี้ไม่เคยถูกเรียก
vladkras

4

ปัญหาเกี่ยวกับการส่ง Ping มาตรฐานคือพวกเขากำลัง ICMP ซึ่งจำนวนมากที่จะไม่ปล่อยให้ผ่านเพื่อความปลอดภัยและการจราจร นั่นอาจอธิบายความล้มเหลว

Ruby ก่อนหน้า 1.9 มี TCP-based ping.rbซึ่งจะรันด้วย Ruby 1.9+ สิ่งที่คุณต้องทำคือคัดลอกจากการติดตั้ง 1.8.7 ไปยังที่อื่น ฉันเพิ่งยืนยันว่ามันจะดำเนินการโดยส่งเราเตอร์ที่บ้านของฉัน


4

มีคำตอบที่บ้ามากมายที่นี่และโดยเฉพาะเกี่ยวกับ CORS -

คุณสามารถทำคำขอ http HEAD (เช่น GET แต่ไม่มี payload) ดูhttps://ochronus.com/http-head-request-good-uses/

ไม่จำเป็นต้องมีการตรวจสอบ preflight ความสับสนเป็นเพราะรุ่นเก่าของข้อกำหนดดูที่ ทำไมคำขอ HEAD แบบไขว้จึงต้องตรวจสอบ preflight

ดังนั้นคุณสามารถใช้คำตอบข้างต้นซึ่งใช้ไลบรารี jQuery (ไม่ได้พูด) แต่ด้วย

type: 'HEAD'

--->

<script>
    function ping(){
       $.ajax({
          url: 'ping.html',
          type: 'HEAD',
          success: function(result){
             alert('reply');
          },     
          error: function(result){
              alert('timeout/error');
          }
       });
    }
</script>

นอกหลักสูตรคุณยังสามารถใช้วานิลลา js หรือโดโจหรืออะไรก็ได้ ...


1
การส่งคำขอ HEAD ยังคงล้มเหลวด้วย "XMLHttpRequest ไม่สามารถโหลด IP ได้ไม่มีส่วนหัว 'Access-Control-Allow-Origin' ปรากฏบนทรัพยากรที่ร้องขอดังนั้น Origin 'ip2' จึงไม่ได้รับอนุญาตให้เข้าถึง" ถูกบล็อกโดย CORS คุณจะได้รับความสำเร็จด้วยสถานะ http 0 และคุณจะไม่สามารถแยกความแตกต่างนี้ได้จากเน็ต :: ERR_CONNECTION_REFUSED ตัวอย่าง
Martin Vysny

0

ฉันไม่รู้ว่าคุณใช้ทับทิมรุ่นใด แต่คุณลองใช้ ping เพื่อทับทิมแทน javascript หรือไม่ http://raa.ruby-lang.org/project/net-ping/


ใช่ฉันได้ลองแล้ว แต่ pings กลับมาผิดเสมอโดยไม่คำนึงถึงเว็บเซิร์ฟเวอร์ ฉันเปลี่ยนเป็นเพียงแค่ใช้ping server.comไวยากรณ์
Chuck Callebs

-1
let webSite = 'https://google.com/' 
https.get(webSite, function (res) {
    // If you get here, you have a response.
    // If you want, you can check the status code here to verify that it's `200` or some other `2xx`.
    console.log(webSite + ' ' + res.statusCode)
}).on('error', function(e) {
    // Here, an error occurred.  Check `e` for the error.
    console.log(e.code)
});;

ถ้าคุณเรียกใช้สิ่งนี้กับโหนดมันจะบันทึก log 200 ตราบใดที่ google ไม่ทำงาน


ไม่มันไม่ใช่ ... 1) คุณขาดความต้องการ 2) กำลังส่งคืน 301 ย้ายอย่างถาวร: D
Michal Miky Jankovský

-1
const ping = (url, timeout = 6000) => {
  return new Promise((reslove, reject) => {
    const urlRule = new RegExp('(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]');
    if (!urlRule.test(url)) reject('invalid url');
    try {
      fetch(url)
        .then(() => reslove(true))
        .catch(() => reslove(false));
      setTimeout(() => {
        reslove(false);
      }, timeout);
    } catch (e) {
      reject(e);
    }
  });
};

ใช้แบบนี้:

ping('https://stackoverflow.com/')
  .then(res=>console.log(res))
  .catch(e=>console.log(e))

-4

คุณสามารถเรียกใช้คำสั่ง DOS ping.exe จาก javaScript โดยใช้ folowing:

function ping(ip)
{
    var input = "";
    var WshShell = new ActiveXObject("WScript.Shell");
    var oExec = WshShell.Exec("c:/windows/system32/ping.exe " + ip);

    while (!oExec.StdOut.AtEndOfStream)
    {
            input += oExec.StdOut.ReadLine() + "<br />";
    }
    return input;
}

นี่คือสิ่งที่ถูกขอหรือฉันขาดอะไรไปหรือเปล่า?


4
มันจะใช้งานได้กับ IE เท่านั้น แต่น่าเสียดายที่บน Windows Server เท่านั้น ตัวเลือกที่ดีกว่าคือการใช้ AJAX เพื่อเรียกใช้สคริปต์ฝั่งเซิร์ฟเวอร์
Andrew Grothe

ห่า? วัตถุ Active X สามารถประมวลผลในระบบไฟล์ของผู้ใช้ (ใน IE บนเซิร์ฟเวอร์ที่ชนะ)? ฉันไม่ได้ทำงานกับ ActiveX แต่ไม่ได้คิดว่า ...
Julix


-8

มันอาจจะง่ายกว่านั้นมาก หากคุณต้องการให้หน้าโหลดจากนั้นตรวจสอบความพร้อมใช้งานหรือเนื้อหาของหน้าเว็บต่างประเทศบางหน้าเพื่อเรียกใช้กิจกรรมหน้าเว็บอื่น ๆ คุณสามารถทำได้โดยใช้เพียงจาวาสคริปต์และ php เช่นนี้

yourpage.php

<?php
if (isset($_GET['urlget'])){
  if ($_GET['urlget']!=''){
    $foreignpage= file_get_contents('http://www.foreignpage.html');
    // you could also use curl for more fancy internet queries or if http wrappers aren't active in your php.ini
    // parse $foreignpage for data that indicates your page should proceed
    echo $foreignpage; // or a portion of it as you parsed
    exit();  // this is very important  otherwise you'll get the contents of your own page returned back to you on each call
  }
}
?>

<html>
  mypage html content
  ...

<script>
var stopmelater= setInterval("getforeignurl('?urlget=doesntmatter')", 2000);

function getforeignurl(url){
  var handle= browserspec();
  handle.open('GET', url, false);
  handle.send();
  var returnedPageContents= handle.responseText;
  // parse page contents for what your looking and trigger javascript events accordingly.
  // use handle.open('GET', url, true) to allow javascript to continue executing. must provide a callback function to accept the page contents with handle.onreadystatechange()
}
function browserspec(){
  if (window.XMLHttpRequest){
    return new XMLHttpRequest();
  }else{
    return new ActiveXObject("Microsoft.XMLHTTP");
  }
}

</script>

ที่ควรทำ

จาวาสคริปต์ที่ถูกเรียกใช้ควรมี clearInterval (stopmelater)

แจ้งให้เราทราบว่าเหมาะกับคุณหรือไม่

เจอร์รี่


2
อย่างที่ฉันพูดไปก่อนหน้านี้ไม่ใช่เว็บเซิร์ฟเวอร์ที่ฉันส่งเสียงดัง นี่คือเซิร์ฟเวอร์เกม พวกเขาจะไม่ตอบสนองต่อคำขอ HTTP :(
Chuck Callebs

เพื่อนเพียงแค่แทนที่ file_get_contents ด้วย
Jerry Wickey

$ ip = $ _SERVER ['127.0.0.1']; exec ("ping -n 4 $ ip 2> & 1", $ output, $ retval); if ($ retval! = 0) {echo "no!"; } else {echo "ใช่!"; }
Jerry Wickey

4
นี่ไม่ใช่คำถาม PHP นี่คือคำถาม JavaScript ฉันไม่ได้ใช้ PHP
Chuck Callebs

1
โปรดอย่าใช้ลายเซ็นหรือแท็กไลน์ในโพสต์ของคุณมิเช่นนั้นจะถูกลบออก ดูคำถามที่พบบ่อยสำหรับรายละเอียด
Artemix

-13

คุณสามารถลองใช้ PHP ในหน้าเว็บของคุณ ... บางสิ่งเช่นนี้:

<html><body>
<form method="post" name="pingform" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<h1>Host to ping:</h1>
<input type="text" name="tgt_host" value='<?php echo $_POST['tgt_host']; ?>'><br>
<input type="submit" name="submit" value="Submit" >
</form></body>
</html>
<?php

$tgt_host = $_POST['tgt_host'];
$output = shell_exec('ping -c 10 '. $tgt_host.');

echo "<html><body style=\"background-color:#0080c0\">
<script type=\"text/javascript\" language=\"javascript\">alert(\"Ping Results: " . $output . ".\");</script>
</body></html>";

?>

นี่ไม่ใช่การทดสอบดังนั้นจึงอาจมีการพิมพ์ผิด ฯลฯ ... แต่ฉันมั่นใจว่าจะใช้งานได้ สามารถปรับปรุงได้ ...


5
ตามแท็กของ OP นี่เป็นคำถาม Ruby on Rails ดังนั้นการใช้ PHP ไม่ใช่วิธีแก้ปัญหาที่ดี
Tin Man

1
ที่จะไม่เริ่มต้นการโต้เถียงที่นี่ แต่ไม่ได้เป็นจุดของฟอรั่มนี้เพื่อช่วยหรือไม่
คริส

5
@Chris มันเป็น แต่คุณให้ความช่วยเหลือแบบไหนแก่ OP ที่ใช้ Ruby และ JS ในการสมัครของเขาโดยการส่งรหัส PHP?
biphobe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.