我正在使用php 5.2,我使用file_get_contents函数从url获取数据。这是5000的循环,我已经分为500个插槽,并设置这样的脚本。 对于500,它需要3个小时才能完成,因为对于某些网址来说它需要花费太多时间而对于某些网站来说它在1秒内就可以了。
如果网址超过30秒,我想要的是然后跳过去接下来。 我想在30秒后停止提取。
<?php
// Create the stream context
$context = stream_context_create(array(
'http' => array(
'timeout' => 1 // Timeout in seconds
)
));
// Fetch the URL's contents
echo date("Y-m-d H:i:s")."\n";
$contents = file_get_contents('http://example.com', 0, $context);
echo date("Y-m-d H:i:s")."\n";
// Check for empties
if (!empty($contents))
{
// Woohoo
// echo $contents;
echo "file fetched";
}
else
{
echo $contents;
echo "more than 30 sec";
}
?>
我已经完成了它不适合我,因为file_get_contents函数没有停止它会继续,那么现在只有事情我在30秒后没有得到结果但是时间它正在采取相同的你可以在输出中看到。 php的输出
2012-03-09 11:26:38 2012-03-09 11:26:40 超过30秒
答案 0 :(得分:1)
您可以设置HTTP超时。 (未经测试)
<?php
$ctx = stream_context_create(array(
'http' => array(
'timeout' => 30
)
));
file_get_contents("http://example.com/", 0, $ctx);
编辑:我不知道你为什么不使用这段代码。但是如果你不管理它来使用它,你可能还想试试CURL。这最终也可能更快(但我不知道这是否真的更快......)
如果这对你有用,你可以使用curl_setopt function设置CURLOPT_TIMEOUT
标志的超时时间。
答案 1 :(得分:0)
关于超时的php手册有一些信息。
http://php.net/manual/en/function.file-get-contents.php
在php 5.2.1中提到以下内容
ini_set('default_socket_timeout', 120);
$a = file_get_contents("http://abcxyz.com");
或添加或多或少相同的上下文。
// Create the stream context
$context = stream_context_create(array(
'http' => array(
'timeout' => 3 // Timeout in seconds
)
));
// Fetch the URL's contents
$contents = file_get_contents('http://abcxyz.com', 0, $context);`
第三种选择是使用PHP的fsockopen,它具有明确的超时选项
http://www.php.net/manual/en/function.fsockopen.php
$timeout = 2; // seconds
$fp = fsockopen($url, 80, $errNo, $errString, $timeout);
/* stops connecting after 2 seconds,
stores the error Number in $errNo,
the error String in $errStr */
为了节省编写大量代码,您可以将其用作快速检查主机是否已启动。
即:
if (pingLink($domain,$timeout)) {
file_get_contents()
}
function pingLink($domain,$timeout=30){
$status = 0; //default site is down
$file = fsockopen($domain,"r");
if ($file) {
$status = 1; // Site is up
fclose($file);
}
return $status;
}