There is no license information available for the latest version (v3.8.0) of this package.

PHP Serverless

v3.8.0 2019-12-27 01:54 UTC


The first and fully functional PHP framework built exclusively for serverless. Support for IBM Cloud Functions

Build status GitHub stars HitCount


  • Easy to learn and start. All required is in this README file.
  • Fully automated and extendable via RoboFile (learn more).
  • Powerful and super fast router (learn more).
  • Lean database library (learn more). Eloquent optional.
  • Lean template engine (learn more). Blade optional.
  • Lean testing framework (learn more). PhpUnit optional.
  • Uses tested serverless deployment framework (learn more)


  1. Step 1
composer create-project --prefer-dist sinevia/php-serverless .
  1. Step 2
vendor/bin/robo init


  • Delete the phpunit.xml file, if you are not going to use PHPUnit for testing
  • Change the settings in /app/config (serverless function name, etc)
  • Change the settings in /env.php (not required usually)


Four environments are specified and available out of the box - local, testing, staging, live.

  1. Local. All development is done on local - (local)
  2. Testing. Automatic tests are run in testing - (testing)
  3. Staging. For user and manual testing depoy to staging - (staging)
  4. Live. For real live usage deploy to live - (live)


To start working on the project run the built in PHP server:

php -S localhost:32222

or using the helper function

vendor/bin/robo serve

Then open in browser: http://localhost:32222/

or using the helper function

vendor/bin/robo open local


To run migrations for each environment:

vendor/bin/robo migrate local
vendor/bin/robo migrate staging
vendor/bin/robo migrate live


The deployment will run your tests, and will continue only if your tests are successful

To deploy to your staging function

vendor/bin/robo deploy staging

To deploy to your live function

vendor/bin/robo deploy live


A RoboFile exists with automated functionality.

  • Run database migrations on local
vendor/bin/robo migrate local
  • Run database migrations on staging
vendor/bin/robo migrate local
  • Run database migrations on live
vendor/bin/robo migrate live
  • Serve the site for development
vendor/bin/robo serve
  • Open local/dev url from terminal
vendor/bin/robo open local
  • Open staging url from terminal
vendor/bin/robo open staging
  • Open live url from terminal
vendor/bin/robo open live
  • Deploy to staging
vendor/bin/robo deploy staging
  • Deploy to live
vendor/bin/robo deploy live


Two testing frameworks supported out of the box:

  1. Testify.php - very lean and straghtforward to work with (preferred, and preinstaled)
  2. PHPUnit - more mature, but heavy weight with many dependencies

To decide which modify the setting in the RoboFile.

Testing with Testify.php

Testify is a small PHP testing library with no extenal dependencies:

Place your tests in /tests/test.php

To run the tests

php tests/test.php


vendor/bin/robo test

Testing with PHPUnit

PHPUnit is a huge PHP testing library. Beware it will come with lots of composer dependencies:

To install the framework with all the dependencies

composer require --dev phpunit/phpunit

Place your settigs in /phpunit.xml. Place your tests in /tests

To run the tests



vendor/bin/robo test


Multiple options

Local CSS and JavaScript files are best to be served minified inline. Helper functions are added

<?php echo joinCss(['/css/main.css','/css/secondary.css']); ?>

Small images (i.e. favicon) serve inline as data.

<img src="<?php echo image2DataUri('/public/img/avatar.png'); ?>" />

To serve static files separately place them in the public directory.


For remote static files use CDN, S3 or other storage.


Functions are defined in file /app/functions.php. Feel free to change or remove.

basePath($path = '')

Returns the top most (root, base) path of the application

baseUrl($path = '')

Returns the top most (root, base) URL of the application


Returns a database instance

env($key, $default = '')

Returns an env variable from OPEN WHISK

htmlFormatPriceWithCurrencySymbol($amount, $currency)


Converts an image path to data URI


Checks if this is a GET request


Checks if this is a POST request

joinCss($styles, $options = [])

Joins multiple CSS files, and optionally minifies them

joinJs($scripts, $options = [])

Joins multiple JavaScript files, and optionally minifies them


Redirects to the specified URL

req($name, $default = null, $functions = [])

Returns the requested $_REQUEST name-value pair if it exists

sess($name, $default = null, $functions = [], $options = [])

Returns the requested $_SESSION name-value pair if it exists

once($name, $default = null, $functions = [], $options = [])

Returns a once value if it exists in $_SESSION. After the value is returned, it is deleted

function reqOrSess($name, $default = null, $functions = [])

ui($view, $vars = array(), $options = array())

Renders a template from app/views. If no extension is specified .phtml is added

view($view, $data)

Renders a Blade template from /views. A /cache folder is required. If using Eloquent for data management this function will clash, delete it, or rename it i.e. to uiBlade($view, $data).

To use the view function you must install Blade:

composer require jenssegers/blade