Я разрабатываю приложение, которое, проще говоря, основано на нишевой поисковой системе. Внутри приложения у меня есть функция crawl(), которая сканирует веб-сайт, а затем использует функцию collectData() для хранения правильных данных с сайта в таблице «продукты», как описано в этой функции. Посещенные страницы хранятся в базе данныхCakePHP Утечка памяти сканера CakePHP
Сканер работает очень хорошо, как описано, за исключением двух вещей: таймаута и памяти. Мне удалось исправить ошибку тайм-аута, но память остается. Я знаю, что просто увеличение memory_limit на самом деле не устраняет проблему.
Эта функция запускается при посещении «EXAMPLE.COM/products/crawl».
Является ли утечка памяти неизбежной с помощью сканера PHP Web? ИЛИ есть что-то, что я делаю неправильно/не делаю.
Заранее спасибо. (КОД НИЖЕ)
function crawl() {
$this->_crawl('http://www.example.com/','http://www.example.com');
}
/***
*
* This function finds all link in $start and collects
* data from them as well as recursively crawling them
*
* @ param $start, the webpage where the crawler starts
*
* @ param $domain, the domain in which to stay
*
***/
function _crawl($start, $domain) {
$dom = new DOMDocument();
@$dom->loadHTMLFile($start);
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");//get all <a> elements
for ($i = 0; $i < $hrefs->length; $i++) {
$href = $hrefs->item($i);
$url = $href->getAttribute('href'); // get href value
if(!(strpos($url, 'http') !== false)) { //check for relative links
$url = $domain . '/' . $url;
}
if($this->Page->find('count', array('conditions' => array('Page.url' => $url))) < 1 && (strpos($url, $domain) !== false)) { // if this link has not already been crawled (exists in database)
$this->Page->create();
$this->Page->set('url',$url);
$this->Page->set('indexed',date('Y-m-d H:i:s'));
$this->Page->save(); // add this url to database
$this->_collectData($url); //collect this links data
$this->_crawl($url, $domain); //crawl this link
}
}
}
Благодарим Вас за отзыв. Какие-нибудь советы по реализации этого? Концепция относительно проста, но я не уверен в создании отдельного экземпляра. Могу ли я, например, вызвать EXAMPLE.COM/products/crawl из сценария для запуска отдельного экземпляра? – KTastrophy
Нет, вам лучше работать с заданиями cron или демоном. На SO есть много потоков, чтобы вы начали: http://stackoverflow.com/search?q=php+queue+worker – deceze