php fastcgi process manager logo

Все перечисленные здесь фичи реализованы таким образом, чтобы ничего "не сломать". То есть, если Вы их не используете, то их существование никак не скажется на функциональности php - все они "прозрачны".

Error header

Категория: удобство

По умолчанию, если вызываемый php скрипт содержит parse error, то пользователь получает пустую "200 Ok" страницу. Это неудобно. Error header - это php.ini опция, которая позволяет в таких случаях выдавать произвольный HTTP код ошибки, например "HTTP/1.0 550 Server Made Big Boo", который затем можно перехватить веб сервером и отобразить правильную error page. Для этого в php.ini надо указать fastcgi.error_header = "HTTP/1.0 550 Server Made Big Boo"

В php-5.2.4 добавлена схожая, но упрощенная функциональность: если вызываемый php скрипт содержит parse error и display_errors == off то без дополнительных настроек сразу выдается "HTTP/1.0 500 Internal Server Error". Если же Вам требуется выдавать код, отличный от 500 (который уже используется во множестве случаев), либо хочется сделать это поведение независимым от значения display_errors, то используйте опцию fastcgi.error_header. Если Вы используете php-5.2.4+ совместно с php-fpm, то fastcgi.error_header имеет приоритет.

Accelerated upload support

Категория: оптимизация

Эта фича, как видно из названия, позволяет ускорить обработку больших POST запросов, в том числе file uploads. Ускорение достигается за счет того, что тело запроса записывается во временный файл и по fastcgi протоколу вместо тела передается имя этого файла. На данный момент, насколько мне известно, только nginx 0.5.9+ поддерживает эту функциональность. Очевидно, такая схема будет работать только если php находится на одном хосте с веб сервером.

Пример конфигурации nginx:

	location ~ \.php$ {
		fastcgi_pass_request_body off;
		client_body_in_file_only clean;
		fastcgi_param  REQUEST_BODY_FILE  $request_body_file;
		...
		fastcgi_pass ...;
	}

В php ничего конфигурировать не нужно. Если php получает параметр REQUEST_BODY_FILE - он читает request body из этого файла. Если параметра нет - происходит обычное чтение request body по протоколу fastcgi.

Вместе с этой фичей имеет смысл использовать "fs в памяти" для временных файлов, например tmpfs (linux):

	client_body_temp_path /dev/shm/client_body_temp;

fastcgi_finish_request()

Категория: оптимизация

Эта фича позволяет немного ускорить выполнение php запросов. Ускорение возможно, если в процессе генерации страницы присутствуют какие-либо действия, от результата выполнения которых не зависит выдаваемая страница. Например, сохранение сессии в memcached может происходить уже после того как страница сформирована и отдана веб серверу. fastcgi_finish_request() - это функция php, которая завершает response output. Веб сервер сразу же начинает "медленно и печально" отдавать его клиенту, а php в это время может выполнить много полезных вещей в контексте запроса, таких как сохранение сессии, конвертирование загруженного видеоролика, обработка всевозможной статистики и т.п.

fastcgi_finish_request() можно вызывать и из shutdown function.