如何从我的开发机器上运行的PHP脚本中检查我是否已连接到互联网?
我运行脚本使用wget下载一组文件(可能存在也可能不存在)。如果我在没有连接的情况下尝试下载,wget会继续进行下一个认为该文件不存在的下载。
答案 0 :(得分:75)
<?php
function is_connected()
{
$connected = @fsockopen("www.example.com", 80);
//website, port (try 80 or 443)
if ($connected){
$is_conn = true; //action when connected
fclose($connected);
}else{
$is_conn = false; //action in connection failure
}
return $is_conn;
}
?>
答案 1 :(得分:7)
你可以随时ping好'ol trusty google:
$response = null;
system("ping -c 1 google.com", $response);
if($response == 0)
{
// this means you are connected
}
答案 2 :(得分:6)
此代码在laravel 4.2 php框架中失败,内部服务器500错误:
<?php
function is_connected()
{
$connected = @fsockopen("www.some_domain.com", 80);
//website, port (try 80 or 443)
if ($connected){
$is_conn = true; //action when connected
fclose($connected);
}else{
$is_conn = false; //action in connection failure
}
return $is_conn;
}
?>
我不想强调自己弄清楚这一点,因此我尝试了这段代码,它对我有用:
function is_connected()
{
$connected = fopen("http://www.google.com:80/","r");
if($connected)
{
return true;
} else {
return false;
}
}
请注意:这是基于与google.com的连接不太容易失败的假设。
答案 3 :(得分:3)
为什么不从wget获取返回代码以确定下载是否成功?可以在wget exit status找到可能值列表。
另一方面,您也可以使用php的curl functions,然后您可以在PHP中进行所有错误跟踪。
答案 4 :(得分:1)
有各种因素决定互联网连接。例如,接口状态。但是,由于网络的性质,适当的配置并不意味着你有一个有效的连接。
因此,最好的方法是尝试下载您确定存在的文件。如果您成功,您可以按照后续步骤操作。如果没有,请重试一次然后失败。
尝试在目标主机上选择一个。如果不可能,请选择一些主要网站,如谷歌或雅虎。
最后,尝试检查wget返回的错误代码。我敢打赌,对于404-s和超时,这些是不同的。您可以在exec
调用中使用第三个参数:
string exec(string $ command [,array&amp; $ output [,int&amp; $ return_var]])
答案 5 :(得分:1)
/*
* Usage: is_connected('www.google.com')
*/
function is_connected($addr)
{
if (!$socket = @fsockopen($addr, 80, $num, $error, 5)) {
echo "OFF";
} else {
echo "ON";
}
}
答案 6 :(得分:1)
还要注意,fopen
和fsockopen
是不同的。 fsockopen
根据协议前缀打开套接字。 fopen
会通过HTTP打开文件或其他文件,例如流过滤器等。 最终,这会影响执行时间。
答案 7 :(得分:0)
您可以ping到热门网站或您想要访问的网站(例如www.google.nl),然后解析结果以查看您是否可以连接到该网站。
<?php
$ip = '127.0.0.1'; //some ip
exec("ping -n 4 $ip 2>&1", $output, $retval);
if ($retval != 0) {
echo "no!";
}
else
{
echo "yes!"; }
?>
答案 8 :(得分:0)
只需查看wget
的结果即可。状态代码4表示网络问题,状态代码8表示服务器错误(例如404)。这仅适用于按顺序为每个文件调用wget,而不是为所有文件调用一次。
您也可以将libcurl
与PHP一起使用,而不是调用wget。类似的东西:
foreach (...) {
$c = curl_init($url);
$f = fopen($filepath, "w")
curl_setopt($c, CURLOPT_FILE, $f);
curl_setopt($c, CURLOPT_HEADER, 0);
if (curl_exec($c)) {
if (curl_getinfo($c, CURLINFO_HTTP_CODE) == 200) {
// success
} else {
// 404 or something, delete file
unlink($filepath);
}
} else {
// network error or server down
break; // abort
}
curl_close($c);
}
答案 9 :(得分:0)
接受的答案对我不起作用。当互联网断开连接时,它抛出了一个php错误。所以我使用它进行了一些修改,如下所示:
if(!$sock = @fsockopen('www.google.com', 80))
{
echo 'Not Connected';
}
else
{
echo 'Connected';
}
答案 10 :(得分:0)
此功能可以处理您需要的内容
function isConnected()
{
// use 80 for http or 443 for https protocol
$connected = @fsockopen("www.example.com", 80);
if ($connected){
fclose($connected);
return true;
}
return false;
}
答案 11 :(得分:0)
您可以通过在类中添加它来使用它:
private $api_domain = 'google.com';
private function serverAliveOrNot()
{
if($pf = @fsockopen($this->api_domain, 443)) {
fclose($pf);
$_SESSION['serverAliveOrNot'] = true;
return true;
} else {
$_SESSION['serverAliveOrNot'] = false;
return false;
}
}