2009-09-10 3 views
2

리눅스에서 명령 줄 PHP를 사용하여 블루투스 전화 접속 연결을 열었습니다. 인터넷 연결이 활성화되어 있는지 확인하려면 quick'n'dirty 방법이 필요합니다. 음, 더러워서는 안되지만, 빨리 받아 주시면 감사하겠습니다. :) exec을 사용하여 외부 명령을 실행하는 것은 문제가되지 않습니다.리눅스에서 명령 줄 PHP로 인터넷 연결 확인하기

저는 안정적인 서버 (예 : Google)에 핑 소리가 들리 겠지만, 더 좋은 방법이 있는지 궁금합니다. 어쩌면 ifconfig의 출력을 확인 하시겠습니까? ("서버에 연결할 수 없습니다", "연결됨")와 같은 명확한 응답으로 응답하는 명령이 당연히 최선일 것입니다. 아이디어?

답변

10

외부 서버에 의존하지 않고 작동하는 것을 원할 경우 기본 경로를 확인할 수 있습니다. 이 0을의 경우

/sbin/route -n | grep -c '^0\.0\.0\.0' 

, 당신은 외부 세계에 접근 할 수 없습니다 :이 명령은 기본 경로의 수를 인쇄합니다.

+0

이것은 매우 흥미 롭습니다! 이것은 서버에 액세스하는 것보다 훨씬 나은 접근 방법입니다. 나는 그것을 시도하고, 잘 작동합니다. 감사! –

+0

굉장해 :) – Sangimed

2

일부 외부 웹에 wget을 사용하면 타임 아웃과 같은 것을 사용할 수 있습니다. 타임 아웃이 성공하지 못하면 1을 반환하고 타임 아웃 내에 있으면 0을 반환합니다. 또한 은 제안한 용도로 사용할 수 있습니다. 당신이 간부를 사용하여 마음에 드시면

+0

내'wget'에는'-W' 옵션이없는 것 같습니다. 타임 아웃은 대신'-T'로 정의됩니다. 또한'exec ('wget www.google.com -T 1')'을 사용하여 0 또는 1을 반환하는 방법은 빈 문자열을 반환합니다. –

+1

