Skip to content

Integrating PHP-PM in TechEmpower FrameworkBenchmarks #453

@oozone

Description

@oozone

Hi i'm trying to implement PHP-PM in Laravel for the TechEmpower FrameworkBenchmarks in Docker, but I somehow get worse results than vanilla Laravel (test plaintext):
Laravel 5.8: ~19786 TotalRequests (15sec)
Laravel 5.8 + PHP PM: ~5029 TotalRequests (15sec)

What am I doing wrong here?

This my setup:
Laravel + PHP PM Dockerfile (laravel.dockerfile)

FROM ubuntu:18.10

ARG DEBIAN_FRONTEND=noninteractive

ENV LC_ALL en_US.UTF-8
ENV LANG en_US.UTF-8

RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php
RUN apt-get update -yqq > /dev/null && \
    apt-get install -yqq nginx git unzip php7.3 php7.3-common php7.3-cgi php7.3-cli php7.3-fpm php7.3-mysql   > /dev/null
RUN apt-get install -yqq php7.3-mbstring php7.3-xml  > /dev/null

RUN apt-get install -yqq composer > /dev/null

ADD ./ /laravel
WORKDIR /laravel

ADD etc/php.ini /etc/php7/php.ini
ADD etc/php.ini /etc/php7.3/php.ini
COPY etc/php.ini /etc/php/7.3/cgi/
COPY etc/php.ini /etc/php7.3/cgi/

ADD etc/nginx_default.conf /etc/nginx/sites-enabled/default
ADD etc/nginx.conf /etc/nginx/nginx.conf

RUN mkdir /ppm && cd /ppm && composer require php-pm/php-pm && composer require php-pm/httpkernel-adapter

RUN mkdir -p /laravel/bootstrap/cache
RUN mkdir -p /laravel/storage/framework/sessions
RUN mkdir -p /laravel/storage/framework/views
RUN mkdir -p /laravel/storage/framework/cache

RUN chmod -R 777 /laravel

RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet

RUN php artisan config:cache
RUN php artisan route:cache

ADD /etc/run-nginx.sh /etc/app/run.sh

RUN chmod -R 777 /laravel

EXPOSE 8080

ENTRYPOINT ["/bin/bash","/etc/app/run.sh"]

run-nginx.sh

#!/bin/bash

trapIt () { "$@"& pid="$!"; trap "kill -INT $pid" INT TERM; while kill -0 $pid > /dev/null 2>&1; do wait $pid; ec="$?"; done; exit $ec;};

STATIC=/var/www/
args=" $@ "
if [[ ! $args =~ " --help " ]]; then
  ARG_STATIC=`/ppm/vendor/bin/ppm config --show-option="static-directory" "$@"`
fi

[ ! -z "$ARG_STATIC" ] && STATIC="${STATIC}${ARG_STATIC}"
sed -i "s#STATIC_DIRECTORY#${STATIC}#g" /etc/nginx/sites-enabled/default

nginx

mkdir -p /ppm/run
chmod -R 777 /ppm/run
ARGS='--port=8081 --bootstrap=laravel --socket-path=/ppm/run --pidfile=/ppm/ppm.pid --max-requests=100000 --workers=5 --app-env=prod --debug=0 --logging=0'

# make sure static-directory is not served by php-pm
ARGS="$ARGS --static-directory=''"

trapIt /ppm/vendor/bin/ppm start --ansi $ARGS $@

nginx-default.conf

server {
    listen 8080;
    server_name _;
    root STATIC_DIRECTORY;

    client_max_body_size 1000m;

    location / {
        try_files $uri @ppm;
    }

    location @ppm {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:8081;
    }
}

I also get errors/warnings for some requests like:

laravel: Script did not return a valid HTTP response. Maybe it has called exit() prematurely?
laravel: No slaves available to handle the request and timeout 10 seconds exceeded

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions