php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Return to Bug #61045
Patch bug61045-5.4.patch revision 2012-05-05 15:53 UTC by fat@php.net
Patch bug61045-5.3.patch revision 2012-05-05 15:53 UTC by fat@php.net
Patch patch-5.3.10-error_log revision 2012-03-04 18:16 UTC by ewgraf at gmail dot com

Patch bug61045-5.3.patch for FPM related Bug #61045

Patch version 2012-05-05 15:53 UTC

Return to Bug #61045 | Download this patch
This patch renders other patches obsolete

Obsolete patches:

Patch Revisions:

Developer: fat@php.net

diff --git a/NEWS b/NEWS
index 7bb6cc0..84c9e6e 100644
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,9 @@ PHP                                                                        NEWS
   . Fixed bug #61812 (Uninitialised value used in libmagic). 
     (Laruence, Gustavo)
 
+- FPM
+  . Fixed bug #61045 (fpm don't send error log to fastcgi clients). (fat)
+
 - JSON
   . Fixed bug #61537 (json_encode() incorrectly truncates/discards
     information). (Adam)
diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c
index 1ebeefa..5767971 100644
--- a/sapi/fpm/fpm/fpm_main.c
+++ b/sapi/fpm/fpm/fpm_main.c
@@ -655,14 +655,38 @@ static void sapi_cgi_register_variables(zval *track_vars_array TSRMLS_DC)
 	}
 }
 
-static void sapi_cgi_log_message(char *message)
+/* {{{ sapi_cgi_log_fastcgi
+ *
+ * Ignore level, we want to send all messages through fastcgi
+ */
+void sapi_cgi_log_fastcgi(int level, char *message, size_t len)
 {
 	TSRMLS_FETCH();
 
-	if (CGIG(fcgi_logging)) {
-		zlog(ZLOG_NOTICE, "PHP message: %s", message);
+	fcgi_request *request = (fcgi_request*) SG(server_context);
+
+	/* ensure we want:
+	 * - to log (fastcgi.logging in php.ini)
+	 * - we are currently dealing with a request
+	 * - the message is not empty
+	 */
+	if (CGIG(fcgi_logging) && request && message && len > 0) {
+		char *buf = malloc(len + 2);
+		memcpy(buf, message, len);
+		memcpy(buf + len, "\n", sizeof("\n"));
+		fcgi_write(request, FCGI_STDERR, buf, len+1);
+		free(buf);
 	}
 }
+/* }}} */
+
+/* {{{ sapi_cgi_log_message
+ */
+static void sapi_cgi_log_message(char *message)
+{
+	zlog(ZLOG_NOTICE, "PHP message: %s", message);
+}
+/* }}} */
 
 /* {{{ php_cgi_ini_activate_user_config
  */
@@ -1778,6 +1802,9 @@ consult the installation file that came with this distribution, or visit \n\
 	fcgi_fd = fpm_run(&max_requests);
 	parent = 0;
 
+	/* onced forked tell zlog to also send messages through sapi_cgi_log_fastcgi() */
+	zlog_set_external_logger(sapi_cgi_log_fastcgi);
+
 	/* make php call us to get _ENV vars */
 	php_php_import_environment_variables = php_import_environment_variables;
 	php_import_environment_variables = cgi_php_import_environment_variables;
diff --git a/sapi/fpm/fpm/zlog.c b/sapi/fpm/fpm/zlog.c
index b127ec1..80db9d8 100644
--- a/sapi/fpm/fpm/zlog.c
+++ b/sapi/fpm/fpm/zlog.c
@@ -22,6 +22,7 @@
 static int zlog_fd = -1;
 static int zlog_level = ZLOG_NOTICE;
 static int launched = 0;
+static void (*external_logger)(int, char *, size_t) = NULL;
 
 static const char *level_names[] = {
 	[ZLOG_DEBUG]   = "DEBUG",
@@ -41,6 +42,12 @@ const int syslog_priorities[] = {
 };
 #endif
 
+void zlog_set_external_logger(void (*logger)(int, char *, size_t)) /* {{{ */
+{
+	external_logger = logger;
+}
+/* }}} */
+
 const char *zlog_get_level_name(int log_level) /* {{{ */
 {
 	if (log_level < 0) {
@@ -101,6 +108,19 @@ void zlog_ex(const char *function, int line, int flags, const char *fmt, ...) /*
 	int truncated = 0;
 	int saved_errno;
 
+	if (external_logger) {
+		va_start(args, fmt);
+		len = vsnprintf(buf, buf_size, fmt, args);
+		va_end(args);
+		if (len >= buf_size) {
+			memcpy(buf + buf_size - sizeof("..."), "...", sizeof("...") - 1);
+			len = buf_size - 1;
+		}
+		external_logger(flags & ZLOG_LEVEL_MASK, buf, len);
+		len = 0;
+		memset(buf, '\0', buf_size);
+	}
+
 	if ((flags & ZLOG_LEVEL_MASK) < zlog_level) {
 		return;
 	}
diff --git a/sapi/fpm/fpm/zlog.h b/sapi/fpm/fpm/zlog.h
index e6a5c01..1945922 100644
--- a/sapi/fpm/fpm/zlog.h
+++ b/sapi/fpm/fpm/zlog.h
@@ -9,6 +9,7 @@
 
 struct timeval;
 
+void zlog_set_external_logger(void (*logger)(int, char *, size_t));
 int zlog_set_fd(int new_fd);
 int zlog_set_level(int new_value);
 const char *zlog_get_level_name(int log_level);
 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Fri Apr 18 10:03:03 2014 UTC