Snappdf Not Working

I’ve searched and searched and couldn’t find similar issues. Here is my current situation:

Self Hosted v5.5.20
Ubuntu 18.04 VPS on Digital Ocean

I have been using the hostedpdf for some time but decided to revisit getting snappdf to work today. Enabled debugging and the endpoint /api/v1/live_preview?entity=invoice returns the output below.

I discovered snappdf was not working from the CLI when trying vendor/bin/snappdf convert --html "<h1>Hello world</h1>" test.pdf from root of invoiceninja5

Installed additional dependencies and “snappdf convert” is now working and generating PDF as expected however the live_preview endpoint is still returning the response below.

Any suggestions would be greatly appreciated.

{
  "message": "Call to undefined function Symfony\\Component\\Process\\proc_close()",
  "exception": "Error",
  "file": "/var/www/invoice5/vendor/symfony/process/Process.php",
  "line": 1388,
  "trace": [
    {
      "file": "/var/www/invoice5/vendor/symfony/process/Process.php",
      "line": 1299,
      "function": "close",
      "class": "Symfony\\Component\\Process\\Process",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/symfony/process/Process.php",
      "line": 836,
      "function": "updateStatus",
      "class": "Symfony\\Component\\Process\\Process",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/symfony/process/Process.php",
      "line": 428,
      "function": "isRunning",
      "class": "Symfony\\Component\\Process\\Process",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/symfony/process/Process.php",
      "line": 249,
      "function": "wait",
      "class": "Symfony\\Component\\Process\\Process",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/beganovich/snappdf/src/Snappdf.php",
      "line": 229,
      "function": "run",
      "class": "Symfony\\Component\\Process\\Process",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/app/Utils/Traits/Pdf/PdfMaker.php",
      "line": 44,
      "function": "generate",
      "class": "Beganovich\\Snappdf\\Snappdf",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/app/Jobs/Util/PreviewPdf.php",
      "line": 50,
      "function": "makePdf",
      "class": "App\\Jobs\\Util\\PreviewPdf",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/app/Http/Controllers/PreviewController.php",
      "line": 304,
      "function": "handle",
      "class": "App\\Jobs\\Util\\PreviewPdf",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Routing/Controller.php",
      "line": 54,
      "function": "live",
      "class": "App\\Http\\Controllers\\PreviewController",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php",
      "line": 45,
      "function": "callAction",
      "class": "Illuminate\\Routing\\Controller",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Routing/Route.php",
      "line": 261,
      "function": "dispatch",
      "class": "Illuminate\\Routing\\ControllerDispatcher",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Routing/Route.php",
      "line": 204,
      "function": "runController",
      "class": "Illuminate\\Routing\\Route",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
      "line": 725,
      "function": "run",
      "class": "Illuminate\\Routing\\Route",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 141,
      "function": "Illuminate\\Routing\\{closure}",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php",
      "line": 126,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php",
      "line": 62,
      "function": "handleRequest",
      "class": "Illuminate\\Routing\\Middleware\\ThrottleRequests",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "handle",
      "class": "Illuminate\\Routing\\Middleware\\ThrottleRequests",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/app/Http/Middleware/QueryLogging.php",
      "line": 39,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "handle",
      "class": "App\\Http\\Middleware\\QueryLogging",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php",
      "line": 50,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "handle",
      "class": "Illuminate\\Routing\\Middleware\\SubstituteBindings",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/app/Http/Middleware/Locale.php",
      "line": 46,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "handle",
      "class": "App\\Http\\Middleware\\Locale",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/app/Http/Middleware/TokenAuth.php",
      "line": 96,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "handle",
      "class": "App\\Http\\Middleware\\TokenAuth",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/app/Http/Middleware/SetDb.php",
      "line": 40,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "handle",
      "class": "App\\Http\\Middleware\\SetDb",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 116,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
      "line": 726,
      "function": "then",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
      "line": 703,
      "function": "runRouteWithinStack",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
      "line": 667,
      "function": "runRoute",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
      "line": 656,
      "function": "dispatchToRoute",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
      "line": 167,
      "function": "dispatch",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 141,
      "function": "Illuminate\\Foundation\\Http\\{closure}",
      "class": "Illuminate\\Foundation\\Http\\Kernel",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/sentry/sentry-laravel/src/Sentry/Laravel/Http/SetRequestIpMiddleware.php",
      "line": 45,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "handle",
      "class": "Sentry\\Laravel\\Http\\SetRequestIpMiddleware",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/sentry/sentry-laravel/src/Sentry/Laravel/Http/SetRequestMiddleware.php",
      "line": 42,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "handle",
      "class": "Sentry\\Laravel\\Http\\SetRequestMiddleware",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/livewire/livewire/src/DisableBrowserCache.php",
      "line": 19,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "handle",
      "class": "Livewire\\DisableBrowserCache",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/beyondcode/laravel-query-detector/src/QueryDetectorMiddleware.php",
      "line": 27,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "handle",
      "class": "BeyondCode\\QueryDetector\\QueryDetectorMiddleware",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php",
      "line": 66,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "handle",
      "class": "Barryvdh\\Debugbar\\Middleware\\InjectDebugbar",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/app/Http/Middleware/Cors.php",
      "line": 25,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "handle",
      "class": "App\\Http\\Middleware\\Cors",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php",
      "line": 39,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "handle",
      "class": "Illuminate\\Http\\Middleware\\TrustProxies",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",
      "line": 21,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php",
      "line": 31,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",
      "line": 21,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php",
      "line": 40,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\TrimStrings",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php",
      "line": 27,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php",
      "line": 86,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 180,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
      "line": 116,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
      "line": 142,
      "function": "then",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
      "line": 111,
      "function": "sendRequestThroughRouter",
      "class": "Illuminate\\Foundation\\Http\\Kernel",
      "type": "->"
    },
    {
      "file": "/var/www/invoice5/public/index.php",
      "line": 57,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Kernel",
      "type": "->"
    }
  ]
}

That is a pretty wild error I have not seen before.

My Google Foo returns the following:

https://www.php.net/manual/en/function.proc-close.php

Note:

If PHP has been compiled with --enable-sigchild, the return value of this function is undefined.

It looks like the version of PHP you have installed does not have this function available, this surprises me a lot as you are on a VPS so you should have open control for this…

proc_close was in my disabled functions. The server management platform that I use maintains a list of disabled by default functions and it was in the list. I thought I had looked through it previously but I guess I missed it. Snappdf is now working as expected.

Thanks!