Назад | Перейти на главную страницу

IIS7 и PHP: показывать сообщения об ошибках со всем остальным выводом

Хорошо, это постепенно начинает надоедать. Я привык работать с веб-серверами Apache и никогда не сталкивался с подобными проблемами. IIS, кажется, пытается быть умным - или что-то в этом роде.

Вот моя ситуация: моему клиенту нужен веб-сайт PHP, и он должен работать на веб-сервере Windows IIS.

Для своей среды разработки я мог бы использовать свой Apache, но на всякий случай хочу сделать это и с IIS. Итак, я установил dev-сервер с Windows Vista, всеми последними обновлениями и установил IIS. Все прекрасно!

Я быстро нашел инструкции по установке PHP в IIS на каком-то официальном сайте Microsoft. Модифицированный php.ini - подобные вещи делаются годами на машинах Linux / Apache.

Итак, теперь у меня есть сервер для запуска IIS и моя рабочая станция, которую я использую для разработки, доступ к файлам на сервере по сети.

Моя первая страница "phpinfo ()" - все в порядке. Теперь я намеренно разбиваю страницу, сообщая об ошибке: все, что я получаю на своей рабочей станции, - это «Ошибка сервера 500». Когда я открываю страницу прямо на сервере, я вижу сообщение об ошибке PHP ... Что ж, сработало с этот вопрос serverfault.com.

НО: Это все еще меня раздражает: теперь, если есть ошибка, все, что я получаю, это ТОЛЬКО сообщение об ошибке. Я не вижу других выходных данных сценария. На самом деле в Firefox я вообще ничего не вижу в случае ошибки.

Например, если я сделаю это ...

<?PHP 
$sql = 'THIS WON\'T WORK';
echo $sql;
$DB->exec($sql);  // <- This causes an error
?>

все, что я получаю, это

PHP Fatal error:  Call to a member function exec() on a non-object in C:\inetpub\wwwroot\phpinfo.php on line 4

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

Как мне заставить IIS (или PHP?) Показать мне все? Сообщение об ошибке И контекст? По сети?

Обновить

Хорошо, у меня может быть зацепка. Когда я перехожу на консоль и вызываю свой скрипт вручную через php-cgi.exe, я получаю следующее:

PHP Fatal error:  Call to a member function exec() on a non-object in C:\inetpub
\wwwroot\phpinfo.php on line 4
X-Powered-By: PHP/5.4.12
Content-type: text/html

THIS WON'T WORK<br />
<b>Fatal error</b>:  Call to a member function exec() on a non-object in <b>C:\i
netpub\wwwroot\phpinfo.php</b> on line <b>4</b><br />

Затем я попытался передать вывод в файлы и выяснил, что первые две строки передаются на stderr, а остальные идут на stdout (Подробнее об этом читайте здесь).

Я также вижу, что то, что я получаю в моем браузере, является выводом для stderr, потому что он не содержит никакого HTML-форматирования.

Теперь я могу сузить свой вопрос до следующего: у меня есть FastCGI PHP-CGI, который выводит сообщение об ошибке на stderr и страницу, вызывающую ошибку, на stdout. В настоящее время он перенаправляет stderr в браузер - как мне заставить его использовать вместо этого stdout?

... и, наконец, у меня все заработало.

Основываясь на выводах, полученных при помощи stderr, я погуглил еще раз и нашел этот документ о "Защитите PHP с помощью настроек конфигурации"на IIS.net.

У меня есть машина разработчика, поэтому мне не нужно делать ее пуленепробиваемой, но у нее все еще было мое решение:

fastcgi.logging=0

Поместите это в свой PHP.INI, и PHP перестанет отправлять материалы на stderr - и вуаля: я получаю свой обычный вывод PHP в окне браузера!