• Модуль: mail
  • Путь к файлу: ~/bitrix/modules/mail/classes/general/smtp.php
  • Класс: CSMTPServer
  • Вызов: CSMTPServer::Listen
function Listen()
{
	global $DB, $CACHE_MANAGER;
	$cnt = 100;
	while (true)
	{
		$cnt++;
		if($cnt>5)
		{
			$cnt = 0;
			$stats = Array(
					'started'=>$this->startTime,
					'uptime'=>time() - $this->startTime,
					'messages'=>0,
					'connections'=>0,
					'connections_now'=>0,
					'servers'=>Array()
					);

			foreach($this->arServers as $arServer)
			{
				$stats["servers"][] = Array(
						'id'=>$arServer->arFields["ID"],
						'server'=>$arServer->arFields["SERVER"],
						'port'=>$arServer->arFields["PORT"],
						'started'=>$arServer->startTime
					);
				$stats["messages"] += $arServer->msgCount;
				$stats["connections"] += $arServer->conCount;
				$stats["connections_now"] += count($arServer->arClients);
			}

			$CACHE_MANAGER->Read(33, "smtpd_stats");
			$CACHE_MANAGER->SetImmediate("smtpd_stats", $stats);

			if($CACHE_MANAGER->Read(3600000, "smtpd_reload"))
				$this->ReloadServers();
			$CACHE_MANAGER->Clean("smtpd_reload");

			$bStop = $CACHE_MANAGER->Read(3600000, "smtpd_stop");
			$CACHE_MANAGER->Clean("smtpd_stop");

			if($bStop)
			{
				$CACHE_MANAGER->Clean("smtpd_stats");
				return;
			}

			$DB->Query("SELECT 'x' FROM b_user WHERE 1=0"); // nop
		}

		$arReadSockets = Array();

		foreach($this->arServers as $server)
			$arReadSockets = array_merge($arReadSockets, $server->GetSockets());

		if(count($arReadSockets)<=0)
			sleep(1);
		else
		{
			$n = @stream_select($arReadSockets, $w = null, $e = null, 3);
			if($n > 0)
			{
				foreach($arReadSockets as $r)
				{
					if(($server = $this->FindServerSocket($r))!==false)
					{
						$server->AddConnection();
					}
					else
					{
						if(($conn = $this->FindServerConnection($r))!==false)
						{
							$conn->Receive();
						}
					}
				}
			}
		}

		$arServers = $this->arServers;
		foreach($arServers as $server)
			$server->CheckTimeout(600);
	}
}