长期读者,第一次海报。我知道php很危险,这是我第一个使用它的BIG项目。
一些背景知识:
我有超过100万(是的,百万).html文件是从旧的新闻采集程序生成的。这些.html文件包含需要每天搜索的重要存档信息。我还没有到达其他服务器,这些服务器可能会有更多,所以2-3百万+不是不可能的。
我正在使用这些.html文件并将它们转移到mysql数据库中。至少,到目前为止,代码已经完成了几百个测试文件。我会在最后附上代码。
问题在.html文件存档时开始,并且它是生成无法更改的存档的框的功能,文件是否进入文件夹。他们像这样分解
档案>年>&月GT; file.html
所以一个例子是
archives>2002>05may>lots and lots of files.html archives>2002>06june>lots and lots of files.html archives>2002>07july>lots and lots of files.html
通过帮助和研究,我编写了代码来删除包含html2text和simple_html_dom的标记文件,并将每个标记的信息放在我的数据库的正确字段中,这非常有用。但是所有文件都需要移动到同一目录才能工作。同样,超过一百万甚至更多的其他服务器需要花费很长时间才能移动。我现在使用批处理文件来复制文件。
我的问题是:
我可以使用某种通配符来定义所有子目录,这样我就不必移动所有文件了,它们可以在各自的目录中显示数据吗?
我的代码顶部:
// Enter absolute path of folder with HTML files in it here (include trailing slash):
$directory = "C:\\wamp1\\www\\name\\search\\files\\";
子目录位于files
目录下。
在我搜索答案时,我已经看到了#34;你为什么要这样做?"或者其他问题询问目录中的.exe文件或.bat文件以及它们如何危险,所以不要这样做。我的问题只是针对这些html文件,所以没有任何东西被调用或运行,没有危险。
这是我将html剥离到数据库的代码。再次,效果很好,但我想跳过必须将所有文件移动到一个目录的步骤。
<?php
// Enter absolute path of folder with HTML files in it here (include trailing slash):
$directory = "C:\\wamp1\\www\\wdaf\\search\\files\\";
// Enter MySQL database variables here:
$db_hostname = "localhost";
$db_username = "root";
$db_password = "password";
$db_name = "dbname";
$db_tablename = "dbtablename";
/////////////////////////////////////////////////////////////////////////////////////
// Include these files to strip all characters that we don't want
include_once("simple_html_dom.php");
include_once("html2text.php");
//Connect to the database
mysql_connect($db_hostname, $db_username, $db_password) or trigger_error("Unable to connect to the database host: " . mysql_error());
mysql_select_db($db_name) or trigger_error("Unable to switch to the database: " . mysql_error());
//scan the directory and look for all the htmls files
$files = scandir($directory);
for ($filen = 0; $filen < count($files); $filen++) {
$html = file_get_html($directory . $files[$filen]);
// first check if $html->find exists
if (method_exists($html,"find")) {
// then check if the html element exists to avoid trying to parse non-html
if ($html->find('html')) {
//Get the filename of the file from which it will extract
$filename = $files[$filen];
//define the path of the files
$path = "./files/";
//Combine the patha and filename
$fullpath = $path . $filename;
// Get our variables from the HTML: Starts with 0 as the title field so use alternate ids starting with 1 for the information
$slug = mysql_real_escape_string(convert_html_to_text($html->find('td', 8)));
$tape = mysql_real_escape_string(convert_html_to_text($html->find('td', 9)));
$format0 = mysql_real_escape_string(convert_html_to_text($html->find('td', 10)));
$time0 = mysql_real_escape_string(convert_html_to_text($html->find('td', 11)));
$writer = mysql_real_escape_string(convert_html_to_text($html->find('td', 12)));
$newscast = mysql_real_escape_string(convert_html_to_text($html->find('td', 13)));
$modified = mysql_real_escape_string(convert_html_to_text($html->find('td', 14)));
$by0 = mysql_real_escape_string(convert_html_to_text($html->find('td', 15)));
$productionCues = mysql_real_escape_string(convert_html_to_text($html->find('td', 16)));
$script = mysql_real_escape_string(convert_html_to_text($html->find('td', 18)));
// Insert variables into a row in the MySQL table:
$sql = "INSERT INTO " . $db_tablename . " (`path`, `fullpath`, `filename`, `slug`, `tape`, `format0`, `time0`, `writer`, `newscast`, `modified`, `by0`, `productionCues`, `script`) VALUES ('" . $path . "', '" . $fullpath . "', '" . $filename . "', '" . $slug . "', '" . $tape . "', '" . $format0 . "', '" . $time0 . "', '" . $writer . "', '" . $newscast . "', '" . $modified . "', '" . $by0 . "', '" . $productionCues . "', '" . $script . "');";
$sql_return = mysql_query($sql) or trigger_error("Query Failed: " . mysql_error());
}
}
}
?>
提前致谢, 麦克
答案 0 :(得分:0)
只是想更新这篇文章,回答我的问题很有效。在一些帮助下,我们发现scandir递归使用来创建一个数组是可行的。 我以为我会发布这个,所以如果其他人想要做类似的事情,他们将不会看得太远!我知道我喜欢看到答案!
代码来自第二个用户提供的注释,只有一些修改:http://php.net/manual/en/function.scandir.php
所以在上面的代码中,我替换了
//scan the directory and look for all the htmls files
$files = scandir($directory);
for ($filen = 0; $filen < count($files); $filen++) {
$html = file_get_html($directory . $files[$filen]);
与
function import_dir($directory, $db_tablename) {
$cdir = scandir($directory);
foreach ($cdir as $key => $value)
{
if (!in_array($value,array(".","..")))
{
if (is_dir($directory . DIRECTORY_SEPARATOR . $value))
{
// Item in this directory is sub-directory...
import_dir($directory . DIRECTORY_SEPARATOR . $value,$db_tablename);
}
else
// Item in this directory is a file...
{
$html = file_get_html($directory . DIRECTORY_SEPARATOR . $value);
然后对于文件名,替换
//Get the filename of the file from which it will extract
$filename = $files[$filen];
//define the path of the files
$path = "./files/";
//Combine the patha and filename
$fullpath = $path . $filename;
带
//Get the filename of the file from which it will extract
$filename = mysql_real_escape_string($value);
//define the path of the files
$path = mysql_real_escape_string($directory . DIRECTORY_SEPARATOR);
//Combine the patha and filename
$fullpath = $path . $value;
感谢那些回答的人!
麦克
答案 1 :(得分:-1)
我不确定在你的PHP查询超时之前还需要多长时间,但是有一个内置函数RecursiveDirectoryIterator,听起来它可能对你有用。