减少php守护程序内存使用
你能帮我找出是什么原因导致这个进程的内存使用量达到500MB吗。 它基本上是一个html页面下载程序。 尽管这个过程是稳定的(并且没有超过这个限制),但它的目的是在低性能的机器上使用,我不满意。 mysql表“Sites”的大小为170MB。 遵循脚本代码。 提前谢谢减少php守护程序内存使用,php,zend-framework,memory-management,daemon,Php,Zend Framework,Memory Management,Daemon,你能帮我找出是什么原因导致这个进程的内存使用量达到500MB吗。 它基本上是一个html页面下载程序。 尽管这个过程是稳定的(并且没有超过这个限制),但它的目的是在低性能的机器上使用,我不满意。 mysql表“Sites”的大小为170MB。 遵循脚本代码。 提前谢谢 function start() { try { global $log; $db = getConnection(); Zend_Db_Table::setDefaultAdapter($db);
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());
}
}
函数开始(){
试一试{
全球$log;
$db=getConnection();
Zend_Db_Table::setDefaultAdapter($Db);
$log->logInfo(“记录器启动”);
而(1){
$sitesTable=新的Zend_Db_表(“站点”);
$rowset=$sitesTable->fetchAll();
foreach($rowset为$row){
如果(time()>=(strottime($row->lastUpdate)+$row->pollingHours*60*60)){
db_updateHtml($row);
}
}
}
}捕获(例外$e){
全球$log;
$log->logError($e->getMessage());
}
}
函数db_updateHtml($siteRecord){
试一试{
if($siteRecord instanceof Zend\u Db\u Table\u行){
$rowwithConnection=$siteRecord;
$url=$siteRecord->url;
$idSite=$siteRecord->idSite;
$crawler=新爬虫();
$sitesTable=新的Zend_Db_表(“站点”);
//$rowwithConnection=$sitesTable->fetchRow(
//$sitesTable->select()->where('idSite=?',$idSite));
$newHtml=HtmlDbEncode($crawler->get_web_page($url));
if(strlen($newHtml)<10){
全球$log;
$log->logError(“下载失败:url:$url\t idsite:$idsite”);
}
如果($rowwithConnection->isChecked!=0){
$rowwithConnection->oldHtml=$rowwithConnection->newHtml;
$rowwithConnection->isChecked=0;
}
$rowwithConnection->newHtml=$crawler->获取网页($url);
$rowwithConnection->lastUpdate=日期(“Y-m-d H:i:s”);
//$rowwithConnection->diffHtml=getDiff($rowwithConnection->oldHtml,$rowwithConnection->newHtml,false,$rowwithConnection->minLengthChange);
$rowwithConnection->diffHtml=getDiffFromRecord($rowwithConnection,false,$rowwithConnection->minLengthChange);
/*如果(strlen($rowwithConnection->diffHtml)>30){
$rowwithConnection->lastChanged=$rowwithConnection->lastUpdate;
} */
$rowwithConnection->save();
}否则{
$log->logCrit(“siteRecord未初始化”);
}
}捕获(例外$e){
全球$log;
$log->logError($e->getMessage());
}
}
函数getDiffFromRecord($row,$force=false,$minLengthChange=100){
if($Zend\u Db\u Table\u行的行实例){
需要_once'/var/www/diff/library/finediff.php';
包括_once'/var/www/diff/library/Text/diff.php';
$diff=新的AndreaDiff();
$differences=$diff->getDiff($row->oldHtml,$row->newHtml);
如果($diff->isChanged($minLengthChange)| |$force){
$row->lastChanged=$row->lastUpdate;
$row->isChecked=false;
回报(差额);
}
}
返回null;
}
函数getConnection(){
试一试{
$pdoParams=数组(
PDO::MYSQL\u ATTR\u USE\u BUFFERED\u QUERY=>true
);
$db=新的Zend_db_适配器_Pdo_Mysql(阵列)(
“主机”=>“127.0.0.1”,
'用户名'=>'根',
“密码”=>“管理员”,
“dbname”=>“diff”,
“驱动程序选项”=>$pdoParams
));
返回$db;
}捕获(例外$e){
全球$log;
$log->logError($e->getMessage());
}
}
1)尝试使用fetch方法,而不是fetchAll:
foreach($sitesTable->fetch() as $row){
//...
}
2) 尝试取消设置所有存储html代码的变量(如果您将其保存在内存中),在最后一次迭代中,我假设变量$rowwithConnection
将包含html代码
当我需要配置文件php应用程序时,我使用它将为您节省大量时间。祝你好运