Я разработал механизм очистки изображений в PHP + JS , который позволяет пользователю обмениваться URL-адресами и получать предварительный просмотр (очень похоже на предварительный просмотр Facebook, когда вы делитесь ссылками). Тем не менее, весь процесс иногда замедляется или иногда получает неправильные изображения, поэтому в целом Я хотел бы знать, как его улучшить, особенно его скорость и точность . Такие вещи, как анализ DOM быстрее или получение размеров изображения быстрее. Вот процесс, который я использую, для тех, кто хочет знать больше:
A. Получить HTML-код страницы с помощью PHP (на самом деле я использую один из классов CakePHP , которые, в свою очередь, используют fwrite
и fread
для извлечения HTML-кода. Интересно, будет ли cURL значительно лучше).
B. Анализируйте HTML, используя DOMDocument , чтобы получить теги img, а также отфильтровывайте любое «изображение», которое не является png, jpg или gif (вы знаете, иногда люди помещают скрипты отслеживания в теги img). 1015 *
$DOM = new DOMDocument();
@$DOM->loadHTML($html); //$html here is a string returned from step A
$images = $DOM->getElementsByTagName('img');
$imagesSRCs = array();
foreach ($images as $image) {
$src = trim($image->getAttribute('src'));
if (!preg_match('/\.(jpeg|jpg|png|gif)/', $src)) {
continue;
}
$src = urldecode($src);
$src = url_to_absolute($url, $src); //custom function; $url is the link shared
$imagesSRCs[] = $src;
}
$imagesSRCs = array_unique($imagesSRCs); // eliminates copies of a same image
C. Отправьте массив со всеми этими тегами изображений на страницу, которая обрабатывается с использованием Javascript (в частности, JQuery). Эта обработка в основном состоит в отбрасывании изображений размером менее 80 пикселей (поэтому я не получаю пустых картинок, сотни крошечных значков и т. Д.). Поскольку он должен рассчитывать каждый размер изображения, я решил использовать JS вместо PHP getimagesize()
, потому что он был безумно медленным. Таким образом, когда изображения загружаются браузером, он выполняет следующие действия:
$('.fetchedThumb').load(function() {
$smallestDim = Math.min(this.width, this.height);
if ($smallestDim < 80) {
$(this).parent().parent().remove(); //removes container divs and below
}
});