{"id":27157,"date":"2016-12-20T15:14:50","date_gmt":"2016-12-20T13:14:50","guid":{"rendered":"https:\/\/mamchenkov.net\/wordpress\/?p=27157"},"modified":"2016-12-20T15:14:50","modified_gmt":"2016-12-20T13:14:50","slug":"feature-flags-in-php","status":"publish","type":"post","link":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/","title":{"rendered":"Feature Flags in PHP"},"content":{"rendered":"<!-- google_ad_section_start -->\n<p>Today edition of the &#8220;<a href=\"https:\/\/www.oreilly.com\/ideas\/four-short-links-20-december-2016\">Four short links<\/a>&#8221; from the <a href=\"http:\/\/radar.oreilly.com\/\">O&#8217;Reilly Radar<\/a>, brings <a href=\"http:\/\/everythingsysadmin.com\/2016\/12\/flag-implementations.html\">a quick overview<\/a> of the different feature flag implementations. \u00a0It touches on the following:<\/p>\n<ul>\n<li>Command-line flags, with the link to <a href=\"https:\/\/gflags.github.io\/gflags\/\">gflags<\/a>.<\/li>\n<li>A\/B flags<\/li>\n<li>Dynamic flags, which are more difficult<\/li>\n<li>More complex systems.<\/li>\n<\/ul>\n<p>I&#8217;ve dealt with feature flags before, but never found an elegant way to scale those. \u00a0Some of the issues that I came across were:<\/p>\n<ol>\n<li><strong>Naming conventions<\/strong>. \u00a0With more and more features added to the system, naming things becomes more and more difficult. \u00a0Especially, when features cross over from one part of the system into another and need to be supported in different sub-modules. \u00a0In a way, this reminds me of the old argument in the blogging community about using hierarchical categories vs. flat tags, with categories providing more order and tags providing multiple paths to the destination.<\/li>\n<li><strong>Modularization issues<\/strong>. \u00a0Feature flags are often need in the larger applications. \u00a0The kind that provides a lot of features (duh!). \u00a0But those large applications often consist of smaller parts, or modules. \u00a0Deciding whether or not to implement the feature on the application level, and\/or on the module level is difficult. Especially if those module features will need to be later grouped into application features.<\/li>\n<\/ol>\n<blockquote class=\"twitter-tweet\" data-width=\"550\" data-dnt=\"true\">\n<p lang=\"en\" dir=\"ltr\">There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.<\/p>\n<p>&mdash; Jeff Atwood (@codinghorror) <a href=\"https:\/\/twitter.com\/codinghorror\/status\/506010907021828096?ref_src=twsrc%5Etfw\">August 31, 2014<\/a><\/p><\/blockquote>\n<p><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/p>\n<p>In terms of implementation, I haven&#8217;t used any special tools or libraries. \u00a0It was basically a set of configuration files, with feature variables defined per environment and altered during the deployment.<\/p>\n<p>These days, something more robust than that is necessary for some of the projects at work. \u00a0Gladly, there are plenty of available tools to choose from &#8211; no need to reinvent the wheel. \u00a0For a good starting point, have a look at <a href=\"http:\/\/featureflags.io\/php-feature-flags\/\">PHP Feature Flags<\/a> website. \u00a0The ones listed so far are:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/launchdarkly\/php-client\">LaunchDarkly PHP Feature Flag SDK<\/a>, to integrate your application with <a href=\"https:\/\/launchdarkly.com\/\">LaunchDarky<\/a> service.<\/li>\n<li><a href=\"https:\/\/github.com\/etsy\/feature\">Etsy Feature Flagging<\/a>, not officially supported by <a href=\"https:\/\/www.etsy.com\/\">Etsy<\/a> anymore, but still popular and useful.<\/li>\n<li><a href=\"https:\/\/github.com\/DZunke\/FeatureFlagsBundle\">Dzunke Feature Flags<\/a>, which is a bundle for Symfony2. \u00a0It&#8217;ll require Symfony-Configs for the actual features configuration.<\/li>\n<li><a href=\"https:\/\/github.com\/qandidate-labs\/qandidate-toggle\">Qandidate Feature Flagging Library<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/opensoft\/rollout\">Rollout<\/a>, a port of ruby&#8217;s <a href=\"https:\/\/github.com\/FetLife\/rollout\">rollout<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/jayf\/php-feature-flags\">PHP Feature Flags<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/SoCloz\/SoclozFeatureFlagBundle\">SoCloz Feature Flag Bundle<\/a><\/li>\n<\/ul>\n<p>So, I guess, PHP is well covered when it comes to feature flags tools. \u00a0The above cover cookie-based, IP-based, URL-based dynamic features, configuration-based features, and A\/B features.<\/p>\n<p>The point now is to actually utilize them in the project. \u00a0After all, the lack of feature flags is one of the 5 toxic things for the scalability, as per <a href=\"http:\/\/www.iheavy.com\/2011\/08\/26\/5-things-are-toxic-to-scalability\/\">this page<\/a>:<\/p>\n<ol>\n<li>Object Relational Mappers (ORMs)<\/li>\n<li>Synchronous, Serial, Coupled or Locking Processes<\/li>\n<li>One Copy of Your Database<\/li>\n<li>Having No Metrics<\/li>\n<li>Lack of Feature Flags<\/li>\n<\/ol>\n<p>I haven&#8217;t decided which library to use yet &#8211; will need to try them all and see which one is the most appropriate, but for now I don&#8217;t think I&#8217;ll dive as deep as cookie\/URL\/IP based features or A\/B testing. \u00a0Even the simplest configuration-based implementation will be helpful.<\/p>\n<!-- google_ad_section_end -->\n","protected":false},"excerpt":{"rendered":"<!-- google_ad_section_start -->\n<p>Today edition of the &#8220;Four short links&#8221; from the O&#8217;Reilly Radar, brings a quick overview of the different feature flag implementations. \u00a0It touches on the following: Command-line flags, with the link to gflags. A\/B flags Dynamic flags, which are more difficult More complex systems. I&#8217;ve dealt with feature flags before, but never found an elegant &hellip; <a href=\"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Feature Flags in PHP<\/span><\/a><\/p>\n<!-- google_ad_section_end -->\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"Feature Flags in PHP #WebDev #PHP #WebWork","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false,"_links_to":"","_links_to_target":""},"categories":[1,18,62,1334],"tags":[38,1330],"keyring_services":[],"class_list":["post-27157","post","type-post","status-publish","format-standard","hentry","category-general","category-programming","category-technology","category-web-work","tag-php","tag-web-development"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.8 - aioseo.com -->\n\t<meta name=\"description\" content=\"Today edition of the &quot;Four short links&quot; from the O&#039;Reilly Radar, brings a quick overview of the different feature flag implementations. It touches on the following: Command-line flags, with the link to gflags. A\/B flags Dynamic flags, which are more difficult More complex systems. I&#039;ve dealt with feature flags before, but never found an elegant\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Leonid Mamchenkov\"\/>\n\t<meta name=\"google-site-verification\" content=\"VHvdD0_usx1_4DzKy_QCVcICVgX2EgA2ybELT-wl7kQ\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.8\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Leonid Mamchenkov - Life, universe, and everything else\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Feature Flags in PHP - Leonid Mamchenkov\" \/>\n\t\t<meta property=\"og:description\" content=\"Today edition of the &quot;Four short links&quot; from the O&#039;Reilly Radar, brings a quick overview of the different feature flag implementations. It touches on the following: Command-line flags, with the link to gflags. A\/B flags Dynamic flags, which are more difficult More complex systems. I&#039;ve dealt with feature flags before, but never found an elegant\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2016-12-20T13:14:50+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2016-12-20T13:14:50+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/MamchenkovBlog\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@mamchenkov\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Feature Flags in PHP - Leonid Mamchenkov\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Today edition of the &quot;Four short links&quot; from the O&#039;Reilly Radar, brings a quick overview of the different feature flag implementations. It touches on the following: Command-line flags, with the link to gflags. A\/B flags Dynamic flags, which are more difficult More complex systems. I&#039;ve dealt with feature flags before, but never found an elegant\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@mamchenkov\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/20\\\/feature-flags-in-php\\\/#blogposting\",\"name\":\"Feature Flags in PHP - Leonid Mamchenkov\",\"headline\":\"Feature Flags in PHP\",\"author\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/#person\"},\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/20\\\/feature-flags-in-php\\\/#articleImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g\",\"width\":96,\"height\":96,\"caption\":\"Leonid Mamchenkov\"},\"datePublished\":\"2016-12-20T15:14:50+02:00\",\"dateModified\":\"2016-12-20T15:14:50+02:00\",\"inLanguage\":\"en-US\",\"commentCount\":2,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/20\\\/feature-flags-in-php\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/20\\\/feature-flags-in-php\\\/#webpage\"},\"articleSection\":\"All, Programming, Technology, Web work, PHP, web development\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/20\\\/feature-flags-in-php\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/#listItem\",\"name\":\"Technology\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/#listItem\",\"position\":2,\"name\":\"Technology\",\"item\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/programming\\\/#listItem\",\"name\":\"Programming\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/programming\\\/#listItem\",\"position\":3,\"name\":\"Programming\",\"item\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/programming\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/20\\\/feature-flags-in-php\\\/#listItem\",\"name\":\"Feature Flags in PHP\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/#listItem\",\"name\":\"Technology\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/20\\\/feature-flags-in-php\\\/#listItem\",\"position\":4,\"name\":\"Feature Flags in PHP\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/programming\\\/#listItem\",\"name\":\"Programming\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/#person\",\"name\":\"Leonid Mamchenkov\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/20\\\/feature-flags-in-php\\\/#personImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g\",\"width\":96,\"height\":96,\"caption\":\"Leonid Mamchenkov\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/#author\",\"url\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/\",\"name\":\"Leonid Mamchenkov\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/20\\\/feature-flags-in-php\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g\",\"width\":96,\"height\":96,\"caption\":\"Leonid Mamchenkov\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/20\\\/feature-flags-in-php\\\/#webpage\",\"url\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/20\\\/feature-flags-in-php\\\/\",\"name\":\"Feature Flags in PHP - Leonid Mamchenkov\",\"description\":\"Today edition of the \\\"Four short links\\\" from the O'Reilly Radar, brings a quick overview of the different feature flag implementations. It touches on the following: Command-line flags, with the link to gflags. A\\\/B flags Dynamic flags, which are more difficult More complex systems. I've dealt with feature flags before, but never found an elegant\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2016\\\/12\\\/20\\\/feature-flags-in-php\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/#author\"},\"datePublished\":\"2016-12-20T15:14:50+02:00\",\"dateModified\":\"2016-12-20T15:14:50+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/#website\",\"url\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/\",\"name\":\"Blog of Leonid Mamchenkov\",\"description\":\"Life, universe, and everything else\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/#person\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Feature Flags in PHP - Leonid Mamchenkov","description":"Today edition of the \"Four short links\" from the O'Reilly Radar, brings a quick overview of the different feature flag implementations. It touches on the following: Command-line flags, with the link to gflags. A\/B flags Dynamic flags, which are more difficult More complex systems. I've dealt with feature flags before, but never found an elegant","canonical_url":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"google-site-verification":"VHvdD0_usx1_4DzKy_QCVcICVgX2EgA2ybELT-wl7kQ","miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/#blogposting","name":"Feature Flags in PHP - Leonid Mamchenkov","headline":"Feature Flags in PHP","author":{"@id":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/#author"},"publisher":{"@id":"https:\/\/mamchenkov.net\/wordpress\/#person"},"image":{"@type":"ImageObject","@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/#articleImage","url":"https:\/\/secure.gravatar.com\/avatar\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g","width":96,"height":96,"caption":"Leonid Mamchenkov"},"datePublished":"2016-12-20T15:14:50+02:00","dateModified":"2016-12-20T15:14:50+02:00","inLanguage":"en-US","commentCount":2,"mainEntityOfPage":{"@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/#webpage"},"isPartOf":{"@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/#webpage"},"articleSection":"All, Programming, Technology, Web work, PHP, web development"},{"@type":"BreadcrumbList","@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress#listItem","position":1,"name":"Home","item":"https:\/\/mamchenkov.net\/wordpress","nextItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/#listItem","name":"Technology"}},{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/#listItem","position":2,"name":"Technology","item":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/#listItem","name":"Programming"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/#listItem","position":3,"name":"Programming","item":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/#listItem","name":"Feature Flags in PHP"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/#listItem","name":"Technology"}},{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/#listItem","position":4,"name":"Feature Flags in PHP","previousItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/#listItem","name":"Programming"}}]},{"@type":"Person","@id":"https:\/\/mamchenkov.net\/wordpress\/#person","name":"Leonid Mamchenkov","image":{"@type":"ImageObject","@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/#personImage","url":"https:\/\/secure.gravatar.com\/avatar\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g","width":96,"height":96,"caption":"Leonid Mamchenkov"}},{"@type":"Person","@id":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/#author","url":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/","name":"Leonid Mamchenkov","image":{"@type":"ImageObject","@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g","width":96,"height":96,"caption":"Leonid Mamchenkov"}},{"@type":"WebPage","@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/#webpage","url":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/","name":"Feature Flags in PHP - Leonid Mamchenkov","description":"Today edition of the \"Four short links\" from the O'Reilly Radar, brings a quick overview of the different feature flag implementations. It touches on the following: Command-line flags, with the link to gflags. A\/B flags Dynamic flags, which are more difficult More complex systems. I've dealt with feature flags before, but never found an elegant","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mamchenkov.net\/wordpress\/#website"},"breadcrumb":{"@id":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/#breadcrumblist"},"author":{"@id":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/#author"},"creator":{"@id":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/#author"},"datePublished":"2016-12-20T15:14:50+02:00","dateModified":"2016-12-20T15:14:50+02:00"},{"@type":"WebSite","@id":"https:\/\/mamchenkov.net\/wordpress\/#website","url":"https:\/\/mamchenkov.net\/wordpress\/","name":"Blog of Leonid Mamchenkov","description":"Life, universe, and everything else","inLanguage":"en-US","publisher":{"@id":"https:\/\/mamchenkov.net\/wordpress\/#person"}}]},"og:locale":"en_US","og:site_name":"Leonid Mamchenkov - Life, universe, and everything else","og:type":"article","og:title":"Feature Flags in PHP - Leonid Mamchenkov","og:description":"Today edition of the &quot;Four short links&quot; from the O'Reilly Radar, brings a quick overview of the different feature flag implementations. It touches on the following: Command-line flags, with the link to gflags. A\/B flags Dynamic flags, which are more difficult More complex systems. I've dealt with feature flags before, but never found an elegant","og:url":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/","og:image":"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg","og:image:secure_url":"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg","og:image:width":1024,"og:image:height":1024,"article:published_time":"2016-12-20T13:14:50+00:00","article:modified_time":"2016-12-20T13:14:50+00:00","article:publisher":"https:\/\/www.facebook.com\/MamchenkovBlog","twitter:card":"summary_large_image","twitter:site":"@mamchenkov","twitter:title":"Feature Flags in PHP - Leonid Mamchenkov","twitter:description":"Today edition of the &quot;Four short links&quot; from the O'Reilly Radar, brings a quick overview of the different feature flag implementations. It touches on the following: Command-line flags, with the link to gflags. A\/B flags Dynamic flags, which are more difficult More complex systems. I've dealt with feature flags before, but never found an elegant","twitter:creator":"@mamchenkov","twitter:image":"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg"},"aioseo_meta_data":{"post_id":"27157","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"BlogPosting","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2023-07-19 11:57:40","updated":"2026-01-15 12:34:45","seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/mamchenkov.net\/wordpress\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/\" title=\"Technology\">Technology<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/\" title=\"Programming\">Programming<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tFeature Flags in PHP\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/mamchenkov.net\/wordpress"},{"label":"Technology","link":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/"},{"label":"Programming","link":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/"},{"label":"Feature Flags in PHP","link":"https:\/\/mamchenkov.net\/wordpress\/2016\/12\/20\/feature-flags-in-php\/"}],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":29041,"url":"https:\/\/mamchenkov.net\/wordpress\/2018\/11\/30\/php-countries-and-currencies\/","url_meta":{"origin":27157,"position":0},"title":"PHP: Countries and currencies","author":"Leonid Mamchenkov","date":"November 30, 2018","format":false,"excerpt":"Many software projects deal with the lists of countries and currencies.\u00a0 Some of the most common tasks include country an currency dropdowns, country flags next to the IP, or pre-filling country codes in phone numbers. All of that information is of course standardized and you often just need a library\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":13544,"url":"https:\/\/mamchenkov.net\/wordpress\/2010\/11\/08\/adding-flags-to-gnome-keyboard-layout-switch\/","url_meta":{"origin":27157,"position":1},"title":"Adding flags to Gnome keyboard layout switch","author":"Leonid Mamchenkov","date":"November 8, 2010","format":false,"excerpt":"One of the little things that has been bugging me for a few years now is the Gnome keyboard layout switch. \u00a0I am using two layouts - English and Russian - and instead of having two nice flags, like in KDE, I had to live with 'USA' and 'RUS' letters\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2010\/11\/taskbar.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":47998,"url":"https:\/\/mamchenkov.net\/wordpress\/2020\/03\/28\/asked-countrys-embassy-flags-119-packages\/","url_meta":{"origin":27157,"position":2},"title":"How I asked EVERY countrys embassy for flags [119 packages]","author":"Leonid Mamchenkov","date":"March 28, 2020","format":false,"excerpt":"Here's one of the best YouTube videos I've seen in a very long time.\u00a0 In fact, I love is so much, I've decided to take in effort beyond just sharing it.\u00a0 Watch it first, and then I'll share a list of reasons why I love it. https:\/\/www.youtube.com\/watch?v=Jbix9y8iV38 So, here we\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/img.youtube.com\/vi\/Jbix9y8iV38\/0.jpg?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":47572,"url":"https:\/\/mamchenkov.net\/wordpress\/2020\/03\/11\/google-chrome-tab-groups\/","url_meta":{"origin":27157,"position":3},"title":"Google Chrome Tab Groups","author":"Leonid Mamchenkov","date":"March 11, 2020","format":false,"excerpt":"Thanks to this great tip I've discovered the recently added Tab Groups functionality in Google Chrome browser. All you need to do is navigate to chrome:\/\/flags\/ , search for \"Tab Groups\" feature, enable it, and restart your browser. Once that is done, right-click on any tab and you'll see the\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2020\/03\/google-chrome-tab-groups.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2020\/03\/google-chrome-tab-groups.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2020\/03\/google-chrome-tab-groups.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2020\/03\/google-chrome-tab-groups.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2020\/03\/google-chrome-tab-groups.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2020\/03\/google-chrome-tab-groups.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":22251,"url":"https:\/\/mamchenkov.net\/wordpress\/2014\/07\/22\/useful-skype-commands-roles-and-emoticons\/","url_meta":{"origin":27157,"position":4},"title":"Useful Skype commands, roles, and emoticons","author":"Leonid Mamchenkov","date":"July 22, 2014","format":false,"excerpt":"Just by accident I came across this list of Skype commands and roles. \u00a0I only knew two or three. \u00a0Apparently, there is much more. \u00a0For those of us who use Skype on multiple devices, checkout \/showplaces and \/remotelogout\u00a0: \/showplaces - Lists other instances where this Skype name is currently signed\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":28162,"url":"https:\/\/mamchenkov.net\/wordpress\/2017\/11\/01\/google-chrome-color-profile\/","url_meta":{"origin":27157,"position":5},"title":"Google Chrome color profile","author":"Leonid Mamchenkov","date":"November 1, 2017","format":false,"excerpt":"My good friend and colleague Michael Stepanov has been recently annoyed by some weird color offsets on his external screen in Fedora 26.\u00a0 Turns out, it wasn't the external monitor, video card, or cable issue.\u00a0 The problem was with the new Google Chrome and its choice of the color profile.\u00a0\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/11\/google-chrome-color-profile-500x281.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]}],"jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts\/27157","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/comments?post=27157"}],"version-history":[{"count":0,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts\/27157\/revisions"}],"wp:attachment":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/media?parent=27157"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/categories?post=27157"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/tags?post=27157"},{"taxonomy":"keyring_services","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/keyring_services?post=27157"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}