[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Скрипты не завершаются и грузят сервер
leray
В базе около 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 секунд макс время выполнения в случае,если все прокси таймаут

Помогите разобраться huh.gif



Спустя 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)
PHP
set_time_limit(0);

Спустя 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)
PHP
set_time_limit(0);

пытаюсь,тестил работает ли set_time_limit(0), если браузером захожу,то непрерывается,а если через крон вызывается,то 60 секунд максимум выполняется скрипт

ещё устрою серию тестов



Спустя 42 минуты, 41 секунда (21.08.2009 - 18:07) leray написал(а):
тем не менее, если у скрипта нет ограничения по времени,

1. рано или поздно сработает тайм аут при запросе к удалённому файлу в скрипте проверки
2. или там же set_time_limit(10); сработает
3. или все прокси норм проверятся
4. или смена ключа проверки

почему во всех этих случаях скрипты sleeping становятся, а не завершаются и освобождают память?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.