Site icon TheWindowsUpdate.com

Concurrency on Azure Functions (PHP) with custom handlers

This post has been republished via RSS; it originally appeared at: New blog articles in Microsoft Tech Community.

PHP is not among supported languages in Azure Functions, but one can easily implement that with the help of Azure Functions custom handlers. There are several posts over the Internet guiding you how to set up a PHP Function with custom handlers, but one needs to pay attention to the concurrency here, or he/she may easily ends up with HTTP 500.121(Timeout).

 

Performance bottleneck

I created one PHP function app following the guidance from Internet, below is the host.json file. The HTTP trigger function is quite simple, it will only sleep 50 seconds once it is triggered before return. When I send 10 requests almost at the same time, the response time of each requests is increasing, until it reaches 230s(the maximum time IIS server on Azure App Service allowed) and returns HTTP 500.121(Timeout).

 

 

{ "version": "2.0", "logging": { "applicationInsights": { "samplingSettings": { "isEnabled": true, "excludedTypes": "Request" } } }, "extensionBundle": { "id": "Microsoft.Azure.Functions.ExtensionBundle", "version": "[2.*, 3.0.0)" }, "customHandler": { "description": { "defaultExecutablePath": "php", "workingDirectory": "", "arguments": [ "-S", "127.0.0.1:%FUNCTIONS_CUSTOMHANDLER_PORT%", "router.php" ], "enableForwardingHttpRequest": true } } }

 

 

Requests response time:

PreciseTimeStamp

Cs_method

Cs_uri_stem

S_port

Sc_status

Sc_substatus

Sc_win32_status

Time_taken(ms)

2021-09-27 06:28:45.1512587

GET

/api/function1

443

200

0

0

50027

2021-09-27 06:28:45.1722946

GET

/api/function1

443

200

0

0

73530

2021-09-27 06:29:45.1965994

GET

/api/function1

443

200

0

0

123586

2021-09-27 06:30:45.2202146

GET

/api/function1

443

200

0

0

173613

2021-09-27 06:31:45.2311004

GET

/api/function1

443

200

0

0

223630

2021-09-27 06:31:45.2390925

GET

/api/function1

443

500

121

0

230002

2021-09-27 06:32:45.3702086

GET

/api/function1

443

500

121

0

230001

2021-09-27 06:33:45.4016691

GET

/api/function1

443

500

121

0

230003

2021-09-27 06:34:45.4178058

GET

/api/function1

443

500

121

0

230005

 

Root Cause

If you get back and check my host.json again, you will notice that I am launching a PHP built-in web server with the help of Azure Functions custom handlers. The web server runs only one single-threaded process, so PHP applications will stall if a request is blocked.

 

 

php -S 127.0.0.1:%FUNCTIONS_CUSTOMHANDLER_PORT% router.php

 

 

One doc you may reference: 

https://www.php.net/manual/en/features.commandline.webserver.php

 

What I can do

Attach the Dockerfile below to your reference.

 

 

# To enable ssh & remote debugging on app service change the base image to the one below FROM mcr.microsoft.com/azure-functions/dotnet:3.0-appservice ENV AzureWebJobsScriptRoot=/home/site/wwwroot \ AzureFunctionsJobHost__Logging__Console__IsEnabled=true #COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"] RUN apt -y install lsb-release apt-transport-https ca-certificates RUN wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg RUN echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php.list RUN apt update && apt install php7.4 -y COPY . /home/site/wwwroot

 

 

 

Exit mobile version