Михал Шрайер дал одну очень распространенную причину проблемы (окружающая среда). Вы, конечно, должны быть уверены, что среда достаточно хорошо настроена, потому что Apache строго устанавливает свою собственную среду и не передает никаких унаследованных нежелательных значений; он передает только то, что сконфигурировано для передачи (директивы SetEnv
и PassEnv
, IIRC).
Другая проблема заключается в том, что вы думаете, что ваш процесс отображения не удастся; это беспокоит Кроме того, это является симптомом еще одной проблемы, которая, я думаю, является основной.
При первом запуске процесса карты он считывает запрос с веб-сервера, но если сопоставление не выполняется, вы запускаете его повторно - но веб-сервер все еще ожидает вывода из исходного запроса и карты процесс ожидает ввода, так что тупик.
Обратите внимание, что дочерний процесс автоматически наследует стандартный ввод и стандартный вывод своего родителя, если вы не сделаете что-то для его изменения.
Если вы думаете, что что-то может не получиться, вам нужно захватить стандартный ввод, чтобы при повторном запуске программы вы могли повторно вводить ввод (хотя почему он будет работать во второй раз, когда он не прошел на первом, отдельная загадка).
Может быть:
if tee /tmp/xx.$$ | /usr/bin/php /somepath/mymap.php
then : OK
else
until /usr/bin/php /somepath/mymap.php < /tmp/xx.$$
do echo "map died but I will restart it right away!"
done
fi
rm -f /tmp/xx.$$
Неразрешенные проблемы включают в себя:
- Вы должны добавить ловушки, чтобы обеспечить удаление временного файла;
- Вероятно, вы не должны использовать
/tmp
в качестве каталога;
- Сообщения, вероятно, не отправляются на веб-сервер и оттуда в браузер клиента до тех пор, пока не завершится весь сценарий, поэтому отраженные сообщения просто портят начало ответа;
- Количество сбоев не ограничено;
- Нет регистрации ошибок;
- Не предпринимается попытка исправить проблему, вызвавшую сбой;
- И, наверное, есть другие, о которых я еще не думал.