0

このプロセスが500MBのメモリ使用量に達する原因を見つけるのを手伝っていただけませんか。基本的にはhtmlページダウンローダーです。プロセスが安定している(そしてその制限を超えない)という事実にもかかわらず、それは性能の低いマシンで使用することを意図しており、私は満足していません。mysqlテーブル「サイト」のサイズは170MBです。スクリプトコードに従います。前もって感謝します。

function start() {
try {
    global $log;
    $db = getConnection();
    Zend_Db_Table::setDefaultAdapter($db);
    $log->logInfo("logger start");
    while (1) {
        $sitesTable = new Zend_Db_Table('Sites');
        $rowset = $sitesTable->fetchAll();
        foreach ($rowset as $row) {
            if (time() >= (strtotime($row->lastUpdate) + $row->pollingHours * 60 * 60)) {
                db_updateHtml($row);
            }
        }
    }
} catch (Exception $e) {
    global $log;
    $log->logError($e->getMessage());
}
}

    function db_updateHtml($siteRecord) {
        try {
            if ($siteRecord instanceof Zend_Db_Table_Row) {
                $rowwithConnection = $siteRecord;
                $url = $siteRecord->url;

                $idSite = $siteRecord->idSite;
                $crawler = new Crawler();
                $sitesTable = new Zend_Db_Table('Sites');
                //$rowwithConnection = $sitesTable->fetchRow(
                  //      $sitesTable->select()->where('idSite = ?', $idSite));
                $newHtml = HtmlDbEncode($crawler->get_web_page($url));


                if (strlen($newHtml) < 10) {
                    global $log;
                    $log->logError("Download failed for: url: $url \t idsite: $idSite ");
                }
                if ($rowwithConnection->isChecked != 0) {
                    $rowwithConnection->oldHtml = $rowwithConnection->newHtml;
                    $rowwithConnection->isChecked = 0;
                }
                $rowwithConnection->newHtml = $crawler->get_web_page($url);
                $rowwithConnection->lastUpdate = date("Y-m-d H:i:s");
                //$rowwithConnection->diffHtml = getDiff($rowwithConnection->oldHtml, $rowwithConnection->newHtml, false, $rowwithConnection->minLengthChange);
                $rowwithConnection->diffHtml = getDiffFromRecord($rowwithConnection, false, $rowwithConnection->minLengthChange);
                /* if (strlen($rowwithConnection->diffHtml) > 30) {
                  $rowwithConnection->lastChanged = $rowwithConnection->lastUpdate;
                  } */
                $rowwithConnection->save();
            } else {
                $log->logCrit("siteRecord is uninitialized");
            }
        } catch (Exception $e) {
            global $log;
            $log->logError($e->getMessage());
        }
    }

    function getDiffFromRecord($row, $force = false, $minLengthChange = 100) {
        if ($row instanceof Zend_Db_Table_Row) {
            require_once '/var/www/diff/library/finediff.php';
            include_once '/var/www/diff/library/Text/Diff.php';
            $diff = new AndreaDiff();
            $differences = $diff->getDiff($row->oldHtml, $row->newHtml);
            if ($diff->isChanged($minLengthChange) || $force) {
                $row->lastChanged = $row->lastUpdate;
                $row->isChecked = false;
                return ($differences);
            }
        }
        return null;
    }

    function getConnection() {
        try {
            $pdoParams = array(
                PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
            );
            $db = new Zend_Db_Adapter_Pdo_Mysql(array(
                        'host' => '127.0.0.1',
                        'username' => 'root',
                        'password' => 'administrator',
                        'dbname' => 'diff',
                        'driver_options' => $pdoParams
                    ));
            return $db;
        } catch (Exception $e) {
            global $log;
            $log->logError($e->getMessage());
        }

    }
4

1 に答える 1

0

1) fetchAll ではなく、fetch メソッドを使用してみてください:

foreach($sitesTable->fetch() as $row){
   //...
}

2)htmlコードを保存するすべての変数の設定を解除しようとします(メモリに保存する場合)。最後の反復で、変数$rowwithConnectionにはhtmlコードが含まれると思います。

プロファイル php アプリケーションが必要な場合は、 xhprofを使用すると、多くの時間を節約できます。幸運を!

于 2012-10-02T07:36:19.280 に答える