我正在使用 PECL-servlet(PHP/PECL-version 5.2.5)在我的 Tomcat 服务器上设置 PHP。服务器现在成功地处理了真正的 PHP 文件,但是我遇到了请求不存在页面的问题。
对此类页面 f.ex: http://www.mydomain.com/nonexistentfile.php的请求会导致 servlet 引发 java.io.IOException,该异常从未被捕获。因此,Tomcat 被终止。
我怎样才能解决这个问题?我可以从 servlet 中捕获异常吗?有没有办法只将现有文件映射到 servlet?
感谢您的回复,它现在似乎正在工作。我在 web.xml 中做了你建议的重新映射,将 php 文件映射到我的第一个自制 servlet,它基本上包裹了 phpservlet 并处理引发的异常。这是解决问题的好方法吗?
对我来说,tomcat 无法自行处理此类异常似乎有点奇怪。我可以看到终止服务器以防止其在损坏状态下执行的意义,但应该可以启用自定义异常处理......
这是我的 localhost.2009-12-09.log 在直接使用不存在的页面调用 phpservlet 后:
(tomcat 在终止之前显示堆栈跟踪的前 4 行 int 它的默认错误页面)
09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext 日志 信息:上下文侦听器:上下文初始化() 09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext 日志 信息:SessionListener:contextInitialized() 09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext 日志 信息:ContextListener:attributeAdded('org.apache.catalina.Registry','org.apache.tomcat.util.modeler.Registry@1010058') 09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext 日志 信息:ContextListener:attributeAdded('org.apache.catalina.MBeanServer','com.sun.jmx.mbeanserver.JmxMBeanServer@bdab91') 09.des.2009 13:35:54 org.apache.catalina.core.StandardWrapperValve 调用 严重:servlet php 的 Servlet.service() 抛出异常 java.io.IOException: 在 net.php.servlet.send(本机方法) 在 net.php.servlet.service(servlet.java:190) 在 net.php.servlet.service(servlet.java:214) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) 在 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) 在 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 在 org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 在 java.lang.Thread.run(未知来源)