Our Software Stack
Over the years we found that certain philosophies work better than others for producing complex software systems. Our software stack is constantly evolving in-step with new advancements and best practices. As a result our solutions are built on top of several core technologies which are both cutting edge and industry standard.
Zend Framework 2 (PHP application framework)
Zend Framework 2 (ZF2) is an object-oriented (OO) MVC application framework for developing web applications and web services using PHP 5.4. Zend Framework 2 was rebuilt from the ground up to conform to latest software engineering trends and best practices. The framework appropriates OO patterns from seasoned Java frameworks to deliver a PHP framework which overcomes common challenges of developing large, complex systems using PHP.
ZF2's EventManager brings AOP (aspect oriented programming) to PHP. It allows us to engineer universally reusable components which can still work together by communicating via an event based API. The Service Manager component uses service factories to elegantly take care of object instantiation and instance caching without the need for complicating the code with dependency injection containers.
Zend Framework is also the framework of choice for developing web services. To this end it provides components for both serving and consuming SOAP, XML-RPC, JSON-RPC and REST web services. Last but not least Zend Framework 2 supports composer and integrates nicely with Doctrine ORM.
Michelangelo van Dam explains why Zend Framework powers Enterprise and Government systems here
Ubuntu Server (Server-side Linux OS)
Our operating system of choice is Ubuntu Server Linux. We switched from Debian to Ubuntu Server in 2010. At this time Ubuntu server was still emerging as an alternative to Debian and Red Hat. Using Ubuntu Server gives us access to newer packages while still maintaining the very highest standards in stability. Ubuntu Server is based on Debian and features the same package manager which makes this Linux distro cost-effective to manage and maintain.
Latest statistics from CloudWatch show that in the last two years Ubuntu Server went from being a new player in production environments to an overwhelming industry leader. In 2013 60% of all Amazon Instances are running Ubuntu Server.
For up-to-date Ubuntu Server market share info visit the CloudMarket website here: http://thecloudmarket.com/stats#/by_platform_definition
Composer (Dependency manager)
Composer is PHP's answer to dependency management. It allows code from several projects to be installed into one solution while maintaining control over the sources and versions of each dependency. Composer also takes care of auto-loading the required dependencies even when each project follows different class and file naming conventions. Dependencies can be installed from a variety of sources including composer packages, pear packages, zip archives and VCS systems. Composer also allows us to propagate changes to dependencies throughout the development team by including the composer.lock file in version control.
Doctrine ORM (Persistence layer)
When creating large systems most of the effort goes into modeling one or more specific business domains and then realizing that model as a physical software layer. This layer is the M in MVC.
When creating business systems and other large data-centric applications our goal is to analyze the business domain and produce a conceptual model of entities and relationships between those entities. We then implement each entity as a model class with type information, data and behavior.
An ORM automates the saving and loading of these models to a relational database like MySQL or Oracle. Additionally DQL (Doctrine Query Language) gives us a high level query language for searching, retrieving and updating out models.
Using ZF2 and Doctrine 2 together makes this very easy to maintain via the doctrine orm annotation manager. Essentially all we have to do is specify some data type and relationship information for each data element in a PHP docblock comment right in the model class. Doctrine is then able to generate (or update) a database schema and act as a mapper between plain old PHP objects (POPOs) and the database.
Because Doctrine also acts as a database abstraction layer (DBAL) it becomes very easy to switch from one database solution like MySQL to another like Orcale.
Solr (Search engine)
A core requirement of any information system is that users should be able to search and navigate information effortlessly. To achieve this it is often necessary to incorporate complex query logic with fuzzy and fault tolerant searching. In mid to large-scale datasets these operations can become very slow and often end up degrading user experience or are not offered at all and the user is forced to browse through long lists of data items.
We solve this problem by maintaining a no-sql search index which has its own dedicated hardware resources and can be scaled independently of the database. When it comes to versatility in search platforms we believe that Solr and Lucene currently offer unmatched flexibility and customization.
Solr search server is java servlet implementation of a webservice providing indexing and search functions implemented by the Lucene engine.