Добрый день. У меня проблема с скриптом, при использовании сервер падает. Задача скрипта брать ссылки изображений с таблицы и проверять с названиями изображений в папке, если в папке есть изображения которых нет в таблице. скрипт выводит на них ссылку. Весь код: Код (Text): <? if (!defined('DATALIFEENGINE')) { define('DATALIFEENGINE', true); } #позвол¤ем скрипту анализировать картинки без лимита (если их много будет) set_time_limit(25); # ----------------------- декларирование основных параметров ------------------------ #путь к папке с картинками define("IMGDIR", 'uploads/posts/2017-02/thumbs'); #путь к конфигу define("CONF", 'engine/data/dbconfig.php'); define( 'DATALIFEENGINE', true ); #задать произвольный логин и пороль админа define( 'LOGIN', 'ushkom' ); define( 'PASSWORD', 'ushkom102030' ); class db{} # ----------------------- проверки ------------------------ if (!is_dir(IMGDIR)) die(IMGDIR . ' not found!'); #подключаем длешный конфиг if (!file_exists(CONF)) die(CONF .' not found!'); include CONF ; # ----------------------- настройки ------------------------ header("Content-Type: text/html; charset=".COLLATE); session_start(); # ----------------------- класы и функции ------------------------ class SQL { public $server,$user,$password,$database,$connected; function __construct($server,$password,$database,$user) { $this -> count = 0; $this -> connected = false; $this -> server = $server; $this -> user = $user; $this -> password = $password; $this -> database = $database; } function SetBase($base) { $this->database = trim($base); } function connect() { if ($this->connected) mysql_close(); $curent = @mysql_connect ($this->server, $this->user, $this->password); if (!$curent) { $this->connected = false; return( mysql_error() ); } unset($curent); $curent = @mysql_select_db ($this->database); if (!$curent) { $this->connected = false; return( mysql_error() ); } $this->connected = true; $this->run("SET NAMES ".COLLATE); return $this->connected; } function query($query) { $result = $this->run($query); if (!$result) return(mysql_error()); $d = array (); while ($row = mysql_fetch_assoc($result)) $d[] = $row; return $d; } function run($query) { if (!$this->connected) $this -> connect(); $query = trim($query); $result = mysql_query($query); return $result; } function SimpleQuery($query) { $result = $this->run($query); if (!$result) return(mysql_error()); $d = array (); while ($row = mysql_fetch_assoc($result)) return $row; return false; } } function IsUsed($name) { global $sql; $name = addslashes($name); $data = $sql -> query("select `id` from `" . PREFIX ."_post` where `short_story` like '%$name%' or `full_story` like '%$name%' or `xfields` like '%$name%'"); if (!$data) return false; if (!isset($data[0])) return false; $id = ''; foreach ($data as $c) { $id .= '<b>' . $c['id'] . '</b> , '; } return rtrim($id , ', '); } #--------------------авторизаци¤-------------------------------- if (isset($_POST['Tlogin'])) { if ($_POST['login'] == LOGIN && $_POST['password'] == PASSWORD) $_SESSION['logined'] = true; } if (!isset($_SESSION['logined'])) { #если не залогинен ?> <form method="POST"> LOGIN:</br><input type="text" name="login"></br> PASSWORD:</br><input type="password" name="password"></br> <input type="submit" name="Tlogin"> </form> <? exit(0); } #всЄ ниже если залогинен #--------------------попытка подключитс¤ к базе---------------- $sql = new SQL( DBHOST , DBPASS , DBNAME , DBUSER ); $error = $sql -> connect(); if (!$sql -> connected) die($error); #--------------главна¤ часть------------- $images = array_merge( glob(IMGDIR .'/*.jpg') , glob(IMGDIR .'/*.jpeg') , glob(IMGDIR .'/*.gif') , glob(IMGDIR .'/*.png')); if (is_null($images) || !isset($images['0'])) die("нет картинок !"); ?> <? foreach($images as $img) { $ids = IsUsed($img); if (!$ids || $img){ $img1 = $img; } if (!$ids) echo "<a href='$img1' target='blank'>$img1</a><br>"; } ?> Если в папке не много изображений, все нормально работает, но если их очень много: Error 502 Bad gateway Как можно установить лимит или на Код (Text): $images = array_merge( glob(IMGDIR .'/*.jpg') , glob(IMGDIR .'/*.jpeg') , glob(IMGDIR .'/*.gif') , glob(IMGDIR .'/*.png')); Или Код (Text): foreach($images as $img) { $ids = IsUsed($img); if (!$ids || $img){ $img1 = $img; } if (!$ids) echo "<a href='$img1' target='blank'>$img1</a><br>"; } Может у кого другие идеи. Всем спасибо
А зачем вообще глоб-то делать (список файлов в файловой системе узнавать)? Можно же итерировать ответ от базы и проверять существует ли конкретный файл. Можно даже сначала дернуть все картинки базы в некоторое задание, которое постепенно несколькими проходами (ну чтоб в лимит времени не уйти) обрабатывать.
Частично решил проблему используя такой код Код (Text): $maxNumber = 10000; // Максимальное количество изображений $validExtensions = array('jpg', 'jpeg', 'png', 'gif'); // Допустимые расширения $path = IMGDIR .'/'; // Директория с картинками $dir = new DirectoryIterator($path); foreach ($dir as $file) { if (!$file->isDot() && in_array($file->getExtension(), $validExtensions)) { $img1 = "{$path}{$file->getFilename()}"; $ids = IsUsed($img1); if (!$ids) echo "<a href='$img2' target='blank'>$img2</a><br>"; if (--$maxNumber == 0) { break; } } } echo "Нет файлов<br>"; В папках где до 20 000 изображений нормально работает, но есть папки по 100 000, там после 20 000 не получается. Как можно указать от какого файла начинать нужно. У меня Код (Text): $maxNumber = 10000; это сколько файлов сканировать, от 0 до 10 000. Как можно сделать чтоб начинал не от 0. Всем спасибо за помощь.
@ushkom, во-первых, все-таки стоит убрать лимит, оставив set_time_limit(0); во-вторых - сохранять промежуточные результаты работы скрипта либо в файле, либо в базе данных, либо в сессии...