Статьи

Различия API PHP сервера

Полезная таблица: Apache и IIS PHP $ _SERVER Суперглобальное сравнение .

Если вы написали код, который должен был работать в более чем одной среде веб-сервера (даже PHP как CGI против PHP как модуль под Apache), вы, вероятно, столкнулись с такими проблемами, как отсутствие $ _SERVER [‘SCRIPT_FILENAME’] — сервер API (SAPI) различаются.

Столкнулся с таблицей ссылок несколько дней назад, и она хорошо иллюстрирует потенциальные проблемы (я предполагаю, что столбец IIS был создан из PHP, работающего как «модуль» ISS, а не как исполняемый файл CGI). Возможно, двумя наиболее важными являются $ _SERVER [‘SCRIPT_FILENAME’] и $ _SERVER [‘REQUEST_URI’], которые вы, вероятно, захотите, если вы делаете что-то «каркасное», но обычно доступны только для PHP, работающего как модуль Apache.

Ссылка не совсем поднимает полную историю, хотя. Насколько я помню, с PHP в качестве CGI под Apache, $ _SERVER [‘SCRIPT_FILENAME’] — это путь к исполняемому файлу CGI, а не сценарий, который он выполняет, — который относится к запросу константы PHP, называемой __MAIN__, для идентификации сценария, где казнь началась.

В противном случае различные переменные HTTP_ в массиве $ _SERVER могут различаться для каждого запроса — они сообщают вам информацию о входящем HTTP-запросе. Есть также информационный X_HTTP_, который иногда отображается, такой как X_HTTP_FORWARDED_FOR — соглашение среди прокси-серверов. Кстати, ни одному из них не стоит доверять.

Апач 2 и $ _SERVER [‘PATH_TRANSLATED’] еще интереснее — смотрите здесь . Функция PHP php_sapi_name () полезна для определения среды, в которой работают ваши скрипты. Дополнительное замечание — верьте, что он возвращает «apache», когда PHP работает как модуль под Apache 1.x и 2.x.

А если бы вы подумали: «Кого это волнует? Я просто буду полагаться на старый добрый $ _SERVER [‘PHP_SELF’], верно? », Тогда вы должны прочитать это — поиск в Google« учебника по формам PHP_SELF »- это ночные кошмары.

Была проделана определенная работа по предоставлению специфичных для SAPI функциональных возможностей, чтобы помочь «понять» части среды (например, Apache и NSAPI позволяют получать больше информации о входящих запросах), но, IMO, суть в том, что есть минное поле, если вы написание кода, который должен работать под несколькими SAPI.

Прямо сейчас нет конкретных ответов или выводов. PHP — это кроссплатформенная технология, а не независимая от платформы. Проблема № 1, на мой взгляд, заключается в том, что, похоже, нет какой-либо окончательной документации о том, где лежат различия. К руководству прилагается несколько советов по заранее определенным переменным, но большинство из них относятся к категории «это сработало для меня». В идеальном мире все это может быть скрыто за API, который волшебным образом все это решает, но я не знаю ничего, что предлагает это.

Мысли / мнения / ссылки и т. Д.?