Я искал лучший способ справиться с этой ситуацией, так что я использовал несколько различных функций, найденные по всему Интернету.
В целом, когда он работал, самый быстрый, как правило, функции 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
.
Это, вероятно, медленно, потому что изображения _remote_. Сначала загрузите их, и 'getimagesize()' будет быстро разгоняться. В конце концов, он только считывает определенные бинарные байты из изображений. – kijin
Вот почему я хочу использовать file_get_contents для 1) Не загружать весь файл. 2) читать только определенные байты для получения размера изображения –
на самом деле я cud использовать fopen и fgets читать только эти двоичные байты –