[QUOTE]
Алик Балданов написал:
Всем привет.
Ранее ответили что надо добавить немного измененный скрипт (CSaleUser::DeleteOldAgent(5);) удаления старых записей из корзины, на CRON с интервалом выполнения 10 минут.
[CODE] // Класс для очистки таблиц b_sale_basket, b_sale_basket_props, b_sale_fuser
class CCustomBasketDeleteOld
{
// Максимальное количество строк, удаляемых за один запуск агента
const ROW_DELETE_LIMIT = 300 ;
// Функция повторяет CSaleBasket::DeleteOld, но возвращает количество удаленных из b_sale_fuser строк
function DeleteOld ( $nDays )
{
if (!CModule::IncludeModule( 'sale' )) return false ;
global $DB ;
$rowCount = 0 ;
$nDays = IntVal( $nDays );
//Старый вариант - выбирает всех старых покупателей из b_sale_fuser
/***
$strSql =
"SEL ECT ID ".
"FR OM b_sale_fuser ".
"WHERE TO_DAYS(DATE_UPDATE)<(TO_DAYS(NOW())-".$nDays.") LIMIT ".ROW_DELETE_LIMIT;
***/
//Новый вариант - выбирает покупателей из b_sale_fuser, которые не зарегистрированы и не делали заказ
$strSql =
"SELECT f.ID " .
"FR OM b_sale_fuser f " .
"LEFT JOIN b_sale_order o ON (o.USER_ID = f.USER_ID) " .
"WH ERE " .
" TO_DAYS(f.DATE_UPDATE)<(TO_DAYS(NOW())-" . $nDays . ") " .
" AND o.ID is null " .
" AND f.USER_ID is null " .
"LIMIT " .CCustomBasketDeleteOld::ROW_DELETE_LIMIT;
$db_res = $DB ->Query( $strSql , false , "File: " . __FILE__ . "<br>Line: " . __LINE__ );
while ( $ar_res = $db_res ->Fetch())
{
CSaleBasket::DeleteAll( $ar_res [ "ID" ], false );
CSaleUser::Delete( $ar_res [ "ID" ]);
$rowCount ++;
}
return $rowCount ++;
}
// Функция агента в целом повторяет CSaleBasket::DeleteOldAgent, но
// измеряет период исполнения агента в зависимости от результата исполнения DeleteOld
// Для точной привязки и быстрого исполнения в параметрах также передается ID агента
function DeleteOldAgent ( $nDays , $agentID = 0 )
{
$nDays = IntVal( $nDays );
// Получаем параметры агента по его ID, названию класса:функции или выходим
if ( $arAgent = CAgent::GetById( $agentID )->Fetch())
{
$currentInterval = $arAgent [ "AGENT_INTERVAL" ];
}
elseif ( $arAgent = CAgent::GetList( array (), array ( "NAME" => "CCustomBasketDeleteOld::DeleteOldAgent%" ))->Fetch())
{
$currentInterval = $arAgent [ "AGENT_INTERVAL" ];
$agentID = $arAgent [ "ID" ];
}
else
{
return false ;
}
// Если нет глобального пользователя, заводим временный объект
if (! isset ( $GLOBALS [ "USER" ]) || !is_object( $GLOBALS [ "USER" ]))
{
$bTmpUser = True ;
$GLOBALS [ "USER" ] = new CUser;
}
$nRowsDeleted = CCustomBasketDeleteOld::DeleteOld( $nDays );
// Если количество удаленных строк равно максимуму - уменьшаем период запуска агента, иначе увеличиваем
if ( $nRowsDeleted == CCustomBasketDeleteOld::ROW_DELETE_LIMIT)
{
$currentInterval = max(floor( $currentInterval / 2 ), 60 ); // период не менее одной минуты
CAgent::Update( $agentID , array ( "AGENT_INTERVAL" => $currentInterval )); // обновляем агента
}
elseif ( $nRowsDeleted * 2 <= CCustomBasketDeleteOld::ROW_DELETE_LIMIT)
{
$currentInterval = min( $currentInterval * 2 , 86400 ); // период не более суток
CAgent::Update( $agentID , array ( "AGENT_INTERVAL" => $currentInterval )); // обновляем агента
}
// global $pPERIOD; // Зачем это было тут - не ясно
// $pPERIOD = 8*60*60;
// Удаляем временный объект пользователя
if ( $bTmpUser )
{
unset ( $GLOBALS [ "USER" ]);
}
return "CCustomBasketDeleteOld::DeleteOldAgent($nDays, $agentID);" ;
}
[/CODE]
Получается что каждые 10 минут будет запускаться скрипт и удалять по 300строк? а это не сильно будет грузить сервер?[/QUOTE]
Это рабочий вариант?