Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/cluster/classes/general/ |
Upload File : |
<?php IncludeModuleLangFile(__FILE__); class CClusterQueue { public static function Add($group_id, $command, $param1, $param2, $param3) { global $DB; $sql_group_id = "'" . intval($group_id) . "'"; $sql_command = "'" . $DB->ForSql($command, 50) . "'"; $sql_param1 = CClusterQueue::QuoteParam($param1); $sql_param2 = CClusterQueue::QuoteParam($param2); $sql_param3 = CClusterQueue::QuoteParam($param3); $DB->StartUsingMasterOnly(); $DB->Query(' INSERT INTO b_cluster_queue ( TIMESTAMP_X, GROUP_ID, COMMAND, PARAM1, PARAM2, PARAM3 ) values ( ' . $DB->CurrentTimeFunction() . ', ' . $sql_group_id . ', ' . $sql_command . ', ' . $sql_param1 . ', ' . $sql_param2 . ', ' . $sql_param3 . ' ) '); $DB->StopUsingMasterOnly(); } public static function QuoteParam($str) { global $DB; if (is_bool($str)) { return "'b:" . ($str === true ? 't' : 'f') . "'"; } elseif (is_string($str)) { return "'s:" . $DB->ForSql($str, 250) . "'"; } else { return 'null'; } } public static function UnQuoteParam($str) { if ($str <> '') { $prefix = mb_substr($str, 0, 2); if ($prefix === 's:') { return mb_substr($str, 2); } if ($prefix === 'b:') { return mb_substr($str, 2) === 't'; } } return null; } public static function Run() { $pool = \Bitrix\Main\Application::getInstance()->getConnectionPool(); /* @var \Bitrix\Main\DB\Connection $connection */ $connection = $pool->getConnection(); $pool->useMasterOnly(true); do { //read data $ids = []; $queue = []; $rs = $connection->query(' SELECT * FROM b_cluster_queue WHERE GROUP_ID = ' . constant('BX_CLUSTER_GROUP') . ' ORDER BY ID ', 100); while ($ar = $rs->fetch()) { $queueKey = $ar['COMMAND'] . '|' . $ar['PARAM1'] . '|' . $ar['PARAM2'] . '|' . $ar['PARAM3']; $queue[$queueKey] = $ar; $ids[] = intval($ar['ID']); } $uid = $connection->getDatabase() . '_cluster_queue_' . constant('BX_CLUSTER_GROUP'); if ($ids) { if (!$connection->lock($uid)) { $pool->useMasterOnly(false); return false; } } //clean cache foreach ($queue as $ar) { $class_name = $ar['COMMAND']; if (class_exists($class_name)) { /** @var CPHPCacheRedisCluster::QueueRun | CPHPCacheMemcacheCluster::QueueRun $class_name */ $object = new $class_name; $object->QueueRun( CClusterQueue::UnQuoteParam($ar['PARAM1']), CClusterQueue::UnQuoteParam($ar['PARAM2']), CClusterQueue::UnQuoteParam($ar['PARAM3']) ); } } //mark as done if ($ids) { $connection->query('DELETE FROM b_cluster_queue WHERE ID in (' . implode(',', $ids) . ')'); $connection->unlock($uid); } } while ($queue); $pool->useMasterOnly(false); } }