Ups, 죄송합니다, 예 - 이건 -T입니다. 나는 그 순간에 ping의 옵션을보고있었습니다. :-( 다음을 시도해보십시오. exec ("wget ​​www.google.com -T 1; echo $?"). 또한 몇 가지 지연이나 지연으로 인한 잘못된 보고서를 피하기 위해 몇 초로 제한 시간을 늘리는 것이 좋습니다. – igustin

5

, 나는 fsockopen를 사용하여 당신은 또한 순수 PHP에서 할 아마 수

exec("ping -c 1 $ip 2>&1", $output, $retval); 

(IP에서) ISP의 DNS 서버를 ping (인터넷 연결을 확인하는) 것 www.google.com (wget/curl 'scenario')에서 페이지를 가져오고 가져올 수 있습니다.

if(!fsockopen("www.google.com", 80)) { 
    echo "Could not open www.google.com, connection issues?"; 
} 
+1

PHP의 내부 HTTP 기능에 대한 좋은 지적. 어쨌든 ping을 사용하여 wget보다 연결 테스트에 더 적합하다고 느껴지거나 PHP로 무언가를 가져 오는 것을 시도해 보았습니다. '-c 1'을 사용하면 멋지고 빠르게 수행됩니다 ...'2> & 1'은 터미널 대신에 exec의'$ output'에 출력을 보냅니다. 그러나, 나는 그것에 익숙하지 않고, google에 조금 어려워. .. 거기의 논리는 무엇 이냐? –

+1

http://tldp.org/LDP/abs/html/io-redirection.html에서 모든 내용을 읽을 수 있습니다. 더 빠른 설명 : http://osgeek.blogspot.com/2009/07/redirection-and-2.html – ChristopheD

+0

@ChristopheD : 아, 좋아. 따라서 stderr (2)를 stdout (1)이가는 곳 (PHP의'exec')으로 리디렉션합니다. 링크 주셔서 감사합니다! –

3

난 당신이 뭔가를 사용할 수 있습니다 .. 너무 을 사용하는 것이 좋습니다 것은 : // 페이지 당신의 URL에 : 당신은 wget과 사용하기로 결정한 경우

exec("ping -c 4 www.google.com", $output, $status); 
if ($status == 0) { 
    // ping succeeded, we have connection working 
} else { 
    // ping failed, no connection 
} 

, HTTP 씁니다 기억 다운로드하고 싶습니다. "-q -O -"를 옵션에 추가하여 파일에 저장하지 않으려 고합니다.

또 다른 방법은 PHP에서 컬/소켓을 사용하는 것입니다. 나는 그것이 당신이 찾고있는 가장 빠른 방법이 아니라고 생각합니다.

0

인터넷에 연결되어 있습니까? 이게 뭐야? 제발, "인터넷 연결"을 정의하십시오! 사용자가 연결되어 있는지 여부를 확인하고 싶은 경우 - 어디로 연결 되나요? 회사 서버로? 음, 핑 (ping)! 아니면 어디로? 정면, google.com을 ping하지만 다른 모든 사이트가 시스템 관리자에 의해 금지 될 수 있기 때문에 사용자가 Google 서버에 연결되어 있는지 만 확인합니다.

일반적으로 네트워크 라우팅은 어떤 종류의 "인터넷"에 연결되어 있는지 확인할 수없는 도메인입니다. 특정 서버 만 검사 할 수 있습니다.

+0

네, 이론적으로 인터넷 연결이나 intenet 자체가 실제로 존재하지 않는다는 것을 알고 있습니다. 나는이 문제를 설명 할 수있는보다 간단한 방법이 있었기 때문에 내 문제에 대한 다섯 가지 paragraps를 작성하고 싶지 않았습니다. 실제로 이것은 0,00001 %의 경우와 같은 것으로 만 문제가됩니다. 내가 연결되지 않은 컴퓨터를 가지고있을 때, 우리 모두는 컴퓨터를 "인터넷"에 연결하는 것이 무엇을 의미하는지 알고 있습니다. 예, 확실한 네트워크 문제 또는 액세스 제한이있는 경우 'route'를 사용하여 허용 된 답변이 작동하지 않을 것이라고 확신합니다.하지만 9999999 %로 해결할 것입니다. –

+0

나는 확률을 0.1 %로 올릴 것이고, 그것이 일어난다면 그것은 아주 심하게 갈 수있다. PC가 인터넷에 연결되어 있다고 가정하되 연결은 없습니다 (ISP의 문제). * 어쨌든 이러한 상황을 처리해야합니다. (사용자가 정상적인 메시지를 볼 수 있도록 "오프라인으로 작업"을 제공하므로 서버에 연결하려는 무의미한 시도가 중단됩니다.) 그러나 라우팅 정보에 의존하는 경우, 라우트가 정상이면 인터넷이 정상적으로 작동한다는 잘못된 인식에 빠질 수 있습니다. 충돌, 버그보고 및 손실 된 데이터가 보장됩니다. –

+0

@Pavel : 좋아, 어쩌면 백만 분의 1 정도가 상당히 극단적이었을 것입니다. :) 그러나 나는 당신이 데이터 손실과 충돌에 대해 이야기하고 있기 때문에 내가 이것을 위해 무엇을 사용하는지 오해한다고 생각합니다. 어떤 * 특정 * 연결에 대해서도이 방법을 사용하지 않을 것입니다. 컴퓨터 상태에 대해 일반적인 것을 이해하는 것은 쉽지 않은 일이며, 나는 혼자만 사용하고 있습니다. 'route'를 확인하면 연결이 활성화되었는지 여부와 재 연결 시도가 필요한지 여부를 결정하는 데 도움이됩니다. 대부분의 경우 신뢰할 만하 며, 그렇지 않은 경우 어쨌든 문제를 조금 더 깊이 살펴야합니다. –