{"id":3073,"date":"2025-07-06T23:23:40","date_gmt":"2025-07-06T22:23:40","guid":{"rendered":"https:\/\/chewett.co.uk\/blog\/?p=3073"},"modified":"2025-07-06T23:24:06","modified_gmt":"2025-07-06T22:24:06","slug":"celebrating-30-years-of-php-highlights-from-jetbrains-phpverse-2025","status":"publish","type":"post","link":"https:\/\/chewett.co.uk\/blog\/3073\/celebrating-30-years-of-php-highlights-from-jetbrains-phpverse-2025\/","title":{"rendered":"Celebrating 30 Years of PHP: Highlights from Jetbrains PHPVerse 2025"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"381\" data-attachment-id=\"3084\" data-permalink=\"https:\/\/chewett.co.uk\/blog\/3073\/celebrating-30-years-of-php-highlights-from-jetbrains-phpverse-2025\/phpverse-4\/\" data-orig-file=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/phpverse-4.webp?fit=1280%2C720&amp;ssl=1\" data-orig-size=\"1280,720\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"phpverse-4\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/phpverse-4.webp?fit=300%2C169&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/phpverse-4.webp?fit=678%2C381&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/phpverse-4.webp?resize=678%2C381&#038;ssl=1\" alt=\"\" class=\"wp-image-3084\" srcset=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/phpverse-4.webp?resize=1024%2C576&amp;ssl=1 1024w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/phpverse-4.webp?resize=300%2C169&amp;ssl=1 300w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/phpverse-4.webp?resize=768%2C432&amp;ssl=1 768w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/phpverse-4.webp?resize=50%2C28&amp;ssl=1 50w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/phpverse-4.webp?w=1280&amp;ssl=1 1280w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/figure>\n\n\n\n<p>This year I (virtually) attended Jetbrains PHPVerse 2025 celebrating 30 years of PHP.  I have written about two sessions which most interested me.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">30 Years of PHP<\/h2>\n\n\n\n<p>To celebrate 30 years of PHP, Jetbrains brought together a number of speakers to talk about PHP&#8217;s past successes and the future of the modern PHP ecosystem.<\/p>\n\n\n\n<p>The full set of videos are available: <a href=\"https:\/\/lp.jetbrains.com\/phpverse-2025\/\">https:\/\/lp.jetbrains.com\/phpverse-2025\/<\/a> <a href=\"https:\/\/www.youtube.com\/playlist?list=PL0bgkxUS9EaI6rjDdRvihJn90OztDsxTO\">https:\/\/www.youtube.com\/playlist?list=PL0bgkxUS9EaI6rjDdRvihJn90OztDsxTO<\/a><\/p>\n\n\n\n<p>In this blog I will talk about two of the talks that I found most interesting, FrankenPHP and MCP in PHP.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FrankenPHP: The future of PHP?<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"377\" data-attachment-id=\"3081\" data-permalink=\"https:\/\/chewett.co.uk\/blog\/3073\/celebrating-30-years-of-php-highlights-from-jetbrains-phpverse-2025\/image-4\/\" data-orig-file=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-3.png?fit=2286%2C1272&amp;ssl=1\" data-orig-size=\"2286,1272\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-3.png?fit=300%2C167&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-3.png?fit=678%2C377&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-3.png?resize=678%2C377&#038;ssl=1\" alt=\"\" class=\"wp-image-3081\" srcset=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-3.png?resize=1024%2C570&amp;ssl=1 1024w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-3.png?resize=300%2C167&amp;ssl=1 300w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-3.png?resize=768%2C427&amp;ssl=1 768w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-3.png?resize=1536%2C855&amp;ssl=1 1536w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-3.png?resize=2048%2C1140&amp;ssl=1 2048w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-3.png?resize=50%2C28&amp;ssl=1 50w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-3.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/figure>\n\n\n\n<p>This talk was presented by K\u00e9vin Dunglas and gave an overview of FrankenPHP, a modern high-performance PHP Application server. The talk can be viewed here: <a href=\"https:\/\/www.youtube.com\/watch?v=k-UwH91XnAo\">https:\/\/www.youtube.com\/watch?v=k-UwH91XnAo<\/a><\/p>\n\n\n\n<p>Historically PHP applications have been run using NGINX+PHP-FPM or apache+mod_php. These integrate well into modern webserver&#8217;s however the PHP ecosystem has been lacking a &#8220;first class&#8221; application server.<\/p>\n\n\n\n<p>This is where FrankenPHP comes in, with some added bonuses too.<\/p>\n\n\n\n<p>FrankenPHP integrates the entire PHP engine as a module in GO allowing for considerably faster performance. Alongside this it bundles Caddy, allowing you to easily integrate PHP and the webserver to your app. Since these are both native Go projects they are able to work in tandem using Goroutines and channels to communicate.<\/p>\n\n\n\n<p>In addition to being fast, deployment of FrankenPHP is easy. A docker project is available to bundle whatever your project needs. This allows each project to run with it&#8217;s own PHP version and not contaminate your global packages.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Worker mode &#8211; Making your PHP even faster<\/h3>\n\n\n\n<p>FrankenPHP enables loading your application into memory and then continually serving requests without reloading. This differs from standard PHP-CGI processes repeatedly loading your application and state as requests are made.<\/p>\n\n\n\n<p>This works by utilising goroutines and channels to communicate across the various processes. Each goroutine will serve many requests over it&#8217;s lifetime. This is achieved by keeping the global application state in memory but resetting it each time it serves a request.<\/p>\n\n\n\n<p>This can be enabled by specifying a worker file which will be loaded by the webserver and handle requests. This is natively supported by Symfony, Laravel, platform.sh, and numerous other libraries.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Go Extensions in PHP?!<\/h3>\n\n\n\n<p>As FrankenPHP integrates PHP using Go, this enables an exciting ability to integrate Go into PHP. Native Go code can be added to create high performance extensions natively callable by your PHP. This also enables you to integrate existing go libraries into PHP.<\/p>\n\n\n\n<p>These Go extensions can run concurrently and share data between requests, allowing for further performance improvements by delegating some of the PHP work to Go.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Summary<\/h3>\n\n\n\n<p>As part of the 30 year PHP celebrations the PHP foundation announced that FrankenPHP was being officially adopted. To me this makes it clear that the PHP foundation sees this as the future webserver of modern PHP. The ability to integrate Goroutines into PHP directly will enable further performance improvements over the already impressive speed boost Go provides.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">MCP in PHP<\/h2>\n\n\n\n<p>This talk was given by Marcel Pociot and he gave an overview of the MCP is and how it could be built using PHP. The talk can be viewed here: <a href=\"https:\/\/www.youtube.com\/watch?v=T22_rXew72M\">https:\/\/www.youtube.com\/watch?v=T22_rXew72M<\/a><\/p>\n\n\n\n<p>First he explained that MCP stands for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Model &#8211; Any sort of generational model, video, audio, etc, But typically LLM&#8217;s<\/li>\n\n\n\n<li>Context &#8211; Most generational models cannot perform complex queries without some form of added context. In MCP frameworks Tools, Resources, Prompts, and Sampling are all available context options<\/li>\n\n\n\n<li>Protocol &#8211; This defines the way for a generational model to make requests and receive the results. Typically these are stdio, Server-Sent events (SSE), or Websockets<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"381\" data-attachment-id=\"3082\" data-permalink=\"https:\/\/chewett.co.uk\/blog\/3073\/celebrating-30-years-of-php-highlights-from-jetbrains-phpverse-2025\/image-5\/\" data-orig-file=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-4-scaled.png?fit=2560%2C1441&amp;ssl=1\" data-orig-size=\"2560,1441\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-4-scaled.png?fit=300%2C169&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-4-scaled.png?fit=678%2C381&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-4.png?resize=678%2C381&#038;ssl=1\" alt=\"\" class=\"wp-image-3082\" srcset=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-4-scaled.png?resize=1024%2C576&amp;ssl=1 1024w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-4-scaled.png?resize=300%2C169&amp;ssl=1 300w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-4-scaled.png?resize=768%2C432&amp;ssl=1 768w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-4-scaled.png?resize=1536%2C865&amp;ssl=1 1536w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-4-scaled.png?resize=2048%2C1153&amp;ssl=1 2048w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-4-scaled.png?resize=50%2C28&amp;ssl=1 50w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-4-scaled.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/figure>\n\n\n\n<p>A MCP client acts as a middle-man between LLM&#8217;s or AI models and various MCP servers. These allow generational models to offer a lot smarter functionality.<\/p>\n\n\n\n<p>With the PHP MCP SDK you can build a MCP Server application allowing you to integrate with standard AI assistants such as Claude, Cursor, and ChatGPT.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"380\" data-attachment-id=\"3092\" data-permalink=\"https:\/\/chewett.co.uk\/blog\/3073\/celebrating-30-years-of-php-highlights-from-jetbrains-phpverse-2025\/image-6\/\" data-orig-file=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-5-scaled.png?fit=2560%2C1436&amp;ssl=1\" data-orig-size=\"2560,1436\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-5-scaled.png?fit=300%2C168&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-5-scaled.png?fit=678%2C380&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-5.png?resize=678%2C380&#038;ssl=1\" alt=\"\" class=\"wp-image-3092\" srcset=\"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-5-scaled.png?resize=1024%2C574&amp;ssl=1 1024w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-5-scaled.png?resize=300%2C168&amp;ssl=1 300w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-5-scaled.png?resize=768%2C431&amp;ssl=1 768w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-5-scaled.png?resize=1536%2C861&amp;ssl=1 1536w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-5-scaled.png?resize=2048%2C1148&amp;ssl=1 2048w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-5-scaled.png?resize=50%2C28&amp;ssl=1 50w, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/image-5-scaled.png?w=1356&amp;ssl=1 1356w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><figcaption class=\"wp-element-caption\">Example PHP function interfacing with the PHP MCP SDK <\/figcaption><\/figure>\n\n\n\n<p>By integrating with this framework you can expose native PHP to a model and use it to perform complex actions. This can allow you to make your application &#8220;AI-ready&#8221; by offering a standard MCP server entrypoint allowing you to supercharge your apps usefulness.  <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Summary<\/h3>\n\n\n\n<p>I think it&#8217;s very likely that more systems will offer integrations as MCP servers. This could then become the the primary way people interact with services. This would eliminate the traditional &#8220;front-end&#8221; to services allowing bespoke integration. Instead users would end up going through a generational model to access and perform actions on your service.<\/p>\n\n\n\n<p>This will enable building more smart AI agents on top of traditional API&#8217;s allowing automation of work or service requests.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Overview of Jetbrains PHPVerse 2025<\/h2>\n\n\n\n<p>In the last few years PHP has revolutionised language development with it&#8217;s continued performance boosts, improvements to the standard library and developer experience. It&#8217;s recent move towards a JIT compiled runtime, the ability to strongly type it, and mature frameworks show it&#8217;s come a long way in 30 years. It&#8217;s moved from a simple way to a host personal homepages to scaling to billions of page visits.<\/p>\n\n\n\n<p>With projects like FrankenPHP reimagining how it you run PHP it&#8217;s highly likely the language will continue to innovate for another 30 years. I wonder what it will look like then&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This year I (virtually) attended Jetbrains PHPVerse 2025 celebrating 30 years of PHP. I have written about two sessions which most interested me.<\/p>\n","protected":false},"author":1,"featured_media":3084,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":false,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"enabled":false},"version":2}},"categories":[5],"tags":[66],"class_list":["post-3073","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informational","tag-php"],"wppr_data":{"cwp_meta_box_check":"No"},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2025\/07\/phpverse-4.webp?fit=1280%2C720&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p2toWX-Nz","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":2407,"url":"https:\/\/chewett.co.uk\/blog\/2407\/how-to-remove-teamcity-as-a-service-on-windows\/","url_meta":{"origin":3073,"position":0},"title":"How to remove TeamCity as a Service on Windows","author":"Chewett","date":"February 29, 2020","format":false,"excerpt":"Today I am leaving a note on how to remove the Jetbrains TeamCity service on Windows. Removing TeamCity as a service on Windows To remove the TeamCity service you will need to find the location of your TeamCity install. For me I had installed it under: C:\\Teamcity\\ Once in this\u2026","rel":"","context":"In &quot;Informational&quot;","block_context":{"text":"Informational","link":"https:\/\/chewett.co.uk\/blog\/category\/informational\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2020\/02\/remove_teamcity_service_icon.jpg?fit=800%2C800&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2020\/02\/remove_teamcity_service_icon.jpg?fit=800%2C800&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2020\/02\/remove_teamcity_service_icon.jpg?fit=800%2C800&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2020\/02\/remove_teamcity_service_icon.jpg?fit=800%2C800&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":2409,"url":"https:\/\/chewett.co.uk\/blog\/2409\/how-to-install-teamcity-as-a-service-on-windows\/","url_meta":{"origin":3073,"position":1},"title":"How to install TeamCity as a Service on Windows","author":"Chewett","date":"March 14, 2020","format":false,"excerpt":"Today I have written a small note on how to install the Jetbrains TeamCity service on windows. Installing TeamCity as a service on Windows To install TeamCity as a service you will need to find the location of your TeamCity install. For me I have installed it under: C:\\Teamcity\\ Once\u2026","rel":"","context":"In &quot;Informational&quot;","block_context":{"text":"Informational","link":"https:\/\/chewett.co.uk\/blog\/category\/informational\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2020\/02\/install_teamcity_service_icon.jpg?fit=800%2C800&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2020\/02\/install_teamcity_service_icon.jpg?fit=800%2C800&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2020\/02\/install_teamcity_service_icon.jpg?fit=800%2C800&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2020\/02\/install_teamcity_service_icon.jpg?fit=800%2C800&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":148,"url":"https:\/\/chewett.co.uk\/blog\/148\/location-geoip-dat-php\/","url_meta":{"origin":3073,"position":2},"title":"Location of GeoIP.dat for PHP","author":"Chewett","date":"September 1, 2013","format":false,"excerpt":"To find the location of GeoIP for PHP you can ssh into the server and use the \"find\" command. find \/ -iname GeoIP.dat Will return a list of file paths where the file with this name is found. In my case I found: \/usr\/share\/GeoIP\/GeoIP.dat \/usr\/local\/share\/GeoIP\/GeoIP.dat \/opt\/geoip\/share\/GeoIP\/GeoIP.dat In my case the\u2026","rel":"","context":"In &quot;Informational&quot;","block_context":{"text":"Informational","link":"https:\/\/chewett.co.uk\/blog\/category\/informational\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":519,"url":"https:\/\/chewett.co.uk\/blog\/519\/configuring-teamcity-php-project\/","url_meta":{"origin":3073,"position":3},"title":"Configuring TeamCity for a PHP project","author":"Chewett","date":"September 16, 2017","format":false,"excerpt":"This post describes configuring TeamCity for a PHP project using composer. Setting up continuous integration of unit testing from a git repository. Setting up PHP, composer and git The first step to running your PHP project on TeamCity is installing PHP and the appropriate\u00a0libraries. The only requirement for this is\u2026","rel":"","context":"In &quot;Informational&quot;","block_context":{"text":"Informational","link":"https:\/\/chewett.co.uk\/blog\/category\/informational\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2017\/09\/configuring_php_unit_testing_with_teamcity.jpg?fit=800%2C800&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2017\/09\/configuring_php_unit_testing_with_teamcity.jpg?fit=800%2C800&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2017\/09\/configuring_php_unit_testing_with_teamcity.jpg?fit=800%2C800&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2017\/09\/configuring_php_unit_testing_with_teamcity.jpg?fit=800%2C800&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":2420,"url":"https:\/\/chewett.co.uk\/blog\/2420\/fixing-gradle-error-unnecessarily-replacing-a-task-that-does-not-exist-is-not-supported\/","url_meta":{"origin":3073,"position":4},"title":"Fixing Gradle error Unnecessarily replacing a task that does not exist is not supported.","author":"Chewett","date":"March 7, 2020","format":false,"excerpt":"This short blog post talks about why you get this error and how to fix \"Unnecessarily replacing a task that does not exist is not supported\". What is the error and why does it occur When you attempt to run or debug a method using Gradle and IntelliJ you may\u2026","rel":"","context":"In &quot;Fixes&quot;","block_context":{"text":"Fixes","link":"https:\/\/chewett.co.uk\/blog\/category\/fixes\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2020\/03\/fixing_gradle6_error_icon.jpg?fit=800%2C800&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2020\/03\/fixing_gradle6_error_icon.jpg?fit=800%2C800&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2020\/03\/fixing_gradle6_error_icon.jpg?fit=800%2C800&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2020\/03\/fixing_gradle6_error_icon.jpg?fit=800%2C800&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":1221,"url":"https:\/\/chewett.co.uk\/blog\/1221\/how-combining-php-flags-works-for-function-calls\/","url_meta":{"origin":3073,"position":5},"title":"How combining PHP flags works for function calls","author":"Chewett","date":"June 2, 2018","format":false,"excerpt":"Here I talk a bit about how combining PHP flags work and why we use a vertical bar to combine them. What can flags do with functions? Some PHP functions have a parameter called $options that allow changing how it operates. One or many flags can be passed into this\u2026","rel":"","context":"In &quot;Informational&quot;","block_context":{"text":"Informational","link":"https:\/\/chewett.co.uk\/blog\/category\/informational\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2018\/06\/combining_flags_php.jpg?fit=800%2C800&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2018\/06\/combining_flags_php.jpg?fit=800%2C800&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2018\/06\/combining_flags_php.jpg?fit=800%2C800&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/chewett.co.uk\/blog\/wp-content\/uploads\/2018\/06\/combining_flags_php.jpg?fit=800%2C800&ssl=1&resize=700%2C400 2x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/chewett.co.uk\/blog\/wp-json\/wp\/v2\/posts\/3073","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/chewett.co.uk\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/chewett.co.uk\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/chewett.co.uk\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/chewett.co.uk\/blog\/wp-json\/wp\/v2\/comments?post=3073"}],"version-history":[{"count":14,"href":"https:\/\/chewett.co.uk\/blog\/wp-json\/wp\/v2\/posts\/3073\/revisions"}],"predecessor-version":[{"id":3095,"href":"https:\/\/chewett.co.uk\/blog\/wp-json\/wp\/v2\/posts\/3073\/revisions\/3095"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/chewett.co.uk\/blog\/wp-json\/wp\/v2\/media\/3084"}],"wp:attachment":[{"href":"https:\/\/chewett.co.uk\/blog\/wp-json\/wp\/v2\/media?parent=3073"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/chewett.co.uk\/blog\/wp-json\/wp\/v2\/categories?post=3073"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/chewett.co.uk\/blog\/wp-json\/wp\/v2\/tags?post=3073"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}