Я устанавливаю PHP на своем Tomcatserver с использованием PECL-сервлета (PHP / PECL-версия 5.2.5). Сервер успешно обрабатывает реальные PHP-файлы, но у меня проблема с запросами на несуществующие страницы.
Запрос на такую страницу, f.ex: http://www.mydomain.com/nonexistentfile.php, заставляет сервлет вызвать исключение java.io.IOException, которое никогда не перехватывается. Поэтому Tomcat прекращается.
Как я могу это исправить? Могу ли я поймать исключения из сервлета? Есть ли способ сопоставить только существующие файлы сервлету?
Спасибо за ответ, похоже, сейчас работает. Я сделал предложенную вами повторную карту в web.xml, сопоставив php-файлы с моим первым самодельным сервлетом, который в основном оборачивает phpservlet и обрабатывает возникшие исключения. Это хороший способ решения проблемы?
Мне немного странно, что tomcat не может самостоятельно обрабатывать такие исключения. Я вижу смысл в завершении работы сервера, чтобы защитить его от выполнения в поврежденных состояниях, но должна быть возможность включить настраиваемую обработку исключений ...
Вот мой localhost.2009-12-09.log после вызова phpservlet напрямую с несуществующей страницы:
(tomcat отображает 4 первые строки стека трассировки в своей странице ошибок по умолчанию перед завершением)
09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextInitialized()
09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: attributeAdded('org.apache.catalina.Registry', 'org.apache.tomcat.util.modeler.Registry@1010058')
09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: attributeAdded('org.apache.catalina.MBeanServer', 'com.sun.jmx.mbeanserver.JmxMBeanServer@bdab91')
09.des.2009 13:35:54 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet php threw exception
java.io.IOException:
at net.php.servlet.send(Native Method)
at net.php.servlet.service(servlet.java:190)
at net.php.servlet.service(servlet.java:214)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)