void RuntimeOption::Load(Hdf &config, StringVec *overwrites /* = NULL */) { // Machine metrics string hostname, tier, cpu; { Hdf machine = config["Machine"]; hostname = machine["name"].getString(); if (hostname.empty()) { hostname = Process::GetHostName(); } tier = machine["tier"].getString(); cpu = machine["cpu"].getString(); if (cpu.empty()) { cpu = Process::GetCPUModel(); } } // Tier overwrites { Hdf tiers = config["Tiers"]; for (Hdf hdf = tiers.firstChild(); hdf.exists(); hdf = hdf.next()) { if (matchHdfPattern(hostname, hdf["machine"]) && matchHdfPattern(tier, hdf["tier"]) && matchHdfPattern(cpu, hdf["cpu"])) { Tier = hdf.getName(); config.copy(hdf["overwrite"]); // no break here, so we can continue to match more overwrites } hdf["overwrite"].setVisited(); // avoid lint complaining } } // More overwrites if (overwrites) { for (unsigned int i = 0; i < overwrites->size(); i++) { config.fromString(overwrites->at(i).c_str()); } } PidFile = config["PidFile"].getString("www.pid"); { Hdf logger = config["Log"]; if (logger["Level"] == "None") { Logger::LogLevel = Logger::LogNone; } else if (logger["Level"] == "Error") { Logger::LogLevel = Logger::LogError; } else if (logger["Level"] == "Warning") { Logger::LogLevel = Logger::LogWarning; } else if (logger["Level"] == "Info") { Logger::LogLevel = Logger::LogInfo; } else if (logger["Level"] == "Verbose") { Logger::LogLevel = Logger::LogVerbose; } Logger::LogHeader = logger["Header"].getBool(); bool logInjectedStackTrace = logger["InjectedStackTrace"].getBool(); if (logInjectedStackTrace) { Logger::SetTheLogger(new ExtendedLogger()); ExtendedLogger::EnabledByDefault = true; } Logger::LogNativeStackTrace = logger["NativeStackTrace"].getBool(true); Logger::MaxMessagesPerRequest = logger["MaxMessagesPerRequest"].getInt32(-1); Logger::UseLogFile = logger["UseLogFile"].getBool(true); Logger::UseCronolog = logger["UseCronolog"].getBool(false); if (Logger::UseLogFile) { LogFile = logger["File"].getString(); LogFileSymLink = logger["SymLink"].getString(); } Logger::DropCacheChunkSize = logger["DropCacheChunkSize"].getInt32(1 << 20); AlwaysEscapeLog = logger["AlwaysEscapeLog"].getBool(false); Hdf aggregator = logger["Aggregator"]; Logger::UseLogAggregator = aggregator.getBool(); LogAggregatorFile = aggregator["File"].getString(); LogAggregatorDatabase = aggregator["Database"].getString(); LogAggregatorSleepSeconds = aggregator["SleepSeconds"].getInt16(10); AlwaysLogUnhandledExceptions = logger["AlwaysLogUnhandledExceptions"].getBool(true); NoSilencer = logger["NoSilencer"].getBool(); EnableApplicationLog = logger["ApplicationLog"].getBool(true); RuntimeErrorReportingLevel = logger["RuntimeErrorReportingLevel"].getInt32(ErrorConstants::HPHP_ALL); AccessLogDefaultFormat = logger["AccessLogDefaultFormat"]. getString("%h %l %u %t \"%r\" %>s %b"); { Hdf access = logger["Access"]; for (Hdf hdf = access.firstChild(); hdf.exists(); hdf = hdf.next()) { string fname = hdf["File"].getString(); if (fname.empty()) { continue; } string symLink = hdf["SymLink"].getString(); AccessLogs. push_back(AccessLogFileData(fname, symLink, hdf["Format"]. getString(AccessLogDefaultFormat))); } } AdminLogFormat = logger["AdminLog.Format"].getString("%h %t %s %U"); AdminLogFile = logger["AdminLog.File"].getString(); AdminLogSymLink = logger["AdminLog.SymLink"].getString(); } { Hdf error = config["ErrorHandling"]; /* Remove this, once its removed from production configs */ (void)error["NoInfiniteLoopDetection"].getBool(); MaxSerializedStringSize = error["MaxSerializedStringSize"].getInt32(64 * 1024 * 1024); CallUserHandlerOnFatals = error["CallUserHandlerOnFatals"].getBool(true); MaxLoopCount = error["MaxLoopCount"].getInt32(0); NoInfiniteRecursionDetection = error["NoInfiniteRecursionDetection"].getBool(); ThrowBadTypeExceptions = error["ThrowBadTypeExceptions"].getBool(); ThrowTooManyArguments = error["ThrowTooManyArguments"].getBool(); WarnTooManyArguments = error["WarnTooManyArguments"].getBool(); ThrowMissingArguments = error["ThrowMissingArguments"].getBool(); ThrowInvalidArguments = error["ThrowInvalidArguments"].getBool(); EnableHipHopErrors = error["EnableHipHopErrors"].getBool(true); AssertActive = error["AssertActive"].getBool(); AssertWarning = error["AssertWarning"].getBool(); NoticeFrequency = error["NoticeFrequency"].getInt32(1); WarningFrequency = error["WarningFrequency"].getInt32(1); } { Hdf rlimit = config["ResourceLimit"]; setResourceLimit(RLIMIT_CORE, rlimit, "CoreFileSize"); setResourceLimit(RLIMIT_NOFILE, rlimit, "MaxSocket"); setResourceLimit(RLIMIT_DATA, rlimit, "RSS"); MaxRSS = rlimit["MaxRSS"].getInt64(0); SocketDefaultTimeout = rlimit["SocketDefaultTimeout"].getInt16(5); MaxRSSPollingCycle = rlimit["MaxRSSPollingCycle"].getInt64(0); DropCacheCycle = rlimit["DropCacheCycle"].getInt64(0); MaxSQLRowCount = rlimit["MaxSQLRowCount"].getInt64(0); MaxMemcacheKeyCount = rlimit["MaxMemcacheKeyCount"].getInt64(0); SerializationSizeLimit = rlimit["SerializationSizeLimit"].getInt64(0); StringOffsetLimit = rlimit["StringOffsetLimit"].getInt64(10 * 1024 * 1024); } { Hdf server = config["Server"]; Host = server["Host"].getString(); DefaultServerNameSuffix = server["DefaultServerNameSuffix"].getString(); ServerIP = server["IP"].getString("0.0.0.0"); ServerPrimaryIP = Util::GetPrimaryIP(); ServerPort = server["Port"].getInt16(80); ServerBacklog = server["Backlog"].getInt16(128); ServerConnectionLimit = server["ConnectionLimit"].getInt16(0); ServerThreadCount = server["ThreadCount"].getInt32(50); ServerThreadRoundRobin = server["ThreadRoundRobin"].getBool(); ServerThreadDropCacheTimeoutSeconds = server["ThreadDropCacheTimeoutSeconds"].getInt32(0); ServerThreadJobLIFO = server["ThreadJobLIFO"].getBool(); RequestTimeoutSeconds = server["RequestTimeoutSeconds"].getInt32(0); RequestMemoryMaxBytes = server["RequestMemoryMaxBytes"].getInt64(-1); ResponseQueueCount = server["ResponseQueueCount"].getInt32(0); if (ResponseQueueCount <= 0) { ResponseQueueCount = ServerThreadCount / 10; if (ResponseQueueCount <= 0) ResponseQueueCount = 1; } ServerGracefulShutdownWait = server["GracefulShutdownWait"].getInt16(0); ServerHarshShutdown = server["HarshShutdown"].getBool(true); ServerEvilShutdown = server["EvilShutdown"].getBool(true); ServerDanglingWait = server["DanglingWait"].getInt16(0); if (ServerGracefulShutdownWait < ServerDanglingWait) { ServerGracefulShutdownWait = ServerDanglingWait; } GzipCompressionLevel = server["GzipCompressionLevel"].getInt16(3); ForceCompressionURL = server["ForceCompression"]["URL"].getString(); ForceCompressionCookie = server["ForceCompression"]["Cookie"].getString(); ForceCompressionParam = server["ForceCompression"]["Param"].getString(); EnableMagicQuotesGpc = server["EnableMagicQuotesGpc"].getBool(); EnableKeepAlive = server["EnableKeepAlive"].getBool(true); ExposeHPHP = server["ExposeHPHP"].getBool(true); ExposeXFBServer = server["ExposeXFBServer"].getBool(); ConnectionTimeoutSeconds = server["ConnectionTimeoutSeconds"].getInt16(-1); EnableOutputBuffering = server["EnableOutputBuffering"].getBool(); OutputHandler = server["OutputHandler"].getString(); ImplicitFlush = server["ImplicitFlush"].getBool(); EnableEarlyFlush = server["EnableEarlyFlush"].getBool(true); ForceChunkedEncoding = server["ForceChunkedEncoding"].getBool(); MaxPostSize = (server["MaxPostSize"].getInt32(100)) * (1LL << 20); AlwaysPopulateRawPostData = server["AlwaysPopulateRawPostData"].getBool(); LibEventSyncSend = server["LibEventSyncSend"].getBool(true); TakeoverFilename = server["TakeoverFilename"].getString(); ExpiresActive = server["ExpiresActive"].getBool(true); ExpiresDefault = server["ExpiresDefault"].getInt32(2592000); if (ExpiresDefault < 0) ExpiresDefault = 2592000; DefaultCharsetName = server["DefaultCharsetName"].getString("utf-8"); RequestBodyReadLimit = server["RequestBodyReadLimit"].getInt32(-1); EnableSSL = server["EnableSSL"].getBool(); SSLPort = server["SSLPort"].getInt16(443); SSLCertificateFile = server["SSLCertificateFile"].getString(); SSLCertificateKeyFile = server["SSLCertificateKeyFile"].getString(); SourceRoot = Util::normalizeDir(server["SourceRoot"].getString()); if (!SourceRoot.empty()) { // Guaranteed empty on empty load so avoid setting FileCache::SourceRoot // since it may not be initialized FileCache::SourceRoot = SourceRoot; } server["IncludeSearchPaths"].get(IncludeSearchPaths); for (unsigned int i = 0; i < IncludeSearchPaths.size(); i++) { IncludeSearchPaths[i] = Util::normalizeDir(IncludeSearchPaths[i]); } IncludeSearchPaths.insert(IncludeSearchPaths.begin(), "./"); FileCache = server["FileCache"].getString(); DefaultDocument = server["DefaultDocument"].getString(); ErrorDocument404 = server["ErrorDocument404"].getString(); normalizePath(ErrorDocument404); ErrorDocument500 = server["ErrorDocument500"].getString(); normalizePath(ErrorDocument500); FatalErrorMessage = server["FatalErrorMessage"].getString(); FontPath = Util::normalizeDir(server["FontPath"].getString()); EnableStaticContentCache = server["EnableStaticContentCache"].getBool(true); EnableStaticContentFromDisk = server["EnableStaticContentFromDisk"].getBool(true); EnableOnDemandUncompress = server["EnableOnDemandUncompress"].getBool(true); EnableStaticContentMMap = server["EnableStaticContentMMap"].getBool(true); if (EnableStaticContentMMap) { EnableOnDemandUncompress = true; } RTTIDirectory = Util::normalizeDir(server["RTTIDirectory"].getString("/tmp/")); EnableCliRTTI = server["EnableCliRTTI"].getBool(); Utf8izeReplace = server["Utf8izeReplace"].getBool(true); StartupDocument = server["StartupDocument"].getString(); normalizePath(StartupDocument); WarmupDocument = server["WarmupDocument"].getString(); RequestInitFunction = server["RequestInitFunction"].getString(); RequestInitDocument = server["RequestInitDocument"].getString(); server["ThreadDocuments"].get(ThreadDocuments); for (unsigned int i = 0; i < ThreadDocuments.size(); i++) { normalizePath(ThreadDocuments[i]); } server["ThreadLoopDocuments"].get(ThreadLoopDocuments); for (unsigned int i = 0; i < ThreadLoopDocuments.size(); i++) { normalizePath(ThreadLoopDocuments[i]); } SafeFileAccess = server["SafeFileAccess"].getBool(); server["AllowedDirectories"].get(AllowedDirectories); for (unsigned int i = 0; i < AllowedDirectories.size(); i++) { string &directory = AllowedDirectories[i]; char resolved_path[PATH_MAX]; if (realpath(directory.c_str(), resolved_path) && directory != resolved_path) { RuntimeOption::AllowedDirectories.push_back(resolved_path); } } server["AllowedFiles"].get(AllowedFiles); server["ForbiddenFileExtensions"].get(ForbiddenFileExtensions); EnableMemoryManager = server["EnableMemoryManager"].getBool(true); CheckMemory = server["CheckMemory"].getBool(); UseHphpArray = server["UseHphpArray"].getBool(false); UseSmallArray = server["UseSmallArray"].getBool(false); UseDirectCopy = server["UseDirectCopy"].getBool(false); AlwaysUseRelativePath = server["AlwaysUseRelativePath"].getBool(false); Hdf apc = server["APC"]; EnableApc = apc["EnableApc"].getBool(true); EnableConstLoad = apc["EnableConstLoad"].getBool(false); ForceConstLoadToAPC = apc["ForceConstLoadToAPC"].getBool(true); ApcPrimeLibrary = apc["PrimeLibrary"].getString(); ApcLoadThread = apc["LoadThread"].getInt16(2); apc["CompletionKeys"].get(ApcCompletionKeys); string apcTableType = apc["TableType"].getString("concurrent"); if (strcasecmp(apcTableType.c_str(), "hash") == 0) { ApcTableType = ApcHashTable; } else if (strcasecmp(apcTableType.c_str(), "concurrent") == 0) { ApcTableType = ApcConcurrentTable; } else { throw InvalidArgumentException("apc table type", "Invalid table type"); } string apcLockType = apc["LockType"].getString("readwritelock"); if (strcasecmp(apcLockType.c_str(), "readwritelock") == 0) { ApcTableLockType = ApcReadWriteLock; } else if (strcasecmp(apcLockType.c_str(), "mutex") == 0) { ApcTableLockType = ApcMutex; } else { throw InvalidArgumentException("apc lock type", "Invalid lock type"); } ApcExpireOnSets = apc["ExpireOnSets"].getBool(); ApcPurgeFrequency = apc["PurgeFrequency"].getInt32(4096); ApcAllowObj = apc["AllowObject"].getBool(); ApcKeyMaturityThreshold = apc["KeyMaturityThreshold"].getInt32(20); ApcMaximumCapacity = apc["MaximumCapacity"].getInt64(0); ApcKeyFrequencyUpdatePeriod = apc["KeyFrequencyUpdatePeriod"]. getInt32(1000); Hdf dns = server["DnsCache"]; EnableDnsCache = dns["Enable"].getBool(); DnsCacheTTL = dns["TTL"].getInt32(600); // 10 minutes DnsCacheKeyMaturityThreshold = dns["KeyMaturityThreshold"].getInt32(20); DnsCacheMaximumCapacity = dns["MaximumCapacity"].getInt64(0); DnsCacheKeyFrequencyUpdatePeriod = dns["KeyFrequencyUpdatePeriod"]. getInt32(1000); Hdf upload = server["Upload"]; UploadMaxFileSize = (upload["UploadMaxFileSize"].getInt32(100)) * (1LL << 20); UploadTmpDir = upload["UploadTmpDir"].getString("/tmp"); RuntimeOption::AllowedDirectories.push_back(UploadTmpDir); EnableFileUploads = upload["EnableFileUploads"].getBool(true); EnableUploadProgress = upload["EnableUploadProgress"].getBool(); Rfc1867Freq = upload["Rfc1867Freq"].getInt32(256 * 1024); if (Rfc1867Freq < 0) Rfc1867Freq = 256 * 1024; Rfc1867Prefix = upload["Rfc1867Prefix"].getString("vupload_"); Rfc1867Name = upload["Rfc1867Name"].getString("video_ptoken"); ImageMemoryMaxBytes = server["ImageMemoryMaxBytes"].getInt64(0); if (ImageMemoryMaxBytes == 0) { ImageMemoryMaxBytes = UploadMaxFileSize * 2; } SharedStores::Create(); LightProcessFilePrefix = server["LightProcessFilePrefix"].getString("./lightprocess"); LightProcessCount = server["LightProcessCount"].getInt32(0); InjectedStackTrace = server["InjectedStackTrace"].getBool(true); InjectedStackTraceLimit = server["InjectedStackTraceLimit"].getInt32(-1); ForceServerNameToHeader = server["ForceServerNameToHeader"].getBool(); ServerUser = server["User"].getString(""); } { Hdf hosts = config["VirtualHost"]; if (hosts.exists()) { for (Hdf hdf = hosts.firstChild(); hdf.exists(); hdf = hdf.next()) { if (hdf.getName() == "default") { VirtualHost::GetDefault().init(hdf); } else { VirtualHostPtr host(new VirtualHost(hdf)); VirtualHosts.push_back(host); } } for (unsigned int i = 0; i < VirtualHosts.size(); i++) { if (!VirtualHosts[i]->valid()) { throw InvalidArgumentException("virtual host", "missing prefix or pattern"); } } } } { Hdf ipblocks = config["IpBlockMap"]; IpBlocks = IpBlockMapPtr(new IpBlockMap(ipblocks)); } { Hdf satellites = config["Satellites"]; if (satellites.exists()) { for (Hdf hdf = satellites.firstChild(); hdf.exists(); hdf = hdf.next()) { SatelliteServerInfoPtr satellite(new SatelliteServerInfo(hdf)); SatelliteServerInfos.push_back(satellite); if (satellite->getType() == SatelliteServer::KindOfRPCServer) { XboxPassword = satellite->getPassword(); } } } } { Hdf xbox = config["Xbox"]; XboxServerThreadCount = xbox["ServerInfo.ThreadCount"].getInt32(0); XboxServerPort = xbox["ServerInfo.Port"].getInt32(0); XboxDefaultLocalTimeoutMilliSeconds = xbox["DefaultLocalTimeoutMilliSeconds"].getInt32(500); XboxDefaultRemoteTimeoutSeconds = xbox["DefaultRemoteTimeoutSeconds"].getInt32(5); XboxServerInfoMaxRequest = xbox["ServerInfo.MaxRequest"].getInt32(500); XboxServerInfoDuration = xbox["ServerInfo.MaxDuration"].getInt32(120); XboxServerInfoWarmupDoc = xbox["ServerInfo.WarmupDocument"].get(""); XboxServerInfoReqInitFunc = xbox["ServerInfo.RequestInitFunction"].get(""); XboxServerInfoReqInitDoc = xbox["ServerInfo.RequestInitDocument"].get(""); XboxProcessMessageFunc = xbox["ProcessMessageFunc"].get("xbox_process_message"); } { Hdf pagelet = config["PageletServer"]; PageletServerThreadCount = pagelet["ThreadCount"].getInt32(0); PageletServerThreadRoundRobin = pagelet["ThreadRoundRobin"].getBool(); PageletServerThreadDropCacheTimeoutSeconds = pagelet["ThreadDropCacheTimeoutSeconds"].getInt32(0); } { FiberCount = config["Fiber.ThreadCount"].getInt32(Process::GetCPUCount()); } { Hdf content = config["StaticFile"]; content["Extensions"].get(StaticFileExtensions); content["Generators"].get(StaticFileGenerators); Hdf matches = content["FilesMatch"]; if (matches.exists()) { for (Hdf hdf = matches.firstChild(); hdf.exists(); hdf = hdf.next()) { FilesMatches.push_back(FilesMatchPtr(new FilesMatch(hdf))); } } } { Hdf admin = config["AdminServer"]; AdminServerPort = admin["Port"].getInt16(8088); AdminThreadCount = admin["ThreadCount"].getInt32(1); AdminPassword = admin["Password"].getString(); } { Hdf proxy = config["Proxy"]; ProxyOrigin = proxy["Origin"].getString(); ProxyRetry = proxy["Retry"].getInt16(3); UseServeURLs = proxy["ServeURLs"].getBool(); proxy["ServeURLs"].get(ServeURLs); UseProxyURLs = proxy["ProxyURLs"].getBool(); ProxyPercentage = proxy["Percentage"].getByte(0); proxy["ProxyURLs"].get(ProxyURLs); proxy["ProxyPatterns"].get(ProxyPatterns); } { Hdf mysql = config["MySQL"]; MySQLReadOnly = mysql["ReadOnly"].getBool(); MySQLLocalize = mysql["Localize"].getBool(); MySQLConnectTimeout = mysql["ConnectTimeout"].getInt32(1000); MySQLReadTimeout = mysql["ReadTimeout"].getInt32(1000); MySQLWaitTimeout = mysql["WaitTimeout"].getInt32(-1); MySQLSlowQueryThreshold = mysql["SlowQueryThreshold"].getInt32(1000); MySQLKillOnTimeout = mysql["KillOnTimeout"].getBool(); } { Hdf http = config["Http"]; HttpDefaultTimeout = http["DefaultTimeout"].getInt32(30); HttpSlowQueryThreshold = http["SlowQueryThreshold"].getInt32(5000); } { Hdf debug = config["Debug"]; NativeStackTrace = debug["NativeStackTrace"].getBool(); StackTrace::Enabled = NativeStackTrace; TranslateLeakStackTrace = debug["TranslateLeakStackTrace"].getBool(); FullBacktrace = debug["FullBacktrace"].getBool(); ServerStackTrace = debug["ServerStackTrace"].getBool(); ServerErrorMessage = debug["ServerErrorMessage"].getBool(); TranslateSource = debug["TranslateSource"].getBool(); RecordInput = debug["RecordInput"].getBool(); ClearInputOnSuccess = debug["ClearInputOnSuccess"].getBool(true); ProfilerOutputDir = debug["ProfilerOutputDir"].getString("/tmp"); CoreDumpEmail = debug["CoreDumpEmail"].getString(); if (!CoreDumpEmail.empty()) { StackTrace::ReportEmail = CoreDumpEmail; } CoreDumpReport = debug["CoreDumpReport"].getBool(true); if (CoreDumpReport) { StackTrace::InstallReportOnErrors(); } std::string reportDirectory = debug["CoreDumpReportDirectory"].getString(); if (!reportDirectory.empty()) { StackTraceBase::ReportDirectory = reportDirectory; } LocalMemcache = debug["LocalMemcache"].getBool(); MemcacheReadOnly = debug["MemcacheReadOnly"].getBool(); { Hdf simpleCounter = debug["SimpleCounter"]; SimpleCounter::SampleStackCount = simpleCounter["SampleStackCount"].getInt32(0); SimpleCounter::SampleStackDepth = simpleCounter["SampleStackDepth"].getInt32(5); } } { Hdf stats = config["Stats"]; EnableStats = stats.getBool(); // main switch EnableWebStats = stats["Web"].getBool(); EnableMemoryStats = stats["Memory"].getBool(); EnableMallocStats = stats["Malloc"].getBool(); EnableAPCStats = stats["APC"].getBool(); EnableAPCKeyStats = stats["APCKey"].getBool(); EnableMemcacheStats = stats["Memcache"].getBool(); EnableMemcacheKeyStats = stats["MemcacheKey"].getBool(); EnableSQLStats = stats["SQL"].getBool(); EnableSQLTableStats = stats["SQLTable"].getBool(); EnableNetworkIOStatus = stats["NetworkIO"].getBool(); if (EnableStats && EnableMallocStats) { LeakDetectable::EnableMallocStats(true); } StatsXSL = stats["XSL"].getString(); StatsXSLProxy = stats["XSLProxy"].getString(); StatsSlotDuration = stats["SlotDuration"].getInt32(10 * 60); // 10 minutes StatsMaxSlot = stats["MaxSlot"].getInt32(12 * 6); // 12 hours { Hdf apcSize = stats["APCSize"]; EnableAPCSizeStats = apcSize["Enable"].getBool(); EnableAPCSizeGroup = apcSize["Group"].getBool(); apcSize["SpecialPrefix"].get(APCSizeSpecialPrefix); for (unsigned int i = 0; i < APCSizeSpecialPrefix.size(); i++) { string &prefix = APCSizeSpecialPrefix[i]; string prefixReplace = prefix + "{A}"; APCSizePrefixReplace.push_back(prefixReplace); } apcSize["SpecialMiddle"].get(APCSizeSpecialMiddle); for (unsigned int i = 0; i < APCSizeSpecialMiddle.size(); i++) { string &middle = APCSizeSpecialMiddle[i]; string middleReplace = "{A}" + middle + "{A}"; APCSizeMiddleReplace.push_back(middleReplace); } apcSize["SkipPrefix"].get(APCSizeSkipPrefix); EnableAPCSizeDetail = apcSize["Individual"].getBool(); EnableAPCFetchStats = apcSize["FetchStats"].getBool(); if (EnableAPCFetchStats) EnableAPCSizeDetail = true; if (EnableAPCSizeDetail) EnableAPCSizeGroup = true; APCSizeCountPrime = apcSize["CountPrime"].getBool(); } EnableHotProfiler = stats["EnableHotProfiler"].getBool(true); ProfilerTraceBuffer = stats["ProfilerTraceBuffer"].getInt32(2000000); ProfilerTraceExpansion = stats["ProfilerTraceExpansion"].getDouble(1.2); ProfilerMaxTraceBuffer = stats["ProfilerMaxTraceBuffer"].getInt32(0); } { config["ServerVariables"].get(ServerVariables); config["EnvVariables"].get(EnvVariables); } { Hdf eval = config["Eval"]; EnableHipHopSyntax = eval["EnableHipHopSyntax"].getBool(); EnableHipHopExperimentalSyntax = eval["EnableHipHopExperimentalSyntax"].getBool(); EnableShortTags= eval["EnableShortTags"].getBool(true); if (EnableShortTags) ScannerType |= Scanner::AllowShortTags; else ScannerType &= ~Scanner::AllowShortTags; EnableAspTags = eval["EnableAspTags"].getBool(); if (EnableAspTags) ScannerType |= Scanner::AllowAspTags; else ScannerType &= ~Scanner::AllowAspTags; EnableXHP = eval["EnableXHP"].getBool(true); EnableObjDestructCall = eval["EnableObjDestructCall"].getBool(false); CheckSymLink = eval["CheckSymLink"].getBool(false); NativeXHP = eval["NativeXHP"].getBool(true); if (EnableXHP && !NativeXHP) ScannerType |= Scanner::PreprocessXHP; else ScannerType &= ~Scanner::PreprocessXHP; EnableStrict = eval["EnableStrict"].getBool(); StrictLevel = eval["StrictLevel"].getInt32(1); // StrictBasic StrictFatal = eval["StrictFatal"].getBool(); RecordCodeCoverage = eval["RecordCodeCoverage"].getBool(); CodeCoverageOutputFile = eval["CodeCoverageOutputFile"].getString(); { Hdf debugger = eval["Debugger"]; EnableDebugger = debugger["EnableDebugger"].getBool(); EnableDebuggerServer = debugger["EnableDebuggerServer"].getBool(); DebuggerServerPort = debugger["Port"].getInt16(8089); DebuggerStartupDocument = debugger["StartupDocument"].getString(); DebuggerDefaultSandboxPath = debugger["DefaultSandboxPath"].getString(); DebuggerDefaultRpcPort = debugger["RPC.DefaultPort"].getInt16(8083); DebuggerDefaultRpcAuth = debugger["RPC.DefaultAuth"].getString(); DebuggerRpcHostDomain = debugger["RPC.HostDomain"].getString(); DebuggerDefaultRpcTimeout = debugger["RPC.DefaultTimeout"].getInt32(30); } } { Hdf sandbox = config["Sandbox"]; SandboxMode = sandbox["SandboxMode"].getBool(); SandboxPattern = Util::format_pattern (sandbox["Pattern"].getString(), true); SandboxHome = sandbox["Home"].getString(); SandboxFallback = sandbox["Fallback"].getString(); SandboxConfFile = sandbox["ConfFile"].getString(); SandboxFromCommonRoot = sandbox["FromCommonRoot"].getBool(); SandboxDirectoriesRoot = sandbox["DirectoriesRoot"].getString(); SandboxLogsRoot = sandbox["LogsRoot"].getString(); sandbox["ServerVariables"].get(SandboxServerVariables); } { Hdf mail = config["Mail"]; SendmailPath = mail["SendmailPath"].getString("sendmail -t -i"); MailForceExtraParameters = mail["ForceExtraParameters"].getString(); } { Hdf preg = config["Preg"]; PregBacktraceLimit = preg["BacktraceLimit"].getInt32(100000); PregRecursionLimit = preg["RecursionLimit"].getInt32(100000); } Extension::LoadModules(config); }
void RuntimeOption::Load(Hdf &config) { PidFile = config["PidFile"].getString("www.pid"); // Tier overwrites { Hdf tiers = config["Tiers"]; string hostname = Process::GetHostName(); for (Hdf hdf = tiers.firstChild(); hdf.exists(); hdf = hdf.next()) { string pattern = hdf["machine"].getString(); if (!pattern.empty()) { Variant ret = preg_match(String(pattern.c_str(), pattern.size(), AttachLiteral), String(hostname.c_str(), hostname.size(), AttachLiteral)); if (ret.toInt64() > 0) { Tier = hdf.getName(); config.copy(hdf["overwrite"]); // no break here, so we can continue to match more overwrites } } } } { Hdf logger = config["Log"]; if (logger["Level"] == "None") { Logger::LogLevel = Logger::LogNone; } else if (logger["Level"] == "Error") { Logger::LogLevel = Logger::LogError; } else if (logger["Level"] == "Warning") { Logger::LogLevel = Logger::LogWarning; } else if (logger["Level"] == "Info") { Logger::LogLevel = Logger::LogInfo; } else if (logger["Level"] == "Verbose") { Logger::LogLevel = Logger::LogVerbose; } Logger::LogHeader = logger["Header"].getBool(); Logger::MaxMessagesPerRequest = logger["MaxMessagesPerRequest"].getInt32(-1); Logger::UseLogFile = logger["UseLogFile"].getBool(true); if (Logger::UseLogFile) { LogFile = logger["File"].getString(); } Hdf aggregator = logger["Aggregator"]; Logger::UseLogAggregator = aggregator.getBool(); LogAggregatorFile = aggregator["File"].getString(); LogAggregatorDatabase = aggregator["Database"].getString(); LogAggregatorSleepSeconds = aggregator["SleepSeconds"].getInt16(10); AlwaysLogUnhandledExceptions = logger["AlwaysLogUnhandledExceptions"].getBool(true); NoSilencer = logger["NoSilencer"].getBool(); EnableApplicationLog = logger["ApplicationLog"].getBool(true); AccessLogDefaultFormat = logger["AccessLogDefaultFormat"]. getString("%h %l %u %t \"%r\" %>s %b"); { Hdf access = logger["Access"]; for (Hdf hdf = access.firstChild(); hdf.exists(); hdf = hdf.next()) { string fname = hdf["File"].getString(); if (fname.empty()) { continue; } AccessLogs. push_back(pair<string, string>(fname, hdf["Format"]. getString(AccessLogDefaultFormat))); } } AdminLogFormat = logger["AdminLogFormat"].getString("%h %t %s %U"); AdminLogFile = logger["AdminLogFile"].getString(); } { Hdf error = config["ErrorHandling"]; NoInfiniteLoopDetection = error["NoInfiniteLoopDetection"].getBool(); NoInfiniteRecursionDetection = error["NoInfiniteRecursionDetection"].getBool(); ThrowBadTypeExceptions = error["ThrowBadTypeExceptions"].getBool(); ThrowNotices = error["ThrowNotices"].getBool(); AssertActive = error["AssertActive"].getBool(); AssertWarning = error["AssertWarning"].getBool(); } { Hdf rlimit = config["ResourceLimit"]; setResourceLimit(RLIMIT_CORE, rlimit, "CoreFileSize"); setResourceLimit(RLIMIT_NOFILE, rlimit, "MaxSocket"); setResourceLimit(RLIMIT_DATA, rlimit, "RSS"); MaxRSS = rlimit["RSS"].getInt64(0); } { Hdf server = config["Server"]; Host = server["Host"].getString(); DefaultServerNameSuffix = server["DefaultServerNameSuffix"].getString(); ServerIP = server["IP"].getString("0.0.0.0"); ServerPrimaryIP = Util::GetPrimaryIP(); ServerPort = server["Port"].getInt16(80); ServerThreadCount = server["ThreadCount"].getInt32(50); PageletServerThreadCount = server["PageletServerThreadCount"].getInt32(0); RequestTimeoutSeconds = server["RequestTimeoutSeconds"].getInt32(-1); RequestMemoryMaxBytes = server["RequestMemoryMaxBytes"].getInt64(-1); ResponseQueueCount = server["ResponseQueueCount"].getInt32(0); if (ResponseQueueCount <= 0) { ResponseQueueCount = ServerThreadCount / 10; if (ResponseQueueCount <= 0) ResponseQueueCount = 1; } ServerGracefulShutdownWait = server["GracefulShutdownWait"].getInt16(0); ServerHarshShutdown = server["HarshShutdown"].getBool(true); ServerEvilShutdown = server["EvilShutdown"].getBool(true); ServerDanglingWait = server["DanglingWait"].getInt16(0); if (ServerGracefulShutdownWait < ServerDanglingWait) { ServerGracefulShutdownWait = ServerDanglingWait; } GzipCompressionLevel = server["GzipCompressionLevel"].getInt16(3); EnableKeepAlive = server["EnableKeepAlive"].getBool(true); EnableEarlyFlush = server["EnableEarlyFlush"].getBool(true); ForceChunkedEncoding = server["ForceChunkedEncoding"].getBool(); MaxPostSize = (server["MaxPostSize"].getInt32(8)) * (1 << 20); UploadMaxFileSize = (server["MaxPostSize"].getInt32(10)) * (1 << 20); EnableFileUploads = server["EnableFileUploads"].getBool(true); LibEventSyncSend = server["LibEventSyncSend"].getBool(true); TakeoverFilename = server["TakeoverFilename"].getString(); ExpiresActive = server["ExpiresActive"].getBool(true); ExpiresDefault = server["ExpiresDefault"].getInt32(2592000); if (ExpiresDefault < 0) ExpiresDefault = 2592000; DefaultCharsetName = server["DefaultCharsetName"].getString("UTF-8"); SourceRoot = server["SourceRoot"].getString(); if (!SourceRoot.empty() && SourceRoot[SourceRoot.length() - 1] != '/') { SourceRoot += '/'; } if (!SourceRoot.empty()) { // Guaranteed empty on empty load so avoid setting FileCache::SourceRoot // since it may not be initialized FileCache::SourceRoot = SourceRoot; } server["IncludeSearchPaths"].get(IncludeSearchPaths); for (unsigned int i = 0; i < IncludeSearchPaths.size(); i++) { string &path = IncludeSearchPaths[i]; if (!path.empty() && path[path.length() - 1] != '/') { path += '/'; } } IncludeSearchPaths.insert(IncludeSearchPaths.begin(), "./"); FileCache = server["FileCache"].getString(); DefaultDocument = server["DefaultDocument"].getString(); ErrorDocument404 = server["ErrorDocument404"].getString(); normalizePath(ErrorDocument404); FatalErrorMessage = server["FatalErrorMessage"].getString(); FontPath = server["FontPath"].getString(); if (!FontPath.empty() && FontPath[FontPath.length() - 1] != '/') { FontPath += "/"; } EnableStaticContentCache = server["EnableStaticContentCache"].getBool(true); EnableStaticContentFromDisk = server["EnableStaticContentFromDisk"].getBool(true); RTTIDirectory = server["RTTIDirectory"].getString("/tmp/"); if (!RTTIDirectory.empty() && RTTIDirectory[RTTIDirectory.length() - 1] != '/') { RTTIDirectory += "/"; } EnableCliRTTI = server["EnableCliRTTI"].getBool(); StartupDocument = server["StartupDocument"].getString(); normalizePath(StartupDocument); WarmupDocument = server["WarmupDocument"].getString(); RequestInitFunction = server["RequestInitFunction"].getString(); server["ThreadDocuments"].get(ThreadDocuments); for (unsigned int i = 0; i < ThreadDocuments.size(); i++) { normalizePath(ThreadDocuments[i]); } SafeFileAccess = server["SafeFileAccess"].getBool(); server["AllowedDirectories"].get(AllowedDirectories); for (unsigned int i = 0; i < AllowedDirectories.size(); i++) { string &directory = AllowedDirectories[i]; char resolved_path[PATH_MAX]; if (realpath(directory.c_str(), resolved_path) && directory != resolved_path) { RuntimeOption::AllowedDirectories.push_back(resolved_path); } } server["AllowedFiles"].get(AllowedFiles); EnableMemoryManager = server["EnableMemoryManager"].getBool(); CheckMemory = server["CheckMemory"].getBool(); UseZendArray = server["UseZendArray"].getBool(true); Hdf apc = server["APC"]; EnableApc = apc["EnableApc"].getBool(true); ApcUseSharedMemory = apc["UseSharedMemory"].getBool(); ApcSharedMemorySize = apc["SharedMemorySize"].getInt32(1024 /* 1GB */); ApcPrimeLibrary = apc["PrimeLibrary"].getString(); ApcLoadThread = apc["LoadThread"].getInt16(2); apc["CompletionKeys"].get(ApcCompletionKeys); string apcTableType = apc["TableType"].getString("hash"); if (strcasecmp(apcTableType.c_str(), "hash") == 0) { ApcTableType = ApcHashTable; } else if (strcasecmp(apcTableType.c_str(), "lfu") == 0) { ApcTableType = ApcLfuTable; } else if (strcasecmp(apcTableType.c_str(), "concurrent") == 0) { ApcTableType = ApcConcurrentTable; } else { throw InvalidArgumentException("apc table type", "Invalid table type"); } string apcLockType = apc["LockType"].getString("readwritelock"); if (strcasecmp(apcLockType.c_str(), "readwritelock") == 0) { ApcTableLockType = ApcReadWriteLock; } else if (strcasecmp(apcLockType.c_str(), "mutex") == 0) { ApcTableLockType = ApcMutex; } else { throw InvalidArgumentException("apc lock type", "Invalid lock type"); } ApcUseLockedRefs = apc["UseLockedRefs"].getBool(); ApcExpireOnSets = apc["ExpireOnSets"].getBool(); ApcPurgeFrequency = apc["PurgeFrequency"].getInt32(4096); ApcKeyMaturityThreshold = apc["KeyMaturityThreshold"].getInt32(20); ApcMaximumCapacity = apc["MaximumCapacity"].getInt64(0); ApcKeyFrequencyUpdatePeriod = apc["KeyFrequencyUpdatePeriod"]. getInt32(1000); Hdf dns = server["DnsCache"]; EnableDnsCache = dns["Enable"].getBool(); DnsCacheTTL = dns["TTL"].getInt32(600); // 10 minutes DnsCacheKeyMaturityThreshold = dns["KeyMaturityThreshold"].getInt32(20); DnsCacheMaximumCapacity = dns["MaximumCapacity"].getInt64(0); DnsCacheKeyFrequencyUpdatePeriod = dns["KeyFrequencyUpdatePeriod"]. getInt32(1000); SharedStores::Create(); LightProcessFilePrefix = server["LightProcessFilePrefix"].getString("./lightprocess"); LightProcessCount = server["LightProcessCount"].getInt32(0); InjectedStacktrace = server["InjectedStacktrace"].getBool(); ForceServerNameToHeader = server["ForceServerNameToHeader"].getBool(); } { Hdf hosts = config["VirtualHost"]; if (hosts.exists()) { for (Hdf hdf = hosts.firstChild(); hdf.exists(); hdf = hdf.next()) { if (hdf.getName() == "default") { VirtualHost::GetDefault().init(hdf); } else { VirtualHostPtr host(new VirtualHost(hdf)); VirtualHosts.push_back(host); } } for (unsigned int i = 0; i < VirtualHosts.size(); i++) { if (!VirtualHosts[i]->valid()) { throw InvalidArgumentException("virtual host", "missing prefix or pattern"); } } } } { Hdf ipblocks = config["IpBlockMap"]; IpBlocks = IpBlockMapPtr(new IpBlockMap(ipblocks)); } { Hdf satellites = config["Satellites"]; if (satellites.exists()) { for (Hdf hdf = satellites.firstChild(); hdf.exists(); hdf = hdf.next()) { SatelliteServerInfoPtr satellite(new SatelliteServerInfo(hdf)); SatelliteServerInfos.push_back(satellite); if (satellite->getType() == SatelliteServer::KindOfRPCServer) { XboxPassword = satellite->getPassword(); } } } } { Hdf xbox = config["Xbox"]; XboxServerThreadCount = xbox["ServerThreadCount"].getInt32(0); XboxServerPort = xbox["ServerPort"].getInt32(0); XboxDefaultLocalTimeoutMilliSeconds = xbox["DefaultLocalTimeoutMilliSeconds"].getInt32(500); XboxDefaultRemoteTimeoutSeconds = xbox["DefaultRemoteTimeoutSeconds"].getInt32(5); XboxServerInfoMaxRequest = xbox["ServerInfoMaxRequest"].getInt32(500); XboxServerInfoDuration = xbox["ServerInfoDuration"].getInt32(120); XboxServerInfoWarmupDoc = xbox["ServerInfoWarmupDoc"].get(""); XboxServerInfoReqInitFunc = xbox["ServerInfoReqInitFunc"].get(""); XboxProcessMessageFunc = xbox["ProcessMessageFunc"].get("xbox_process_message"); } { Hdf content = config["StaticFile"]; content["Extensions"].get(StaticFileExtensions); content["Generators"].get(StaticFileGenerators); } { Hdf admin = config["AdminServer"]; AdminServerPort = admin["Port"].getInt16(8088); AdminThreadCount = admin["ThreadCount"].getInt32(1); AdminPassword = admin["Password"].getString(); } { Hdf proxy = config["Proxy"]; ProxyOrigin = proxy["Origin"].getString(); ProxyRetry = proxy["Retry"].getInt16(3); UseServeURLs = proxy["ServeURLs"].getBool(); proxy["ServeURLs"].get(ServeURLs); UseProxyURLs = proxy["ProxyURLs"].getBool(); ProxyPercentage = proxy["Percentage"].getByte(0); proxy["ProxyURLs"].get(ProxyURLs); } { Hdf mysql = config["MySQL"]; MySQLReadOnly = mysql["ReadOnly"].getBool(); MySQLLocalize = mysql["Localize"].getBool(); MySQLConnectTimeout = mysql["ConnectTimeout"].getInt32(1000); MySQLReadTimeout = mysql["ReadTimeout"].getInt32(1000); MySQLSlowQueryThreshold = mysql["SlowQueryThreshold"].getInt32(1000); MySQLKillOnTimeout = mysql["KillOnTimeout"].getBool(); } { Hdf http = config["Http"]; HttpDefaultTimeout = http["DefaultTimeout"].getInt32(30); HttpSlowQueryThreshold = http["SlowQueryThreshold"].getInt32(5000); } { Hdf sandbox = config["Sandbox"]; SocketDefaultTimeout = sandbox["SocketDefaultTimeout"].getInt16(5); LocalMemcache = sandbox["LocalMemcache"].getBool(); MemcacheReadOnly = sandbox["MemcacheReadOnly"].getBool(); } { Hdf debug = config["Debug"]; FullBacktrace = debug["FullBacktrace"].getBool(); ServerStackTrace = debug["ServerStackTrace"].getBool(); ServerErrorMessage = debug["ServerErrorMessage"].getBool(); TranslateSource = debug["TranslateSource"].getBool(); RecordInput = debug["RecordInput"].getBool(); ClearInputOnSuccess = debug["ClearInputOnSuccess"].getBool(true); ProfilerOutputDir = debug["ProfilerOutputDir"].getString("/tmp"); CoreDumpEmail = debug["CoreDumpEmail"].getString(); if (!CoreDumpEmail.empty()) { StackTrace::ReportEmail = CoreDumpEmail; } CoreDumpReport = debug["CoreDumpReport"].getBool(true); if (CoreDumpReport) { StackTrace::InstallReportOnErrors(); } } { Hdf stats = config["Stats"]; EnableStats = stats.getBool(); // main switch EnableWebStats = stats["Web"].getBool(); EnableMemoryStats = stats["Memory"].getBool(); EnableMallocStats = stats["Malloc"].getBool(); EnableAPCStats = stats["APC"].getBool(); EnableAPCKeyStats = stats["APCKey"].getBool(); EnableMemcacheStats = stats["Memcache"].getBool(); EnableSQLStats = stats["SQL"].getBool(); if (EnableStats && EnableMallocStats) { LeakDetectable::EnableMallocStats(true); } StatsXSL = stats["XSL"].getString(); StatsXSLProxy = stats["XSLProxy"].getString(); StatsSlotDuration = stats["SlotDuration"].getInt32(10 * 60); // 10 minutes StatsMaxSlot = stats["MaxSlot"].getInt32(12 * 6); // 12 hours } { config["ServerVariables"].get(ServerVariables); config["EnvVariables"].get(EnvVariables); } { Hdf eval = config["Eval"]; EnableXHP = eval["EnableXHP"].getBool(true); EnableStrict = eval["EnableStrict"].getBool(0); StrictLevel = eval["StrictLevel"].getInt32(1); // StrictBasic StrictFatal = eval["StrictFatal"].getBool(); EvalBytecodeInterpreter = eval["BytecodeInterpreter"].getBool(false); DumpBytecode = eval["DumpBytecode"].getBool(false); } { Hdf sandbox = config["Sandbox"]; SandboxMode = sandbox["SandboxMode"].getBool(); SandboxPattern = format_pattern(sandbox["Pattern"].getString()); SandboxHome = sandbox["Home"].getString(); SandboxConfFile = sandbox["ConfFile"].getString(); sandbox["ServerVariables"].get(SandboxServerVariables); } { Hdf mail = config["Mail"]; SendmailPath = mail["SendmailPath"].getString("sendmail -t -i"); MailForceExtraParameters = mail["ForceExtraParameters"].getString(); } }