Назад | Перейти на главную страницу

Сценарий PHP иногда ждет запуска через 20-30 минут

У меня есть 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-адреса.