如何消除单个PHP语句的警告提示?

3

我想检查一个特定的域名是否在线。我的想法是使用file_get_contents()读取内容,并检查它是否成功或失败。

$line = file_get_contents('http://www.domain.com'); 
if ($line==false)
    echo 'Domain is dead';
else
    echo 'Domain is live';

我的问题是,当它失败时,会在网页上输出警告。通过 PHP 配置关闭所有警告不是一个选项,因为我需要它们在其他部分中。有没有办法使这个语句不输出警告?

或者有没有更好的方法检查域名是否在线?我尝试使用 checkdnsrr(),但它非常缓慢。


2
请查看错误控制运算符的文档:http://us2.php.net/manual/zh/language.operators.errorcontrol.php,相关问题请参考:http://stackoverflow.com/a/1454592/138383。 - Aaron W.
@DanielS 不,实际上这不是你需要的。人们只是回答了你认为你需要的东西,而没有看到你实际上想要做什么。 - Gordon
我不想在这里搞事情,但永远不要使用错误抑制运算符。请查看此链接(https://dev59.com/W3E95IYBdhLWcg3whOLK#2280413)或此链接(https://dev59.com/HXNA5IYBdhLWcg3wZ81R#982045)。 - CBusBus
@Gordon,实际上这就是我所需要的。我不会复制粘贴任何答案,但现在我知道要查看PHP手册中哪些功能可用。之后,我会学习材料,得出自己的结论,并以最合适的方式将其应用于我的项目。 - Daniel Scocco
使用错误日志记录而不是直接显示它们。此外,您还需要决定级别。除此之外,您可以使用可用作 PHP 扩展的 curl 库更细致地控制与主机的连接。您可以控制连接超时等,以防止脚本长时间等待。对于这两个问题,您应该寻找已经存在的问题/答案,这些答案应该会提供更多详细信息(而不是快速抛出的答案)。 - hakre
@DanielS 我建议你看一下 http://php.net/manual/en/ref.network.php。错误抑制基本上就是在问如何不叫喊地朝自己的脚开枪。 - Gordon
7个回答

13

使用@符号来抑制警告:

$line = @file_get_contents('http://www.domain.com');
你可以使用 fopen 函数来检查它是否为 null 值:
 $fp = fopen('http://www.domain.com', 'r');
 if($fp) { 
    echo 'Domain is live'; 
 }

1
是的,我认为在这种情况下fopen()会更好用。谢谢! - Daniel Scocco

5

4
您可以使用@符号来忽略PHP错误。 PHP:错误控制运算符 请注意关于使用@的PHP手册中的评论:

请注意,使用@是非常慢的,因为PHP在以这种方式禁止错误时会产生开销。 这是速度和方便之间的权衡。


2

试试这个:

$line = @file_get_contents('http://www.domain.com'); 

0
尽可能避免使用错误抑制运算符(@)。 如果您尝试以下代码,在您的情况下仍然存在问题。
if ( fopen('http://www.google.com/', 'r')) {
     $line = file_get_contents( 'http://www.google.com/' ); 
     if ( $line==false )
          echo 'Domain is dead';
      else
          echo 'Domain is live';
}
else {
    echo 'Domain not exists';
}

如果该域名不存在,则会再次出现警告。警告:fopen():php_network_getaddresses:gethostbyname失败。对于您的情况,您可以使用@。我还认为这不是检查域名是否存活的最佳方法。我找到了一个脚本,请尝试一下。

https://github.com/HelgeSverre/Domain-Availability


0

出于速度考虑,您不应完全下载该页面。只需使用HEAD方法进行检查:

$url = 'http://example.com/';
$code = FALSE;
$options['http'] = array(
    'method' => "HEAD", 
    'follow_location' => 0
);
$context = stream_context_create($options);
file_get_contents($url, NULL, $context);
if (!empty($http_response_header))
    echo 'Domain is live';
else echo 'Domain is dead';

请看https://hakre.wordpress.com/2011/09/17/head-first-with-php-streams/



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接