Allgemein

Heroku – PHP Worker (Symfony3)

Many are using heroku, and I guess with a similar config to our initial one:

web: vendor/bin/heroku-php-nginx -C nginx_app.conf web/
worker: bin/console queue:worker

This seems right but something was missing

  • custom ini was not applied
  • the worker could crash and would not respawn at all (this was bad!)

to get our ini to work we passed it directly to the php command, next was to have a simple bash loop to always have a worker running.

worker: while true; do php --php-ini web/.user.ini bin/console queue:worker; sleep 1; done

There must be a better way

It’s almost painful to look at that worker configuration… There must be a way to respawn. Sadly I did not find any Bundles / finished solutions.

Note: I did not add the php –php-ini web/.user.ini  to all examples (but it should be there!)

The Idea

A command should behave kind of like a ThreadPool and restart it’s children once they quit. And in the end I want to call it like this:

worker: bin/console thread:pool --threads=4 queue:worker

The Solution

to make our process handling easier use symfony/process. Next just create a new Console command to handle several processes and keep track of them.

composer require symfony/process

And a very basic Pool:

$threads = 4;
$command = 'bin/console something';

while (true) {
  for ($i = 0; $i < $threads; $i ++) {
    if ($pool[$i] instanceof \Symfony\Component\Process\Process 
        && ($pool[$i]->isRunning() || !$pool[$i]->isStarted())
    ) {
      continue;
    }

    // here we start the process
    $pool[$i] = new \Symfony\Component\Process\Process($command);
    $pool[$i]->start();
  }

  usleep(500000); // this is important, you want to sleep some time
}

This makes it possible to have a single command trigger the amount of workers we need.

You can see the complete command here: gist.github.com/wodka/23475d36cf13e956b8db7578bf6251ed

Screen Shot 2017-04-14 at 17.38.50

Logging

this is something I missed initially. Heroku collects logs that are written to stdout – therefore we have to get the output of the processes written to our main process.

Thankfully the Process::start takes a callable with 2 arguments, $type and $buffer.

 

Allgemein, Arbeit

Unit tests for SF2 with IntelliJ / PHPStorm and Vagrant

you require a working Symfony instance running through Vagrant.

Prerequisites

1) Install Remote Interpreter

remote_php

2) Add a Remote PHP Interpreter.

use vagrant ssh-config to get required information

Screen Shot 2016-02-17 at 14.11.57

3) Setup Path Mapping (Deployment Server)

Screen Shot 2016-02-17 at 14.47.11

 

4) Setup PHPUnit

Screen Shot 2016-02-18 at 00.04.27.png

create a file in app/phpunit.php and use it as a custom loader for phpunit:

<?php

if (!defined('PHPUNIT_COMPOSER_INSTALL')) {
    define('PHPUNIT_COMPOSER_INSTALL', __DIR__ . '/autoload.php');
}

require_once 'autoload.php';

this allows you to use @runInSeparateProcess till https://youtrack.jetbrains.com/issue/WI-29458 is fixed

 

 

Now everything should be setup and you can run the tests in Vagrant 🙂

Allgemein

Bitbucket Build Status from Codeship

Maybe you have heard about the new Build Status in Bitbucket – it’s awesome and shows you how good your commit / pull request is doing.

There is still a lot to be improved especially for pull requests compared to github but they will get there!

bitbucket

Integrate Codeship

Create a php file anywhere (must be reachable from the web) with the following content: snippet link

The script accepts the json data from codeship and pushes the build status (in progress | failed | success) to bitbucket. Also fill in your credentials from bitbucket!

 

that’s it 🙂 enjoy!

mobile

Fabric.io and Ionic

UPDATE 2017-02-19: use the plugin https://github.com/sarriaroman/FabricPlugin instead, crashlytics is now part of fabric

If you are looking for a great framework for crash reporting with your hybrid mobile app – look no further.

 

Right now there are only a few working out of the box in this constellation – crittercism is one of them but do not go there… here are a few reasons why you should not try them

  1. ui is slow
  2. if you are in europe it will be a bit buggy – at least it was for me, telling them about errors in their error reporting code base… (this is not how I expected this to work)
  3. very slow support
  4. expensive (cheap compared to new relic but still)

 

Now to Fabric.io (formerly known as crashlytics)

The Setup

this is tricky 😀 follow any guide you like for ionic, and then inside Android Studio install the Fabric.IO plugin. Warning – there are quite a lot of plugins for crashlytics that no longer work…

crashlytics_step_1Next step is to open the platform/android as a separate android project – this will enable you to add the fabric code to your application. There is also a .fabric-io file in the android project root – this will contain your application secret.

Next step is fairly simple:

ionic plugin add https://github.com/DrMoriarty/cordova-fabric-crashlytics-plugin –variable CRASHLYTICS_API_KEY=YOURKEY –variable CRASHLYTICS_API_SECRET=YOURSECRET

 

well that’s it 🙂

If you have not yet finished the fabric setup you’ll have to trigger an error – this is quite simple by attaching the debuger (chrome://inspect) and calling

navigator.crashlytics.simulateCrash()

Screen Shot 2016-01-18 at 23.43.04

final words

I really like crashlytics and now it’s usable for both android and ios clients! Go build your hybrid apps and add useful crash reporting