Я искал лучший способ справиться с этой ситуацией, поэтому я использовал несколько различных функций, найденных в интернете.
В целом, когда это сработало, самой быстрой была функция getjpegsize
, которую Джеймс Рельеа разместил на странице PHP для getimagesize
, опередив функцию ranger
, предоставленную Дежаном выше.
http://php.net/manual/en/function.getimagesize.php#88793
Image #1 (787KB JPG on external older server)
getimagesize: 0.47042 to 0.47627 - 1700x2340 [SLOWEST]
getjpegsize: 0.11988 to 0.14854 - 1700x2340 [FASTEST]
ranger: 0.1917 to 0.22869 - 1700x2340
Image #2 (3MB PNG)
getimagesize: 0.01436 to 0.01451 - 1508x1780 [FASTEST]
getjpegsize: - failed
ranger: - failed
Image #3 (2.7MB JPG)
getimagesize: 0.00855 to 0.04806 - 3264x2448 [FASTEST]
getjpegsize: - failed
ranger: 0.06222 to 0.06297 - 3264x2448 * [SLOWEST]
Image #4 (1MB JPG)
getimagesize: 0.00245 to 0.00261 - 2031x1434
getjpegsize: 0.00135 to 0.00142 - 2031x1434 [FASTEST]
ranger: 0.0168 to 0.01702 - 2031x1434 [SLOWEST]
Image #5 (316KB JPG)
getimagesize: 0.00152 to 0.00162 - 1280x720
getjpegsize: 0.00092 to 0.00106 - 1280x720 [FASTEST]
ranger: 0.00651 to 0.00674 - 1280x720 [SLOWEST]
ranger
не удалось при захвате 32768 байт на изображении № 3, поэтому я увеличил его до 65536, и он работал для успешного получения размера.
Однако существуют проблемы, так как ranger
и getjpegsize
ограничены в способах, которые делают его недостаточно стабильным для использования. И то и другое не удалось при работе с большим изображением JPG размером около 3 МБ, но ranger
будет работать после изменения количества байт, которые оно захватывает. Кроме того, эти альтернативы имеют дело только с изображениями JPG, что означает, что необходимо использовать условные выражения, чтобы использовать их только в JPG и getimagesize
в других форматах изображений.
Кроме того, обратите внимание, что первое изображение было на более старом сервере, работающем на старой версии PHP 5.3.2, где, как и 4 других изображения, пришли с современного сервера (облачная cPanel с MultiPHP, набранная до 5.4.45 для совместимости). ).
Стоит отметить, что облачный сервер работал намного лучше с getimagesize
, который побил ranger
, фактически для всех 4 тестов на облачном сервере ranger
был самым медленным. Эти 4 также извлекали изображения с того же сервера, на котором работал код, но с разными учетными записями.
Это заставляет меня задуматься, улучшилось ли ядро PHP в версии 5.4 или учитывается ли версия Apache. Кроме того, это может быть связано с доступностью сервера и нагрузкой на сервер. Давайте не будем забывать, как сети становятся все быстрее и быстрее с каждым годом, поэтому, возможно, проблема скорости становится менее важной.
Итак, конечный результат и мой ответ таковы: для полной поддержки всех форматов веб-изображений и для достижения сверхбыстрого размера изображения, возможно, было бы лучше взять его и использовать getimagesize
, а затем кэшировать размеры изображений. (если эти изображения будут проверены более одного раза) в таблице базы данных. В этом сценарии только первая проверка будет сопряжена с большими затратами, но последующие запросы будут минимальными и быстрее, чем любая функция, считывающая заголовки изображения.
Как и в случае любого кэширования, оно работает хорошо только в том случае, если содержимое не изменяется, и есть способ проверить, было ли изменение. Таким образом, возможное решение заключается в проверке только заголовков URL-адреса изображения при проверке кэша, и, если отличается, сбросьте кэшированную версию и снова захватите ее с помощью getimagesize
.