Всем привет.
Ранее ответили что надо добавить немного измененный скрипт (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строк? а это не сильно будет грузить сервер?