From: Floris Bos <bos@je-eigen-domein.nl>
To: buildroot@busybox.net
Subject: [Buildroot] [PATCH] php: fpm sapi: install startup script
Date: Fri, 01 May 2015 12:42:41 +0200 [thread overview]
Message-ID: <554358A1.6030006@je-eigen-domein.nl> (raw)
In-Reply-To: <5542B8A8.20100@mind.be>
On 05/01/2015 01:20 AM, Arnout Vandecappelle wrote:
>>>> Signed-off-by: Floris Bos <bos@je-eigen-domein.nl>
>>>> ---
>>>> package/php/php-fpm.conf | 14 ++++++++++++++
>>>> package/php/php.mk | 15 +++++++++++++++
>>>> 2 files changed, 29 insertions(+)
>>>> create mode 100644 package/php/php-fpm.conf
>>>>
>>>> diff --git a/package/php/php-fpm.conf b/package/php/php-fpm.conf
>>>> new file mode 100644
>>>> index 0000000..2ffe595
>>>> --- /dev/null
>>>> +++ b/package/php/php-fpm.conf
>>>> @@ -0,0 +1,14 @@
>>>> +[www]
>>>> +# Only start children when there are requests to be processed
>>>> +pm = ondemand
>>>> +# Terminate them again after there haven't been any for 2 minutes
>>>> +pm.process_idle_timeout = 120s
>>>> +# Maximum number of children processing PHP requests concurrently
>>>> +pm.max_children = 32
>>> Isn't that a bit high? Typically embedded web servers will not have the power
>>> to handle that many parallel requests efficiently.
>> Some of the web applications we use feature an AJAX web interface that uses a
>> form of "long polling" to poll for certain events.
> I thought long polling was exactly the opposite: close the connection and poll
> again later. But I don't know about these things :-)
Letting the client Javascript code poll at set intervals -e.g. every
second- and the server returning a response immediately each time, is
traditional polling.
With long polling you let the client wait LONG for the response instead.
The server (PHP code) delays sending the response until there is new
data to report, or a timeout happens (29 seconds in our case) after
which a dummy response is sent to keep the line open, and the client
sends a new long poll request immediately.
Advantage is that the client receives the new data as soon as it is
available, and does not have to have to wait until the next client poll
interval, resulting in a smoother user experience.
Downside is that it esentially ties up at least one PHP process per
logged-in webinterface user, just for the polling.
>
>> That essentially ties up a PHP process per logged-in user, so I like the number
>> a bit higher than usual.
>> Doesn't consume much resources (at least not cpu), but does block for 29 seconds
>> if no events come in.
>> Also scripts that query data from external servers can block as well.
>>
>> The number could be made a little lower, as not everybody does stuff like that.
>> But it doesn't really harm others either, as extra children are only started if
>> all the existing ones are occupied. Not by default.
> However, in a memory-constrained system (which still is one of buildroot's core
> targets), it will trigger OOM when there actually are so many children.
So how many would you recommend as buildroot default?
2? 4? 8? 16?
>
>>>> +
>>>> +listen = /var/run/php-fpm.sock
>>>> +listen.owner = www-data
>>>> +listen.group = www-data
>>>> +user = www-data
>>>> +group = www-data
>>>> +
>>>> diff --git a/package/php/php.mk b/package/php/php.mk
>>>> index e4331f2..6c42aba 100644
>>>> --- a/package/php/php.mk
>>>> +++ b/package/php/php.mk
>>>> @@ -251,6 +251,21 @@ PHP_CONF_OPTS += \
>>>> PHP_DEPENDENCIES += jpeg libpng freetype
>>>> endif
>>>>
>>>> +ifeq ($(BR2_PACKAGE_PHP_FPM),y)
>>>> +define PHP_INSTALL_INIT_SYSV
>>>> + $(INSTALL) -D -m 0755 $(@D)/sapi/fpm/init.d.php-fpm \
>>>> + $(TARGET_DIR)/etc/init.d/S49php-fpm
>>>> +endef
>>> There's also a php-fpm.service that you can install for systemd.
>> Yes, I noticed that before submitting the patch.
>> But I never had much luck with systemd on buildroot.
>>
>> The .service file generated by the PHP build did not work as-is when I tried it
>> this morning.
>>
>> ==
>> Konsole output [Unit]
>> Description=The PHP FastCGI Process Manager
>> After=syslog.target network.target
>>
>> [Service]
>> Type=simple
>> PIDFile=/var/run/php-fpm.pid
>> ExecStart=${exec_prefix}/sbin/php-fpm --nodaemonize --fpm-config /etc/php-fpm.conf
>> ExecReload=/bin/kill -USR2 $MAINPID
>>
>> [Install]
>> WantedBy=multi-user.target
>> ==
>>
>> First problem was that systemd didn't like the ${exec_prefix}
> That should probably have been substituted away by the conf.in -> conf
> conversion...
Also seems to happen when compiling PHP outside of buildroot.
==
max at lynx:/tmp/p/php-5.6.8/sapi/fpm$ cat php-fpm.service
[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target
[Service]
Type=simple
PIDFile=${prefix}/var/run/php-fpm.pid
ExecStart=${exec_prefix}/sbin/php-fpm --nodaemonize --fpm-config
${prefix}/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
max at lynx:/tmp/p/php-5.6.8/sapi/fpm$ cat php-fpm.service.in
[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target
[Service]
Type=@php_fpm_systemd@
PIDFile=@localstatedir@/run/php-fpm.pid
ExecStart=@sbindir@/php-fpm --nodaemonize --fpm-config
@sysconfdir@/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
==
Is that a bug in PHP, or does systemd support variables in .service
descriptions like this, and is the real problem perhaps that we are
failing to set exec_prefix in some kind of global systemd environment file?
Yours sincerely,
Floris Bos
next prev parent reply other threads:[~2015-05-01 10:42 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-30 19:36 [Buildroot] [PATCH] php: fpm sapi: install startup script Floris Bos
2015-04-30 20:27 ` Arnout Vandecappelle
2015-04-30 22:15 ` Floris Bos
2015-04-30 23:20 ` Arnout Vandecappelle
2015-05-01 10:42 ` Floris Bos [this message]
2015-05-01 12:48 ` Arnout Vandecappelle
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=554358A1.6030006@je-eigen-domein.nl \
--to=bos@je-eigen-domein.nl \
--cc=buildroot@busybox.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox