Хорошо, это постепенно начинает надоедать. Я привык работать с веб-серверами 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 в окне браузера!