В базе около 500 прокси серверов,которые периодически проверяются
В Cron Job добавлена задача,которая запускает скрипт проверки каждые 4 минуты
Запустить скрипт дважды одновременно нельзя, т.к. при запуске скрипт устанавливает новый "ключ запуска" в базе, и после каждой проверенной прокси,проверяет не изменился ли ключ, если изменился( новый запуск скрипта),то скрипт завершает работу die()
Скрипт проверки берёт лишь по 7 прокси и проверяет их с 10-секундным тайм-аутом
На сервере стоит set_time_limit в 30 секунд
по такой схеме работали 3 скрипта
Примерно за 10 часов сервер был перегружен) Админ выдал
Цитата |
Server overload 18.08.2009 top - 10:51:26 up 4 days, 8:29, 1 user, load average: 11.78, 11.82, 11.60 Tasks: 243 total, 13 running, 227 sleeping, 0 stopped, 3 zombie Cpu(s): 35.9%us, 64.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 3369044k total, 2687640k used, 681404k free, 521316k buffers Swap: 4096564k total, 208k used, 4096356k free, 1270932k cache
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 27653 sscom 25 0 33044 17m 6160 R 89.7 0.5 633:20.24 php 21981 sscom 25 0 33044 17m 6184 R 89.0 0.5 15:49.80 php 18272 sscom 25 0 33044 17m 6176 R 84.4 0.5 37:54.80 php 2293 sscom 25 0 33044 17m 6184 R 84.0 0.5 614:27.85 php 20585 sscom 25 0 33044 17m 6160 R 50.5 0.5 25:18.10 php |
php не так давно занялся, мб от этого и не могу понять, почему
скрипты не убивались и память не освобождалась , а переходили в sleeping
и как
скрипт мог выполняться так долго
614:27.85 ?
set_time_limit 30 (менять нельзя)
7*10=70 секунд макс время выполнения в случае,если все прокси таймаут
Помогите разобраться
Спустя 13 часов, 29 минут, 53 секунды (21.08.2009 - 11:19) atarix написал(а):
Вообще лучше после оцередной интерации использовать unset, съэкономит память и исключит такие зависоны.
Цитата |
7*10=70 секунд макс время выполнения в случае,если все прокси таймаут |
Делай 2 запроса прокси, на интервалы уйдёт 20 сек + 10 сек на прочии операции (запись флагов и прочее).
Спустя 1 минута, 58 секунд (21.08.2009 - 11:21) Dezigo написал(а):
Спустя 4 часа, 19 минут, 32 секунды (21.08.2009 - 15:40) leray написал(а):
скрипт:
PHP |
<? set_time_limit(0); include("bd.php"); include("check_ip.php");
//... несколько запросов к бд(время запуска и т.д. инфа)
//устанавливаю новый ключ запуска и записываю в бд и в $session_key
$newkey=rand(0,32000); $q=mysql_query("UPDATE `checker_stats` SET `skey` = '".$newkey." - ".date("d.m")." - ".date("H:i:s")."' WHERE `ID` = 0 ");
//..сначала получаю,а потом обновляю индекс в бд последней проверенной прокси
//беру 7 прокси, $start_point - индекс последней проверенной прокси
$q = mysql_query("SELECT * FROM `ips` ORDER BY `ID` ASC LIMIT ".$start_point.",7"); $num = mysql_num_rows($q);
while($row = mysql_fetch_array($q)) {
// проверяю изменился ли ключ в бд, $session_key -ключ,установленный при запуске скрипта
$checker_key="-1";
$qq=mysql_query("Select `skey` from `checker_stats` where `ID`=0 "); $row2=mysql_fetch_row($qq); $checker_key=$row2[0];
if ($session_key!=$checker_key) { //echo "Checker: session key has been changed. Terminating..."; die(); exit(); }
//check proxy
$test = check_proxy($row['ip'].":".$row['port']); //обновление бд
}
//... |
check_ip.php:
PHP |
<? set_time_limit(10);
function check_proxy($proxy) {
$opts = array('http' => array('proxy' => ''.$proxy.'', 'request_fulluri' => true,'timeout' => 8)); $sc = stream_context_create($opts); $fc = @file_get_contents('',0, $sc);
//проверяю содержание файла и возвращаю результат }
//... |
и в каких случаях скрипт становится sleeping?
Спустя 23 минуты (21.08.2009 - 16:03) FatCat написал(а):
Цитата (leray @ 20.08.2009 - 22:49) |
set_time_limit 30 (менять нельзя) |
Но Вы же меняете:
Цитата (leray @ 21.08.2009 - 16:40) |
|
Спустя 1 час, 20 минут, 59 секунд (21.08.2009 - 17:24) Guest написал(а):
Цитата (FatCat @ 21.08.2009 - 13:03) |
Цитата (leray @ 20.08.2009 - 22:49) | set_time_limit 30 (менять нельзя) |
Но Вы же меняете:
Цитата (leray @ 21.08.2009 - 16:40) | |
|
пытаюсь,тестил работает ли set_time_limit(0), если браузером захожу,то непрерывается,а если через крон вызывается,то 60 секунд максимум выполняется скрипт
ещё устрою серию тестов
Спустя 42 минуты, 41 секунда (21.08.2009 - 18:07) leray написал(а):
тем не менее, если у скрипта нет ограничения по времени,
1. рано или поздно сработает тайм аут при запросе к удалённому файлу в скрипте проверки
2. или там же set_time_limit(10); сработает
3. или все прокси норм проверятся
4. или смена ключа проверки
почему во всех этих случаях скрипты sleeping становятся, а не завершаются и освобождают память?