{"id":27434,"date":"2017-03-20T12:48:14","date_gmt":"2017-03-20T10:48:14","guid":{"rendered":"https:\/\/mamchenkov.net\/wordpress\/?p=27434"},"modified":"2017-03-20T13:07:20","modified_gmt":"2017-03-20T11:07:20","slug":"getting-started-with-workflows-in-php","status":"publish","type":"post","link":"https:\/\/mamchenkov.net\/wordpress\/2017\/03\/20\/getting-started-with-workflows-in-php\/","title":{"rendered":"Getting started with workflows in PHP"},"content":{"rendered":"<!-- google_ad_section_start -->\n<p>For a large project at work, we need to integrate or develop a workflow engine. \u00a0I worked a little bit with workflow engines in the past, but the subject is way to big and complex for me to claim any expertise in it.<\/p>\n<p>So, I am looking at what&#8217;s available these days and what are our options. \u00a0This post is a collection of initial links and thoughts, and it&#8217;s goal is mostly to document my research process and findings, and not to provide any answers or solutions yet.<\/p>\n<p><!--more--><\/p>\n<p>First things first. \u00a0What am I looking for?<\/p>\n<ul>\n<li><strong>PHP technology stack<\/strong>. \u00a0The project is in PHP, and all our in-house expertise is in PHP, so for now I&#8217;m not going to consider anything too far out. \u00a0Ideally, something for CakePHP framework.<\/li>\n<li><strong>Web-based user interface or configuration files<\/strong>. \u00a0We will need to provide clients with the way to manage the workflows, so either we need a web interface (ideally, for non-technical people), or at least some form of configuration files (most clients who will use it either have their own development teams or will use us to set things up and manage them later).<\/li>\n<li><strong>Open Source software<\/strong>. \u00a0The workflow engine will be embedded into our own projects and products, and at this time we don&#8217;t want to rely on proprietary options. \u00a0BSD or MIT licenses preferable.<\/li>\n<li><strong>Free<\/strong>. \u00a0This is not a hard requirement, but rather a nice to have.<\/li>\n<\/ul>\n<p>The above is not workflow specific, but a general approach to evaluating components that we need. \u00a0Now for the workflow-specific things:<\/p>\n<ul>\n<li><strong>Process management<\/strong>. \u00a0We don&#8217;t have any hard requirements currently, but some use case scenarios include approvals (content publishing, purchasing, registrations, payments, and so on).<\/li>\n<li><strong>Versioning<\/strong>. \u00a0Any workflow that is defined and activated will eventually change.<\/li>\n<li><strong>Visualization<\/strong>. \u00a0 In the ideal world, we&#8217;d have a visual editor to create and edit workflows, but at the very least, existing workflows should be presented in some visual form, like a graph or a chart.<\/li>\n<li><strong>Failures and re-runs<\/strong>. \u00a0Workflow runs will fail occasionally. \u00a0The solution should handle failures gracefully. \u00a0More so, it should allow to re-run either the full workflow or a part of it. \u00a0Re-runs should be supported for successful executions too, not just the failed ones.<\/li>\n<li><strong>Multiple trigger mechanisms<\/strong>. \u00a0Workflows can be triggered based on time (either on specific dates and times, periodically, or based on time since some conditions). \u00a0Data change (creating a new record, editing an existing one, etc) should be able to trigger a workflow run. \u00a0Also, workflow should be triggerable manually, as in the case above, with re-runs.<\/li>\n<li><strong>Flexible actions support<\/strong>. \u00a0Workflow actions should be easy to create, whether it&#8217;s a message sending, a webhook\/web request, or something more specific.<\/li>\n<li><strong>Parallel execution<\/strong>. \u00a0There might be multiple workflows defined for the same record, and they might be executed in parallel, independently of each other.<\/li>\n<li><strong>Logging<\/strong>. \u00a0It should be crystal clear from the logs what triggered which workflow run, what was the status (success, failure), what was changed\/done, etc.<\/li>\n<li><strong>Standard compliance<\/strong>. \u00a0If there are any standards in this domain, it&#8217;d be nice if the solution was compliant with them, in order to minimize the reinvention of the wheel and to increase the interoperability with other tools.<\/li>\n<\/ul>\n<p>I think that&#8217;s enough for now. \u00a0The above might change as I learn more.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/03\/BPMN.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"27438\" data-permalink=\"https:\/\/mamchenkov.net\/wordpress\/2017\/03\/20\/getting-started-with-workflows-in-php\/bpmn\/\" data-orig-file=\"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/03\/BPMN.png?fit=420%2C201&amp;ssl=1\" data-orig-size=\"420,201\" 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=\"BPMN\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/03\/BPMN.png?fit=420%2C201&amp;ssl=1\" class=\"aligncenter size-full wp-image-27438\" src=\"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/03\/BPMN.png?resize=420%2C201&#038;ssl=1\" alt=\"\" width=\"420\" height=\"201\" \/><\/a><\/p>\n<p>Before diving into any specific solutions and comparisons, it&#8217;d be nice to have a better understanding of what&#8217;s available and to get some terminology right. \u00a0As I said, I&#8217;m not an expert in this field, so for now even coming up with Google search terms is a challenge. \u00a0Let&#8217;s get some Wikipedia references here (some of these I&#8217;ve read, and some of these I&#8217;m still chewing up):<\/p>\n<ul>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Workflow\">Workflow<\/a>\u00a0(WF)<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Business_process_management\">Business Process Management<\/a>\u00a0(BPM)<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Process_optimization\">Process Optimization<\/a><\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Business_Process_Model_and_Notation\">Business Process Model and Notation<\/a> (BPMN)<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Workflow_Management_Coalition\">Workflow Management Coalition<\/a> (WfMC)<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Directed_acyclic_graph\">Directed Acyclic Graph<\/a> (DAG)<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Finite-state_machine\">Finate-State Machine<\/a><\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Domain-specific_language\">Domain-Specific Language<\/a> (DSL)<\/li>\n<\/ul>\n<p>OK, so with the above, I&#8217;m starting to build up my terminology vocabulary and it&#8217;s easier to find things now.<\/p>\n<p>From the get-go look at things, it seems that BPMN v2.0 is the standard to consider seriously. \u00a0While there are <a href=\"http:\/\/www.capterra.com\/workflow-management-software\/\">many workflow and business process management options<\/a> to choose from, <a href=\"https:\/\/en.wikipedia.org\/wiki\/List_of_BPMN_2.0_engines\">BPMN v2.0 engines<\/a> are fewer and more clearly defined.<\/p>\n<p>That&#8217;s more than enough theoretical material for the first time. \u00a0Let&#8217;s get a bit more practical. \u00a0What&#8217;s out there, especially in the PHP world?<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/phpmentors-jp\/workflower\">Workflower<\/a> &#8211; a\u00a0BPMN 2.0 workflow engine for PHP.<\/li>\n<li><a href=\"http:\/\/workflow.omnibuilder.com\/\">Omni-Workflow<\/a> &#8211;\u00a0a Workflow Engine for the Web, either as a standalone tool, or as a WordPress plugin.<\/li>\n<li><a href=\"http:\/\/ezcomponents.org\/docs\/api\/latest\/introduction_Workflow.html\">ez Components Workflow<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/yohang\/Finite\">Finite<\/a> &#8211; a simple PHP finite state machine<\/li>\n<li><a href=\"https:\/\/github.com\/lorenzo\/workflow\">lorenzo\/workflow<\/a> &#8211; CakePHP 1.x (?) workflow plugin<\/li>\n<li>davidsteinsland\/cakephp-state-machine &#8211; CakePHP 2.x (?) state machine plugin. Also, <a href=\"https:\/\/github.com\/graemetait\/cakephp-state-machine-behavior\">the behavior repository<\/a>.<\/li>\n<\/ul>\n<p>It&#8217;s too early to make a decision yet, but if I had to right now, I&#8217;d probably go with Workflower, implementing a BPMN v2.0 approach.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<!-- google_ad_section_end -->\n","protected":false},"excerpt":{"rendered":"<!-- google_ad_section_start -->\n<p>For a large project at work, we need to integrate or develop a workflow engine. \u00a0I worked a little bit with workflow engines in the past, but the subject is way to big and complex for me to claim any expertise in it. So, I am looking at what&#8217;s available these days and what are &hellip; <a href=\"https:\/\/mamchenkov.net\/wordpress\/2017\/03\/20\/getting-started-with-workflows-in-php\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Getting started with workflows 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":true,"_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":"Getting started with workflows in PHP #WebDev #PHP #CakePHP #workflow #BPM","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":[3504,1537,38,1117,1330,92],"keyring_services":[],"class_list":["post-27434","post","type-post","status-publish","format-standard","hentry","category-general","category-programming","category-technology","category-web-work","tag-business-process-management","tag-cakephp","tag-php","tag-research","tag-web-development","tag-workflow"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.8 - aioseo.com -->\n\t<meta name=\"description\" content=\"For a large project at work, we need to integrate or develop a workflow engine. I worked a little bit with workflow engines in the past, but the subject is way to big and complex for me to claim any expertise in it. So, I am looking at what&#039;s available these days and what are\" \/>\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\/2017\/03\/20\/getting-started-with-workflows-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=\"Getting started with workflows in PHP - Leonid Mamchenkov\" \/>\n\t\t<meta property=\"og:description\" content=\"For a large project at work, we need to integrate or develop a workflow engine. I worked a little bit with workflow engines in the past, but the subject is way to big and complex for me to claim any expertise in it. So, I am looking at what&#039;s available these days and what are\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mamchenkov.net\/wordpress\/2017\/03\/20\/getting-started-with-workflows-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=\"2017-03-20T10:48:14+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2017-03-20T11:07:20+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=\"Getting started with workflows in PHP - Leonid Mamchenkov\" \/>\n\t\t<meta name=\"twitter:description\" content=\"For a large project at work, we need to integrate or develop a workflow engine. I worked a little bit with workflow engines in the past, but the subject is way to big and complex for me to claim any expertise in it. So, I am looking at what&#039;s available these days and what are\" \/>\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\\\/2017\\\/03\\\/20\\\/getting-started-with-workflows-in-php\\\/#blogposting\",\"name\":\"Getting started with workflows in PHP - Leonid Mamchenkov\",\"headline\":\"Getting started with workflows in PHP\",\"author\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/#person\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/mamchenkov.net\\\/wordpress\\\/wp-content\\\/uploads\\\/2017\\\/03\\\/BPMN.png?fit=420%2C201&ssl=1\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2017\\\/03\\\/20\\\/getting-started-with-workflows-in-php\\\/#articleImage\",\"width\":420,\"height\":201},\"datePublished\":\"2017-03-20T12:48:14+02:00\",\"dateModified\":\"2017-03-20T13:07:20+02:00\",\"inLanguage\":\"en-US\",\"commentCount\":7,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2017\\\/03\\\/20\\\/getting-started-with-workflows-in-php\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2017\\\/03\\\/20\\\/getting-started-with-workflows-in-php\\\/#webpage\"},\"articleSection\":\"All, Programming, Technology, Web work, business process management, CakePHP, PHP, research, web development, workflow\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2017\\\/03\\\/20\\\/getting-started-with-workflows-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\\\/2017\\\/03\\\/20\\\/getting-started-with-workflows-in-php\\\/#listItem\",\"name\":\"Getting started with workflows in PHP\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/#listItem\",\"name\":\"Technology\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2017\\\/03\\\/20\\\/getting-started-with-workflows-in-php\\\/#listItem\",\"position\":4,\"name\":\"Getting started with workflows 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\\\/2017\\\/03\\\/20\\\/getting-started-with-workflows-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\\\/2017\\\/03\\\/20\\\/getting-started-with-workflows-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\\\/2017\\\/03\\\/20\\\/getting-started-with-workflows-in-php\\\/#webpage\",\"url\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2017\\\/03\\\/20\\\/getting-started-with-workflows-in-php\\\/\",\"name\":\"Getting started with workflows in PHP - Leonid Mamchenkov\",\"description\":\"For a large project at work, we need to integrate or develop a workflow engine. I worked a little bit with workflow engines in the past, but the subject is way to big and complex for me to claim any expertise in it. So, I am looking at what's available these days and what are\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2017\\\/03\\\/20\\\/getting-started-with-workflows-in-php\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/#author\"},\"datePublished\":\"2017-03-20T12:48:14+02:00\",\"dateModified\":\"2017-03-20T13:07:20+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":"Getting started with workflows in PHP - Leonid Mamchenkov","description":"For a large project at work, we need to integrate or develop a workflow engine. I worked a little bit with workflow engines in the past, but the subject is way to big and complex for me to claim any expertise in it. So, I am looking at what's available these days and what are","canonical_url":"https:\/\/mamchenkov.net\/wordpress\/2017\/03\/20\/getting-started-with-workflows-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\/2017\/03\/20\/getting-started-with-workflows-in-php\/#blogposting","name":"Getting started with workflows in PHP - Leonid Mamchenkov","headline":"Getting started with workflows in PHP","author":{"@id":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/#author"},"publisher":{"@id":"https:\/\/mamchenkov.net\/wordpress\/#person"},"image":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2017\/03\/BPMN.png?fit=420%2C201&ssl=1","@id":"https:\/\/mamchenkov.net\/wordpress\/2017\/03\/20\/getting-started-with-workflows-in-php\/#articleImage","width":420,"height":201},"datePublished":"2017-03-20T12:48:14+02:00","dateModified":"2017-03-20T13:07:20+02:00","inLanguage":"en-US","commentCount":7,"mainEntityOfPage":{"@id":"https:\/\/mamchenkov.net\/wordpress\/2017\/03\/20\/getting-started-with-workflows-in-php\/#webpage"},"isPartOf":{"@id":"https:\/\/mamchenkov.net\/wordpress\/2017\/03\/20\/getting-started-with-workflows-in-php\/#webpage"},"articleSection":"All, Programming, Technology, Web work, business process management, CakePHP, PHP, research, web development, workflow"},{"@type":"BreadcrumbList","@id":"https:\/\/mamchenkov.net\/wordpress\/2017\/03\/20\/getting-started-with-workflows-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\/2017\/03\/20\/getting-started-with-workflows-in-php\/#listItem","name":"Getting started with workflows in PHP"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/#listItem","name":"Technology"}},{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/2017\/03\/20\/getting-started-with-workflows-in-php\/#listItem","position":4,"name":"Getting started with workflows 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\/2017\/03\/20\/getting-started-with-workflows-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\/2017\/03\/20\/getting-started-with-workflows-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\/2017\/03\/20\/getting-started-with-workflows-in-php\/#webpage","url":"https:\/\/mamchenkov.net\/wordpress\/2017\/03\/20\/getting-started-with-workflows-in-php\/","name":"Getting started with workflows in PHP - Leonid Mamchenkov","description":"For a large project at work, we need to integrate or develop a workflow engine. I worked a little bit with workflow engines in the past, but the subject is way to big and complex for me to claim any expertise in it. So, I am looking at what's available these days and what are","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mamchenkov.net\/wordpress\/#website"},"breadcrumb":{"@id":"https:\/\/mamchenkov.net\/wordpress\/2017\/03\/20\/getting-started-with-workflows-in-php\/#breadcrumblist"},"author":{"@id":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/#author"},"creator":{"@id":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/#author"},"datePublished":"2017-03-20T12:48:14+02:00","dateModified":"2017-03-20T13:07:20+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":"Getting started with workflows in PHP - Leonid Mamchenkov","og:description":"For a large project at work, we need to integrate or develop a workflow engine. I worked a little bit with workflow engines in the past, but the subject is way to big and complex for me to claim any expertise in it. So, I am looking at what's available these days and what are","og:url":"https:\/\/mamchenkov.net\/wordpress\/2017\/03\/20\/getting-started-with-workflows-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":"2017-03-20T10:48:14+00:00","article:modified_time":"2017-03-20T11:07:20+00:00","article:publisher":"https:\/\/www.facebook.com\/MamchenkovBlog","twitter:card":"summary_large_image","twitter:site":"@mamchenkov","twitter:title":"Getting started with workflows in PHP - Leonid Mamchenkov","twitter:description":"For a large project at work, we need to integrate or develop a workflow engine. I worked a little bit with workflow engines in the past, but the subject is way to big and complex for me to claim any expertise in it. So, I am looking at what's available these days and what are","twitter:creator":"@mamchenkov","twitter:image":"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg"},"aioseo_meta_data":{"post_id":"27434","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 08:15:42","updated":"2026-01-15 12:48:47","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\tGetting started with workflows 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":"Getting started with workflows in PHP","link":"https:\/\/mamchenkov.net\/wordpress\/2017\/03\/20\/getting-started-with-workflows-in-php\/"}],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":16391,"url":"https:\/\/mamchenkov.net\/wordpress\/2012\/07\/09\/cakephp-2-1-4-2-2-and-a-pick-into-3-0\/","url_meta":{"origin":27434,"position":0},"title":"CakePHP 2.1.4, 2.2, and a pick into 3.0","author":"Leonid Mamchenkov","date":"July 9, 2012","format":false,"excerpt":"There's been a stream of good news from the CakePHP headquarters recently. \u00a0If you are as slow as me on catching up with these things, here is a quick summary. CakePHP 2.1.4 has been release, and that'll be the last release for the 2.1 branch. \u00a0It's time to move on.\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":27886,"url":"https:\/\/mamchenkov.net\/wordpress\/2017\/08\/31\/cakephp-with-nightwatchjs-on-travis-ci\/","url_meta":{"origin":27434,"position":1},"title":"CakePHP with NightwatchJS on Travis CI","author":"Leonid Mamchenkov","date":"August 31, 2017","format":false,"excerpt":"My colleague Andrey Vystavkin has been setting up a testing environment for our CakePHP projects recently. \u00a0We had one before, of course, using PHPUnit. \u00a0But this time we wanted to add Google Chrome headless browser with some form of JavaScript test suite, so that we could cover functional tests and\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":28376,"url":"https:\/\/mamchenkov.net\/wordpress\/2018\/02\/11\/zeal-vim-offline-cakephp-and-other-documentation\/","url_meta":{"origin":27434,"position":2},"title":"Zeal + Vim = offline CakePHP (and other) documentation","author":"Leonid Mamchenkov","date":"February 11, 2018","format":false,"excerpt":"As any long time Vim user, I'm constantly looking for ways to tweak and improve my text editor configuration, and make me even more efficient.\u00a0 Today, I came across a very handy addition - Zeal\u00a0- an offline documentation browser for developers. (Thanks to this blog post, which also mentions Dash\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\/2018\/02\/Zeal-CakePHP-Inflector-500x265.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":28627,"url":"https:\/\/mamchenkov.net\/wordpress\/2018\/06\/12\/inflected-a-port-of-activesupports-inflector-to-node-js-and-the-browser\/","url_meta":{"origin":27434,"position":3},"title":"Inflected &#8211; a port of ActiveSupport&#8217;s inflector to Node.js and the browser","author":"Leonid Mamchenkov","date":"June 12, 2018","format":false,"excerpt":"For the last few years I have been heavily involved in building web applications with the CakePHP framework.\u00a0 Apart from all the usual MVC, ORM, and so on, and so forth, features, I am a big fan of the CakePHP utilities.\u00a0 And among all of them, my long time favorite\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":27405,"url":"https:\/\/mamchenkov.net\/wordpress\/2017\/03\/10\/using-requirejs-with-cakephp\/","url_meta":{"origin":27434,"position":4},"title":"Using RequireJS with CakePHP","author":"Leonid Mamchenkov","date":"March 10, 2017","format":false,"excerpt":"https:\/\/www.slideshare.net\/StephenYoung6\/require-js-cakephp","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":24147,"url":"https:\/\/mamchenkov.net\/wordpress\/2015\/05\/20\/cakephp-3-orm\/","url_meta":{"origin":27434,"position":5},"title":"CakePHP 3 ORM","author":"Leonid Mamchenkov","date":"May 20, 2015","format":"status","excerpt":"https:\/\/twitter.com\/cakephp\/status\/600970761004851200","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":[]}],"jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts\/27434","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=27434"}],"version-history":[{"count":0,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts\/27434\/revisions"}],"wp:attachment":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/media?parent=27434"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/categories?post=27434"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/tags?post=27434"},{"taxonomy":"keyring_services","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/keyring_services?post=27434"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}