有可能加快phpQuery的速度吗?

时间:2011-11-10 18:23:31

标签: php performance phpquery

我正在尝试读取一个12MB +文件,其中包含一个大型HTML表格,如下所示:

<table>
    <tr>
        <td>a</td>
        <td>b</td>
        <td>c</td>
        <td>d</td>
        <td>e</td>
    </tr>
    <tr>
        <td>a</td>
        <td>b</td>
        <td>c</td>
        <td>d</td>
        <td>e</td>
    </tr>
    <tr>..... up to 20,000+ rows....</tr>
</table>

现在我正在抓它:

<?

require_once 'phpQuery-onefile.php';

$d = phpQuery::newDocumentFile('http://localhost/test.html');

$last_index = 20000;

for ($i = 1; $i <= $last_index; $i++)
{
    $set['c1']  = $d['tr:eq('.$i.') td:eq(0)']->text();
    $set['c2']  = $d['tr:eq('.$i.') td:eq(1)']->text();
    $set['c3']  = $d['tr:eq('.$i.') td:eq(2)']->text();
    $set['c4']  = $d['tr:eq('.$i.') td:eq(3)']->text();
    $set['c5']  = $d['tr:eq('.$i.') td:eq(4)']->text();
}

// code to insert to db here... 

?>

我的基准测试表明,刮取并向数据库插入1,000行需要大约5.25小时。鉴于这些数据,只需要5天就能完成整个20,000多行。

我的本​​地计算机正在运行:

  • XAMPP
  • 赢7
  • proc,i3 2100 3.1GHz
  • ram,G.Skill RipJaws X 4GB dual
  • 硬盘,旧SATA

有什么方法可以加快这个过程吗?也许我正在以错误的方式刮它?请注意,该文件可在本地访问,因此我使用了http://localhost/test.html

解决方案稍快:

for ($i = 1; $i <= $last_index; $i++)
{
    $r = $d['tr:eq('.$i.')'];

    $set['c1']  = $r['td:eq(0)']->text();
    $set['c2']  = $r['td:eq(1)']->text();
    $set['c3']  = $r['td:eq(2)']->text();
    $set['c4']  = $r['td:eq(3)']->text();
    $set['c5']  = $r['td:eq(4)']->text();
}

// code to insert to db here... 

?>

1 个答案:

答案 0 :(得分:2)

我从未使用过phpQuery,但这看起来像是一个解析大文档的非常次优解决方式:phpQuery每次都必须遍历整个事情你使用tr:eq('.$i.')加载一行。

更简单(也可能更快)的方法是简单地遍历文档的每个tr元素,并在foreach循环中处理每个元素的子元素。你甚至不需要phpQuery。

有关各种解决方案,请参阅How to Parse XML File in PHP