За последние 24 часа нас посетили 30509 программистов и 1792 робота. Сейчас ищут 1129 программистов ...

Перебор масивов foreach, как установить лимит

Тема в разделе "PHP для новичков", создана пользователем ushkom, 15 дек 2017.

  1. ushkom

    ushkom Активный пользователь

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Добрый день. У меня проблема с скриптом, при использовании сервер падает. Задача скрипта брать ссылки изображений с таблицы и проверять с названиями изображений в папке, если в папке есть изображения которых нет в таблице. скрипт выводит на них ссылку.
    Весь код:
    Код (Text):
    1. <?
    2. if (!defined('DATALIFEENGINE')) {
    3.     define('DATALIFEENGINE', true);
    4. }
    5.  
    6. #позвол¤ем скрипту анализировать картинки без лимита (если их много будет)
    7. set_time_limit(25);
    8. # ----------------------- декларирование основных параметров ------------------------
    9. #путь к папке с картинками
    10. define("IMGDIR", 'uploads/posts/2017-02/thumbs');
    11. #путь к конфигу
    12. define("CONF", 'engine/data/dbconfig.php');
    13. define( 'DATALIFEENGINE', true );
    14. #задать произвольный логин и пороль админа
    15. define( 'LOGIN', 'ushkom' );
    16. define( 'PASSWORD', 'ushkom102030' );
    17. class db{}
    18. # ----------------------- проверки ------------------------
    19. if (!is_dir(IMGDIR))
    20. die(IMGDIR . ' not found!');
    21. #подключаем длешный конфиг
    22. if (!file_exists(CONF))
    23. die(CONF .' not found!');
    24. include  CONF ;
    25. # ----------------------- настройки ------------------------
    26. header("Content-Type: text/html; charset=".COLLATE);
    27. session_start();
    28. # ----------------------- класы и функции ------------------------
    29. class SQL
    30. {
    31. public $server,$user,$password,$database,$connected;
    32.     function __construct($server,$password,$database,$user)
    33.     {
    34.         $this -> count = 0;
    35.         $this -> connected = false;
    36.         $this -> server = $server;
    37.         $this -> user = $user;
    38.         $this -> password = $password;
    39.         $this -> database = $database;
    40.     }  
    41.     function SetBase($base)
    42.     {
    43.     $this->database = trim($base);
    44.     }
    45.    
    46.     function connect()
    47.     {
    48.    
    49.         if ($this->connected)
    50.             mysql_close();
    51.         $curent = @mysql_connect ($this->server, $this->user, $this->password);
    52.         if (!$curent)
    53.         {
    54.             $this->connected = false;
    55.             return( mysql_error() );
    56.         }      
    57.         unset($curent);
    58.             $curent = @mysql_select_db ($this->database);
    59.             if (!$curent)
    60.             {
    61.                 $this->connected = false;
    62.                 return( mysql_error() );
    63.             }      
    64.         $this->connected = true;
    65.         $this->run("SET NAMES ".COLLATE);
    66.         return $this->connected;
    67.     }
    68.     function query($query)
    69.     {
    70.         $result = $this->run($query);
    71.         if (!$result)          
    72.             return(mysql_error());
    73.         $d = array ();
    74.                 while ($row = mysql_fetch_assoc($result))
    75.                         $d[] = $row;  
    76.         return $d;
    77.     }
    78.    
    79.     function run($query)
    80.     {
    81.     if (!$this->connected)
    82.                 $this -> connect();
    83.     $query = trim($query);
    84.     $result = mysql_query($query);
    85.     return $result;
    86.     }
    87. function SimpleQuery($query)
    88. {
    89.     $result = $this->run($query);
    90.         if (!$result)          
    91.             return(mysql_error());
    92.         $d = array ();
    93.         while ($row = mysql_fetch_assoc($result))
    94.                         return $row;  
    95.         return false;
    96. }
    97. }
    98. function IsUsed($name)
    99. {
    100. global $sql;
    101. $name = addslashes($name);
    102. $data = $sql -> query("select `id` from `" . PREFIX ."_post` where `short_story` like '%$name%' or `full_story` like '%$name%' or `xfields` like '%$name%'");
    103. if (!$data) return false;
    104. if (!isset($data[0])) return false;
    105. $id = '';
    106. foreach ($data as $c)
    107. {
    108. $id .= '<b>' . $c['id'] . '</b> , ';
    109. }
    110. return rtrim($id , ', ');
    111. }
    112. #--------------------авторизаци¤--------------------------------
    113. if (isset($_POST['Tlogin']))
    114. {
    115. if ($_POST['login'] == LOGIN && $_POST['password'] == PASSWORD) $_SESSION['logined'] = true;
    116. }
    117. if (!isset($_SESSION['logined']))
    118. {
    119. #если не залогинен
    120. ?>
    121. <form method="POST">
    122. LOGIN:</br><input type="text" name="login"></br>
    123. PASSWORD:</br><input type="password" name="password"></br>
    124. <input type="submit" name="Tlogin">
    125. </form>
    126. <?
    127. exit(0);
    128. }
    129. #всЄ ниже если залогинен
    130. #--------------------попытка подключитс¤ к базе----------------
    131. $sql = new SQL( DBHOST , DBPASS , DBNAME , DBUSER );
    132. $error = $sql -> connect();
    133. if (!$sql -> connected) die($error);
    134. #--------------главна¤ часть-------------
    135. $images = array_merge( glob(IMGDIR .'/*.jpg') , glob(IMGDIR .'/*.jpeg') , glob(IMGDIR .'/*.gif') , glob(IMGDIR .'/*.png'));
    136. if (is_null($images) || !isset($images['0'])) die("нет картинок !");
    137. ?>
    138.  
    139.  
    140. <?
    141.  
    142. foreach($images as $img)
    143. {
    144. $ids = IsUsed($img);
    145. if (!$ids || $img){
    146. $img1 = $img;
    147. }
    148. if (!$ids)
    149. echo "<a href='$img1' target='blank'>$img1</a><br>";
    150.  
    151. }
    152. ?>
    Если в папке не много изображений, все нормально работает, но если их очень много: Error 502 Bad gateway


    Как можно установить лимит или на
    Код (Text):
    1. $images = array_merge( glob(IMGDIR .'/*.jpg') , glob(IMGDIR .'/*.jpeg') , glob(IMGDIR .'/*.gif') , glob(IMGDIR .'/*.png'));
    Или
    Код (Text):
    1.  foreach($images as $img)
    2. {
    3. $ids = IsUsed($img);
    4. if (!$ids || $img){
    5. $img1 = $img;
    6. }
    7. if (!$ids)
    8. echo "<a href='$img1' target='blank'>$img1</a><br>";
    9. }
    Может у кого другие идеи. Всем спасибо

     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    А зачем вообще глоб-то делать (список файлов в файловой системе узнавать)? Можно же итерировать ответ от базы и проверять существует ли конкретный файл. Можно даже сначала дернуть все картинки базы в некоторое задание, которое постепенно несколькими проходами (ну чтоб в лимит времени не уйти) обрабатывать.
     
  3. ushkom

    ushkom Активный пользователь

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Я только учюсь, нашел в сети пару скриптов и собрал их в месте.
     
  4. ushkom

    ushkom Активный пользователь

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Частично решил проблему используя такой код
    Код (Text):
    1. $maxNumber = 10000; // Максимальное количество изображений
    2. $validExtensions = array('jpg', 'jpeg', 'png', 'gif'); // Допустимые расширения
    3. $path = IMGDIR .'/'; // Директория с картинками
    4.  
    5. $dir = new DirectoryIterator($path);
    6. foreach ($dir as $file) {
    7.     if (!$file->isDot() && in_array($file->getExtension(), $validExtensions)) {
    8. $img1 = "{$path}{$file->getFilename()}";
    9. $ids = IsUsed($img1);
    10.  
    11. if (!$ids)
    12.         echo "<a href='$img2' target='blank'>$img2</a><br>";
    13.         if (--$maxNumber == 0) {
    14.             break;
    15.         }
    16.     }
    17. }
    18. echo "Нет файлов<br>";
    В папках где до 20 000 изображений нормально работает, но есть папки по 100 000, там
    после 20 000 не получается.
    Как можно указать от какого файла начинать нужно.
    У меня
    Код (Text):
    1. $maxNumber = 10000;
    это сколько файлов сканировать, от 0 до 10 000. Как можно сделать чтоб начинал не от 0. Всем спасибо за помощь.
     
  5. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @ushkom, во-первых, все-таки стоит убрать лимит, оставив set_time_limit(0);
    во-вторых - сохранять промежуточные результаты работы скрипта либо в файле, либо в базе данных, либо в сессии...