У меня есть PHP-скрипт на моем сервере, который, в первую очередь, берет файлы из загрузки и перемещает их на место. Обычно он работает нормально, но иногда скрипт не запускается в течение 20-30 минут. Все загруженные файлы (примерно 0,5 МБ) будут находиться в папке 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-скрипт не будет выполняться так долго, или какой вид ведения журнала я должен ввести, чтобы узнать? Сервер работает Ubuntu 10.04
, Apache 2.2.14
, и PHP 5.3.2
.
Вы абсолютно правы насчет того, как Apache записывает в файл журнала. Метка времени устанавливается, когда дочерний элемент принял соединение, но не записывается в файл журнала до тех пор, пока не будет отправлен ответ. Это может привести к тому, что временные метки в файле журнала окажутся не по порядку.
Журналы самого скрипта показывают, что он не запускался раньше, чем через 22 минуты после первоначального подключения, что означает, что это вещь Apache, а не PHP.
Мое первое предположение заключалось в том, что загрузка данных занимала 20 минут. 0,5 МБ обычно не занимает так много времени, и вы сказали, что весь файл находился там все 20 минут, так что это может не быть нашей проблемой.
Следующее предположение - это неполная загрузка или полная загрузка без каких-либо указаний на ее завершение.
Если приложение Android не настроено или неправильно устанавливает заголовок Content-Length:, я не знаю, как Apache узнает, когда начинать обработку данных.
Если пользователь Android выходит за пределы диапазона сигнала, TCP-соединение может оставаться открытым в течение некоторого времени.
Лучше всего, чтобы попытаться поближе познакомиться с задействованным временем, было бы запустить tcpdump
на вашем сервере и посмотрите, когда именно пришли разные части запроса. Надеюсь, это не особо загруженный сервер. Очевидно, что чем больше вы можете ограничить это трафиком, который вам нужен, тем лучше. обязательно используйте -w
так что, как только вы узнаете, какой IP-адрес вызвал проблему, вы могли повторно прочитать файл и отфильтровать только трафик этого IP-адреса.