Насколько прожорливые подзапросы в Apache?

O
На сайте с 29.05.2008
Offline
195
918

Здравствуйте.

Ситуация следующая, все запросы к сайту, исключая только запросы к существующим и доступным пользователю файлам, пересылаются в PHP скрипт index.php.

Сначала написал следующую реализацию с проверкой на доступность файла через подзапрос:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} ^/index.php$ [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-F
RewriteRule ^(.*) /index.php

Все хорошо, только вот в документации PHP сказано, что -F тест выполняет через подзапрос к серверу и it can impact your server's performance!

Написал следующую реализацию:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} ^/index.php$ [OR]
RewriteCond %{REQUEST_FILENAME} ^/kernel/.+$ [OR]
RewriteCond %{REQUEST_FILENAME} ^/resource/.+$ [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteRule ^(.*) /index.php

Но как-то некрасиво...

Насколько ресурсоемкие подзапросы?

IL
На сайте с 20.04.2007
Offline
435
#1
ortegas:
только вот в документации PHP сказано, что -F тест выполняет через подзапрос к серверу

1. эм.. а почему в документации PHP?

2. в REQUEST_FILENAME полный путь лежит.

3. запрос к файловой системе на проверку наличия файла делается - его не обойти.

---------- Post added 17-06-2013 at 18:09 ----------

ivan-lev:
2. в REQUEST_FILENAME полный путь лежит.

Поправлюсь.. не совсем так.. при обращении к файловой системе в -F не обязательно указывать %{DOCUMENT_ROOT}

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
O
На сайте с 29.05.2008
Offline
195
#2
ivan-lev:
в REQUEST_FILENAME полный путь лежит.

В VirtualHost обязательно. htaccess не использую. И даже для -F (только что проверил).

ivan-lev:
эм.. а почему в документации PHP?

Опечатка.

ivan-lev:
запрос к файловой системе на проверку наличия файла делается - его не обойти.

Вы понимаете разницу между эмуляцией (подзапросом) и проверкой на существование локального файла?

По сути, пожалуйста. Может кто-то поможет прочитать Rewritelog trace?

IL
На сайте с 20.04.2007
Offline
435
#3

ortegas,

ortegas:
Вы понимаете разницу между эмуляцией (подзапросом) и проверкой на существование локального файла?

Понимаю.. !F и !f - это две "большие разницы". !f обращается к ФС.

---------- Post added 17-06-2013 at 19:27 ----------

А такой вариант совсем не рассматривается?

RewriteRule ^(kernel|resource)/.+ - [L]
O
На сайте с 29.05.2008
Offline
195
#4

ivan-lev, говорите B, раз сказали A. Я не понимаю что вы хотите.

Понимаю.. !F и !f - это две "большие разницы".

Спасибо. Я знаю. Я спрашиваю о производительности одно против другого (в цифрах). Еще я бы хотел услышать как раз таки о механизме подзапросов. Может кто-то быстренько сделает бенчмарк или прочитает логи выполнения каждого из вариантов. Но никак не демагогию об относительный путь против абсолютного (всегда использую абсолютный). Оба кода рабочие и мне больше по душе код с подзапросом, но... читайте первый пост.

RewriteRule ^(kernel|resource)/.+ - [L]

Для меня это все тот же другой вариант. Как раз он и рассматривается в другом варианте. Здесь подзапрос против исключения, а не битва синтаксиса, понимаете? :)

IL
На сайте с 20.04.2007
Offline
435
#5
ortegas:
Оба кода рабочие и мне больше по душе код с подзапросом, но... читайте первый пост.

Я, если честно, просто не понимаю задумки.

Естественно, подзапрос медленнее (т.к. это тоже самое обращение к FS + overhead на sub-query). На сколько конкретно (в цифрах) - зависит от конкретных условий.

С учётом Вашего стремления к оптимизации, есть смысл использовать вариант без подзапроса... Но опять же, можете "быстренько прогнать бенчмарки" на своём окружении (возможно 3-4-5 разных.. на локалке, на боевой машине...) и своими глазами посмотреть на результаты...

p.s. если в регулярках не указывать +$ - быстрее будет.

O
На сайте с 29.05.2008
Offline
195
#6

ivan-lev, смотрите. Директивы resource, kernel закрыты через Require all denied. Будут закрываться еще директивы, и в скором, PHP начнет обрабатывать и некоторые динамические файлы (css). PHP должен принимать все после адреса сайта, то-бишь, ему переадресовывается вся строка, но при условии что запросили не доступный файл. Если я сделают просто редирект при условии, что !-f, тогда при запросе существующего файла из закрытых директорий, запрос не будет передаваться PHP, а Apache будет выдавать существование файла ошибкой 403. Проверка через !-F решает эту проблему, синхронные с правами доступа регулярные выражения также решают эту проблему, но требуют тщательного редактирования конфигурации. Вот мне и интересно, оправдан ли здесь подзапрос. На данный момент, я использую именно !-F && !=/index.php. Бенчмарки под Apache никогда не делал, но вижу, что придется опять вникать в дебри самому.

IL
На сайте с 20.04.2007
Offline
435
#7
ortegas:
Бенчмарки под Apache никогда не делал, но вижу, что придется опять вникать в дебри самому.

Я, конечно, извиняюсь за дикий оффтоп..

Если речь про свой проект.. Если речь про конечный результат.. Если переживаете за производительность - смотрите в сторону nginx location ^~ и try_files

Хотя, для расширения кругозора, для углубления познаний, в дебри вникать бывает полезно...

O
На сайте с 29.05.2008
Offline
195
#8

ivan-lev, о своем. Nginx - исключено. Спасибо.

---------- Добавлено 17.06.2013 в 19:57 ----------

Итак, провел тесты.

10000 запросов, 10 конкурирующих клиентов.

Результат для проверки через подзапрос -F на локальной машине 54.32 [#/sec], для исключений в виде регулярных выражений 38.16 [#/sec]. Первый вариант на удивление оказался намного производительнее (я почему-то так и думал). Всем спасибо.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий