2012-01-20 2 views
0

Я установил cron для запуска этого скрипта. Я использовал рекурсию для обновления таблицы (по 250 строк каждый раз). Он работает хорошо в начале, но через несколько минут он останавливается без печати «Готово». Это проблема памяти сервера. Я проверил «Процессы» в PhpMyadmin и убедился, что он работает хорошо, но он прекращается через несколько минут. Как это исправить?PHP скрипты останавливаются необычно в crontab

function update_mt_image_inventory($db, $from) 
{ 
    $current_img_id = htmlentities($_SERVER['argv'][1], ENT_QUOTES); 
    if(!$current_img_id) $current_img_id = 999999999; 
    $interier = 250; 
    $sql = "SELECT im.IMG_ID, im.IMG_FILENAME, im.SEAL_NUMBER , im.XXX FROM `mt_images` im WHERE im.IMG_ID < {$current_img_id} AND im.ACT_FLG = 1 ORDER BY im.IMG_ID DESC LIMIT {$from}, {$interier}"; 
    $re_check = @$db->sql_query($sql); 
    if(@mysql_num_rows($re_check) > 0) { 
     while($row = $db->sql_fetchrow($re_check)) { 
      $img_id = $row['IMG_ID']; 
      $current_img_id = $img_id;:q! 
      $inventory = $row['XXX']; 

      $sql = "SELECT USER_ID FROM tr_lines_alls WHERE IMG_ID = {$img_id} AND ACT_FLG = 1"; 
      $img_res = @$db->sql_query($sql); 
      $img_count = @mysql_num_rows($img_res) ; 
      if($img_count != $inventory && $img_id>0){ 
       $sql = "UPDATE mt_images SET XXX = {$img_count} WHERE IMG_ID = {$img_id}"; 
       @$db->sql_query($sql); 
       $data = "{$img_id} | {$inventory} | {$img_count}"; 
       echo $data."\n"; 
       if($img_count>0) writeLog($data); 
      } 
      @mysql_free_result($img_res); 
      unset($img_res); 
     } 
     @mysql_free_result($re_check); 
     unset($re_check); 
     echo "Checking next {$interier}/{$from} - Current: {$current_img_id} - Memory: ".memory_get_usage(false)."\n"; 
     if($from%5000 ==0){ 
      echo date("h:i:s")." --> 5000 records passed.\n"; 
     } 
     update_mt_image_inventory($db, $from + $interier); 
    } else { 
     writeLog("mt_images finished"); 
    } 
} 
+5

Прежде всего, удалите '@' всюду. – sanmai

+1

Возможно, вы могли бы сохранить вывод cron внутри файла, чтобы узнать, есть ли ошибка php, что-то вроде '1 * * * * * php myscript.php> output.log' – pleasedontbelong

+0

+1 для комментария @ sanmai. '@' Подавляет сообщения об ошибках, поэтому ваш скрипт может просто рухнуть. – J0HN

ответ

2

Может быть установлено ограничение по времени. Попробуйте это в первой строке вашего кода:

set_time_limit(0); 
+0

Работает ли он сейчас? –

+1

Предел времени по умолчанию для PHP Cli равен 0: http://www.php.net/manual/en/features.commandline.differences.php –

+0

Я знаю ... но это может быть так, что на его сервере значение времени limit не является значением по умолчанию. Он говорит, что нет никакой ошибки или чего-то еще, поэтому наиболее логичной причиной будет ограничение по времени. –

Смежные вопросы