我在我的服务器上有一个PHP脚本,主要是从上传文件并将其移动到位。 它通常工作正常,但有时,脚本将不会启动20-30分钟。 整个上传的文件(大约0.5 MB)将在等待期间坐在tmp文件夹中,所以看起来数据传输已完成。 这里是从Apache访问日志摘录,指示脚本的POST(来自Android应用程序)...
[29/Nov/2011:11:21:55 -0500] "POST /submit.php HTTP/1.1" 200 288 "-" "Apache-HttpClient/UNAVAILABLE (java 1.4)"
但是,直到11:43左右,此条目才会显示在访问日志中,其中包含11:43:42和12:00:02的其他页面请求。 这使我相信,直到脚本执行,条目才会被写入,但是它会随着提交时间而写入。 这里是错误日志,我正在写脚本的事件…
[Tue Nov 29 11:43:19 2011] Script started: Nov 29, 2011 11:43:19 [Tue Nov 29 11:43:19 2011] Audio file provided [Tue Nov 29 11:43:19 2011] Timestamp provided [Tue Nov 29 11:43:19 2011] Defaults set [Tue Nov 29 11:43:19 2011] Connected to database [Tue Nov 29 11:43:19 2011] Database selected [Tue Nov 29 11:43:19 2011] Query successful [Tue Nov 29 11:43:19 2011] 551: ID set [Tue Nov 29 11:43:19 2011] 551: Audio file moved [Tue Nov 29 11:43:19 2011] 551: Algorithm succeeded [Tue Nov 29 11:43:19 2011] 551: Algorithm query succeeded [Tue Nov 29 11:43:19 2011] 551: Photo type identified [Tue Nov 29 11:43:20 2011] 551: Photo and thumbnail saved [Tue Nov 29 11:43:20 2011] 551: Cache cleared [Tue Nov 29 11:43:20 2011] Script finished: Nov 29, 2011 11:43:20
任何想法会导致一个PHP脚本不执行这么长时间,或者什么样的日志logging我应该到位找出? 服务器运行Ubuntu 10.04 , Apache 2.2.14和PHP 5.3.2 。
您对Apache写入日志文件的方式绝对正确。 时间戳是在孩子接受连接时设置的,但是直到发送响应之后才写入日志文件。 这可能会导致日志文件中的时间戳完全失序。
从脚本本身的日志显示,它没有开始运行,直到最初的连接22分钟后,意味着这是一个Apache的东西,而不是一个PHP的东西。
我的第一个猜测是上传数据需要20分钟。 0.5MB通常不会花费那么长时间,你说整个文件似乎在整个20分钟,所以这可能不是我们的问题。
下一个猜测是一个不完整的上传或完整的上传,没有说明已经完成。
如果Android应用程序没有设置或不正确地设置Content-Length:标头,我不知道Apache如何知道何时开始处理数据。
如果Android用户超出信号范围,则TCP连接可能会保持打开状态很长一段时间。
尝试仔细观察所涉及的时间的最好方法是在服务器上运行一个tcpdump ,然后查看请求的不同部分何时到达。 我希望这不是一个特别繁忙的服务器。 显然,你可以限制这只是你想要更好的交通。 请确保使用-w选项,以便一旦知道哪个IP地址导致了问题,您可以重新读取该文件并仅筛选该IP地址的stream量。