- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/classes/mysql/user_counter.php
- Класс: CUserCounterPage
- Вызов: CUserCounterPage::checkSendCounter
static function checkSendCounter()
{
global $DB, $USER;
$connection = BitrixMainApplication::getConnection();
if(!$connection->lock('counterpull'))
{
return;
}
$counterPageSize = (int)CAllUserCounterPage::getPageSizeOption(100);
$userSQL = "SELECT USER_ID FROM b_user_counter WHERE SENT='0' GROUP BY USER_ID LIMIT ".$counterPageSize;
$res = $DB->Query($userSQL, false, "FILE: ".__FILE__."
LINE: ".__LINE__);
$pullMessage = [];
$userIdList = [];
while ($row = $res->fetch())
{
$userIdList[] = (int)$row["USER_ID"];
}
if (
is_object($USER)
&& $USER->isAuthorized()
&& count($userIdList) >= $counterPageSize
&& !in_array((int)$USER->getId(), $userIdList, true)
)
{
$userIdList[] = (int)$USER->getId();
}
$userString = '';
foreach($userIdList as $userId)
{
$userString .= ($userString <> ''? ', ' : '').$userId;
}
if ($userString <> '')
{
$arSites = array();
$by = '';
$order = '';
$res = CSite::GetList($by, $order, array("ACTIVE" => "Y"));
while($row = $res->Fetch())
{
$arSites[] = $row['ID'];
}
$helper = $connection->getSqlHelper();
$strSQL = "
SELECT uc.USER_ID as CHANNEL_ID, uc.USER_ID, uc.SITE_ID, uc.CODE, uc.CNT
FROM b_user_counter uc
INNER JOIN b_user u ON u.ID = uc.USER_ID AND (CASE WHEN u.EXTERNAL_AUTH_ID IN ('" . implode("', '", BitrixMainUserTable::getExternalUserTypes()) . "') THEN 'Y' ELSE 'N' END) = 'N' AND u.LAST_ACTIVITY_DATE > " . $helper->addSecondsToDateTime('(-3600)')."
WHERE uc.USER_ID IN (".$userString.") AND uc.CODE NOT LIKE '" . CUserCounter::LIVEFEED_CODE . "L%' AND uc.SENT = '0'
";
$res = $DB->Query($strSQL, false, "FILE: ".__FILE__."
LINE: ".__LINE__);
while($row = $res->Fetch())
{
CUserCounter::addValueToPullMessage($row, $arSites, $pullMessage);
}
$strSQL = "
SELECT uc.USER_ID as CHANNEL_ID, uc.USER_ID, uc.SITE_ID, uc.CODE, uc.CNT
FROM b_user_counter uc
INNER JOIN b_user u ON u.ID = uc.USER_ID AND (CASE WHEN u.EXTERNAL_AUTH_ID IN ('" . implode("', '", BitrixMainUserTable::getExternalUserTypes()) . "') THEN 'Y' ELSE 'N' END) = 'N' AND u.LAST_ACTIVITY_DATE > " . $helper->addSecondsToDateTime('(-3600)')."
WHERE uc.USER_ID IN (" . $userString . ") AND uc.CODE LIKE '" . CUserCounter::LIVEFEED_CODE . "L%'
";
$res = $DB->Query($strSQL, false, "FILE: ".__FILE__."
LINE: ".__LINE__);
while($row = $res->Fetch())
{
CUserCounter::addValueToPullMessage($row, $arSites, $pullMessage);
}
$DB->Query("UPDATE b_user_counter SET SENT = '1' WHERE SENT = '0' AND USER_ID IN (".$userString.")");
}
$connection->unlock('counterpull');
if (CUserCounter::CheckLiveMode())
{
foreach ($pullMessage as $channelId => $arMessage)
{
BitrixPullEvent::add($channelId, Array(
'module_id' => 'main',
'command' => 'user_counter',
'expiry' => 3600,
'params' => $arMessage,
));
}
}
}