我有大约295个域名来检查它们是否包含在其public_html目录中的文件。目前我正在使用PHP FTP功能,但脚本大约需要10分钟才能完成。我想缩短这个时间,我可以用什么方法来实现这个目标。
这是我的PHP代码
<?php
foreach($ftpdata as $val) {
if (empty($val['ftp_url'])) {
echo "<p>There is no URL provided</p>";
}
if (empty($val['ftp_username'])) {
echo "<p>The site ".$val['ftp_url']." dosent have a username</p>";
}
if (empty($val['ftp_password'])) {
echo "<p>The site ".$val['ftp_url']." dosent have a password</p>";
}
if($val['ftp_url'] != NULL && $val['ftp_password'] != NULL && $val['ftp_username'] != NULL) {
$conn_id = @ftp_connect("ftp.".$val['ftp_url']);
if($conn_id == false) {
echo "<p></br></br><span>".$val['ftp_url']." isnt live</span></p>";
}
else {
$login_result = ftp_login($conn_id, $val['ftp_username'], $val['ftp_password']);
ftp_chdir($conn_id, "public_html");
$contents = ftp_nlist($conn_id, ".");
if (count($contents) > 3) {
echo "<p><span class='green'>".$val['ftp_url']." is live</span><p>";
}
else {
echo "<p></br></br><span>".$val['ftp_url']." isnt live</span></p>";
}
}
}
}
?>
答案 0 :(得分:0)
如果是公开文件,您可以使用file_get_contents()
尝试抓取它。如果成功,你就会知道它在那里。如果它失败则不然。您无需下载整个文件。只需将其限制为少量字符,这样就可以快速而不浪费带宽。
$page = file_get_contents($url, NULL, NULL, 0, 100);
if ($page !== false)
{
// it exists
}
答案 1 :(得分:0)
使用卷曲。选项CURLOPT_NOBODY设置为true,请求方法设置为HEAD,不传输正文。
<?php
// create a new cURL resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://google.com/images/srpr/logo3w.png"); //for example google logo
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, true);
//get content
$content = curl_exec($ch);
// close
curl_close($ch);
//work with result
var_dump($content);
?>
在输出中,如果设置为“HTTP / 1.1 200 OK”,则文件/资源存在。
PS。尝试使用curl_multi_ *。它非常快。
答案 2 :(得分:0)
M,这实际上只是对AlexeyKa答案的解释。你的扫描谈话10分钟的原因是你正在序列化大约300个网络交易,每个交易平均花费大约2秒,300 x 2s给你总共10分钟的经过时间。
请求标题和没有正文的各种方法可以削减每笔交易的成本,但杀手就是您仍然一次运行一个查询。 curl_multi _ * 例程允许您执行的操作是并行运行批处理,例如30个批次的10个批次接近30秒。扫描PHP文档的用户提供的注释给出了这篇文章,解释了如何设置它:
Executing multiple curl requests in parallel with PHP and curl_multi_exec
另一个选项(如果你使用的是 php-cli )只是简单地开始,比如十个批处理线程,每个线程作为你当前的代码,但有自己的十分之一的子列表要检查的网站。
由于任何一种方法都主要是延迟限制而非特定的链路容量限制,因此时间应该大部分落在同一因素上。