From f99d20ad39a62cf30b6b0b01593336572484f4f5 Mon Sep 17 00:00:00 2001 From: Tiago Natel de Moura Date: Tue, 3 Mar 2020 14:38:08 +0000 Subject: PHP: optimization to avoid surplus chdir(2) calls. For each request, the worker calls the php_execute_script function from libphp that changes to the script directory before doing its work and then restores the process directory before returning. The chdir(2) calls it performs are unnecessary in Unit design. In simple benchmarks, profiling shows that the chdir syscall code path (syscall, FS walk, etc.) is where the CPU spends most of its time. PHP SAPI semantics requires the script to be run from the script directory. In Unit's PHP implementation, we have two use cases: - script - arbitrary path The "script" configuration doesn't have much need for a working directory change: it can be changed once at module initialization. The module needs to chdir again only if the user's PHP script also calls chdir to switch to another directory during execution. If "script" is not used in Unit configuration, we must ensure the script is run from its directory (thus calling chdir before exec), but there's no need to restore the working directory later. Our implementation disables mandatory chdir calls with the SAPI option SAPI_OPTION_NO_CHDIR, instead calling chdir only when needed. To detect the user's calls to chdir, a simple "unit" extension is added that hooks the built-in chdir() PHP call. --- auto/modules/php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'auto') diff --git a/auto/modules/php b/auto/modules/php index 97d1ac43..51b068e7 100644 --- a/auto/modules/php +++ b/auto/modules/php @@ -58,6 +58,7 @@ NXT_PHP=${NXT_PHP_CONFIG%-config*} NXT_PHP_MODULE=${NXT_PHP_MODULE=${NXT_PHP##*/}} NXT_PHP_LIB_PATH=${NXT_PHP_LIB_PATH=} NXT_PHP_LIB_STATIC=${NXT_PHP_LIB_STATIC=no} +NXT_PHP_ADDITIONAL_FLAGS= $echo "configuring PHP module" @@ -75,6 +76,14 @@ if /bin/sh -c "${NXT_PHP_CONFIG} --version" >> $NXT_AUTOCONF_ERR 2>&1; then NXT_PHP_VERSION="`${NXT_PHP_CONFIG} --version`" $echo " + PHP SAPI: [`${NXT_PHP_CONFIG} --php-sapis`]" + NXT_PHP_MAJOR_VERSION=${NXT_PHP_VERSION%%.*} + NXT_PHP_MINOR_VERSION=${NXT_PHP_VERSION#??} + NXT_PHP_MINOR_VERSION=${NXT_PHP_MINOR_VERSION%.*} + + if [ $NXT_PHP_MAJOR_VERSION = 5 -a $NXT_PHP_MINOR_VERSION -lt 4 ]; then + NXT_PHP_ADDITIONAL_FLAGS=-Wno-write-strings + fi + NXT_PHP_INCLUDE="`${NXT_PHP_CONFIG} --includes`" if [ $NXT_PHP_LIB_STATIC = yes ]; then @@ -204,8 +213,8 @@ for nxt_src in $NXT_PHP_MODULE_SRCS; do cat << END >> $NXT_MAKEFILE $NXT_BUILD_DIR/$nxt_obj: $nxt_src $NXT_VERSION_H - \$(CC) -c \$(CFLAGS) \$(NXT_INCS) $NXT_PHP_INCLUDE \\ - -DNXT_ZEND_SIGNAL_STARTUP=$NXT_ZEND_SIGNAL_STARTUP \\ + \$(CC) -c \$(CFLAGS) $NXT_PHP_ADDITIONAL_FLAGS \$(NXT_INCS) \\ + $NXT_PHP_INCLUDE -DNXT_ZEND_SIGNAL_STARTUP=$NXT_ZEND_SIGNAL_STARTUP \\ $nxt_dep_flags \\ -o $NXT_BUILD_DIR/$nxt_obj $nxt_src $nxt_dep_post -- cgit From 75cb2a947d7194c9ef69f9e1b9dedaae2cf1905f Mon Sep 17 00:00:00 2001 From: Valentin Bartenev Date: Wed, 4 Mar 2020 15:24:27 +0300 Subject: PHP: rearranged feature checks in ./configure. Now it prints version even if PHP was built without embed SAPI. --- auto/modules/php | 94 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 48 insertions(+), 46 deletions(-) (limited to 'auto') diff --git a/auto/modules/php b/auto/modules/php index 51b068e7..014bb3e7 100644 --- a/auto/modules/php +++ b/auto/modules/php @@ -110,76 +110,78 @@ if /bin/sh -c "${NXT_PHP_CONFIG} --version" >> $NXT_AUTOCONF_ERR 2>&1; then fi fi - nxt_feature="PHP embed SAPI" - nxt_feature_name="" - nxt_feature_run=no - nxt_feature_incs="${NXT_PHP_INCLUDE}" - nxt_feature_libs="${NXT_PHP_LIB} ${NXT_PHP_LDFLAGS}" - nxt_feature_test=" - #include - #include - - int main() { - php_module_startup(NULL, NULL, 0); - return 0; - }" - - . auto/feature - - if [ $nxt_found = no ]; then - $echo - $echo $0: error: no PHP embed SAPI found. - $echo - exit 1; - fi +else + $echo + $echo $0: error: no PHP found. + $echo + exit 1; +fi - # Bug #71041 (https://bugs.php.net/bug.php?id=71041). - nxt_feature="PHP zend_signal_startup()" - nxt_feature_name="" - nxt_feature_run=no - nxt_feature_incs="${NXT_PHP_INCLUDE}" - nxt_feature_libs="${NXT_PHP_LIB} ${NXT_PHP_LDFLAGS}" - nxt_feature_test=" - #include - #include +nxt_feature="PHP version" +nxt_feature_name="" +nxt_feature_run=value +nxt_feature_incs="${NXT_PHP_INCLUDE}" +nxt_feature_libs="${NXT_PHP_LIB} ${NXT_PHP_LDFLAGS}" +nxt_feature_test=" + #include - int main() { - zend_signal_startup(); - return 0; - }" + int main() { + printf(\"%s\", PHP_VERSION); + return 0; + }" - . auto/feature +. auto/feature - if [ $nxt_found = yes ]; then - NXT_ZEND_SIGNAL_STARTUP=1 - else - NXT_ZEND_SIGNAL_STARTUP=0 - fi -else +nxt_feature="PHP embed SAPI" +nxt_feature_name="" +nxt_feature_run=no +nxt_feature_incs="${NXT_PHP_INCLUDE}" +nxt_feature_libs="${NXT_PHP_LIB} ${NXT_PHP_LDFLAGS}" +nxt_feature_test=" + #include + #include + + int main() { + php_module_startup(NULL, NULL, 0); + return 0; + }" + +. auto/feature + +if [ $nxt_found = no ]; then $echo - $echo $0: error: no PHP found. + $echo $0: error: no PHP embed SAPI found. $echo exit 1; fi -nxt_feature="PHP version" +# Bug #71041 (https://bugs.php.net/bug.php?id=71041). + +nxt_feature="PHP zend_signal_startup()" nxt_feature_name="" -nxt_feature_run=value +nxt_feature_run=no nxt_feature_incs="${NXT_PHP_INCLUDE}" nxt_feature_libs="${NXT_PHP_LIB} ${NXT_PHP_LDFLAGS}" nxt_feature_test=" #include + #include int main() { - printf(\"%s\", PHP_VERSION); + zend_signal_startup(); return 0; }" . auto/feature +if [ $nxt_found = yes ]; then + NXT_ZEND_SIGNAL_STARTUP=1 +else + NXT_ZEND_SIGNAL_STARTUP=0 +fi + if grep ^$NXT_PHP_MODULE: $NXT_MAKEFILE 2>&1 > /dev/null; then $echo -- cgit From afa2f86ecf3ff99b598b14b3448c056b914cd32a Mon Sep 17 00:00:00 2001 From: Valentin Bartenev Date: Wed, 4 Mar 2020 15:24:27 +0300 Subject: PHP: added ZTS indication to ./configure output. --- auto/modules/php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'auto') diff --git a/auto/modules/php b/auto/modules/php index 014bb3e7..e2e5498a 100644 --- a/auto/modules/php +++ b/auto/modules/php @@ -158,6 +158,25 @@ if [ $nxt_found = no ]; then fi +nxt_feature="PHP Zend Thread Safety" +nxt_feature_name="" +nxt_feature_run=no +nxt_feature_incs="${NXT_PHP_INCLUDE}" +nxt_feature_libs="${NXT_PHP_LIB} ${NXT_PHP_LDFLAGS}" +nxt_feature_test=" + #include + #include + + int main() { + #ifndef ZTS + #error ZTS is not defined. + #endif + return 0; + }" + +. auto/feature + + # Bug #71041 (https://bugs.php.net/bug.php?id=71041). nxt_feature="PHP zend_signal_startup()" -- cgit From 7935ea45436ea832344cec945d39a61ae91f2a69 Mon Sep 17 00:00:00 2001 From: Igor Sysoev Date: Fri, 6 Mar 2020 18:28:54 +0300 Subject: Round robin upstream added. --- auto/sources | 1 + 1 file changed, 1 insertion(+) (limited to 'auto') diff --git a/auto/sources b/auto/sources index 98e4a1f4..2283e543 100644 --- a/auto/sources +++ b/auto/sources @@ -69,6 +69,7 @@ NXT_LIB_SRCS=" \ src/nxt_job_resolve.c \ src/nxt_sockaddr.c \ src/nxt_listen_socket.c \ + src/nxt_upstream.c \ src/nxt_upstream_round_robin.c \ src/nxt_http_parse.c \ src/nxt_app_log.c \ -- cgit From 5296be0b82784eb90abc86339e6c16841e9a9727 Mon Sep 17 00:00:00 2001 From: Max Romanov Date: Thu, 12 Mar 2020 17:54:29 +0300 Subject: Using disk file to store large request body. This closes #386 on GitHub. --- auto/help | 1 + auto/options | 6 ++++++ auto/save | 1 + auto/summary | 1 + 4 files changed, 9 insertions(+) (limited to 'auto') diff --git a/auto/help b/auto/help index fe0c7056..f5f10010 100644 --- a/auto/help +++ b/auto/help @@ -20,6 +20,7 @@ cat << END --incdir=DIRECTORY set includes directory name, default: "$NXT_INCDIR" --modules=DIRECTORY set modules directory name, default: "$NXT_MODULES" --state=DIRECTORY set state directory name, default: "$NXT_STATE" + --tmp=DIRECTORY set tmp directory name, default: "$NXT_TMP" --pid=FILE set pid filename, default: "$NXT_PID" --log=FILE set log filename, default: "$NXT_LOG" diff --git a/auto/options b/auto/options index 0d31abad..d315b227 100644 --- a/auto/options +++ b/auto/options @@ -58,6 +58,7 @@ do --incdir=*) NXT_INCDIR="$value" ;; --modules=*) NXT_MODULES="$value" ;; --state=*) NXT_STATE="$value" ;; + --tmp=*) NXT_TMP="$value" ;; --pid=*) NXT_PID="$value" ;; --log=*) NXT_LOG="$value" ;; @@ -149,6 +150,11 @@ case "$NXT_STATE" in *) NXT_STATE="$NXT_PREFIX$NXT_STATE" ;; esac +case "$NXT_TMP" in + /*) ;; + *) NXT_TMP="$NXT_PREFIX$NXT_TMP" ;; +esac + case "$NXT_PID" in /*) ;; *) NXT_PID="$NXT_PREFIX$NXT_PID" ;; diff --git a/auto/save b/auto/save index 350c9c1f..19ef09ec 100644 --- a/auto/save +++ b/auto/save @@ -29,5 +29,6 @@ NXT_LIB_AUX_LIBS= NXT_LIB_UNIT_STATIC='$NXT_LIB_UNIT_STATIC' NXT_MODULES='$NXT_MODULES' +NXT_TMP='$NXT_TMP' END diff --git a/auto/summary b/auto/summary index 59267f6c..833d20c0 100644 --- a/auto/summary +++ b/auto/summary @@ -13,6 +13,7 @@ Unit configuration summary: include directory: ......... "$NXT_INCDIR" modules directory: ......... "$NXT_MODULES" state directory: ........... "$NXT_STATE" + tmp directory: ............. "$NXT_TMP" pid file: .................. "$NXT_PID" log file: .................. "$NXT_LOG" -- cgit