Наиболее эффективный способ отображения GIF 1x1 (пиксель отслеживания, веб-маяк)
Я создаю базовую аналитическую службу, теоретически основанную на том, как работает Google Analytics, но вместо запроса фактического изображения я направляю запрос изображения в скрипт, который принимает данные, а затем выводит изображение. Поскольку браузеры будут запрашивать это изображение при каждой загрузке, каждая миллисекунда имеет значение.
Я ищу наиболее эффективный способ вывода файла в формате gif из PHP-скрипта. До сих пор я установил 3 основных метода.
Есть ли более эффективный способ для меня вывести GIF-файл 1x1 из PHP-скрипта? Если нет, то какой из них является наиболее эффективным и масштабируемым?
Три Идентифицированных Метода
Библиотеки построения изображений PHP
$im = imagecreatetruecolor(1, 1);
imagefilledrectangle($im, 0, 0, 0, 0, 0xFb6b6F);
header('Content-Type: image/gif');
imagegif($im);
imagedestroy($im);
file_get_contents
изображение с сервера и выведите его
$im = file_get_contents('raw.gif');
header('Content-Type: image/gif');
echo $im;
base64_decode
изображение
header('Content-Type: image/gif');
echo base64_decode("R0lGODdhAQABAIAAAPxqbAAAACwAAAAAAQABAAACAkQBADs=");
(Мне казалось, что base64 будет самым быстрым, но я понятия не имею, насколько ресурсоемка эта функция; и что file_get_contents, скорее всего, будет масштабироваться менее хорошо, так как это добавляет еще одно действие файловой системы.)
Для справки, GIF, который я использую, находится здесь: http://i.stack.imgur.com/LQ1CR.gif
РЕДАКТИРОВАТЬ
Итак, причина, по которой я обслуживаю это изображение, заключается в том, что моя библиотека аналитики создает строку запроса и присоединяет ее к этому запросу изображения. Вместо того, чтобы анализировать журналы, я перенаправляю запрос в PHP-скрипт, который обрабатывает данные и отвечает изображением, чтобы браузер конечного пользователя не зависал и не выдавал ошибку. Мой вопрос в том, как могу ли я лучше всего использовать это изображение в рамках сценария?
4 answers
Возможно
header('Content-Type: image/gif');
//equivalent to readfile('pixel.gif')
echo "\x47\x49\x46\x38\x37\x61\x1\x0\x1\x0\x80\x0\x0\xfc\x6a\x6c\x0\x0\x0\x2c\x0\x0\x0\x0\x1\x0\x1\x0\x0\x2\x2\x44\x1\x0\x3b";
, который выведет двоичную строку, идентичную содержимому двоичного файла прозрачного gif размером 1x1. Я утверждаю, что это эффективно на том основании, что он не выполняет медленный ввод-вывод, такой как чтение файла, и я не вызываю никаких функций.
Если вы хотите создать свою собственную версию приведенной выше шестнадцатеричной строки, возможно, чтобы вы могли изменить цвет, вы можете использовать это для создания php-кода для оператора echo.
printf('echo "%s";', preg_replace_callback('/./s', function ($matches) {
return '\x' . dechex(ord($matches[0]));
}, file_get_contents('https://upload.wikimedia.org/wikipedia/en/d/d0/Clear.gif')));
header('Content-Type: image/gif');
header("Content-Length: " . filesize("image.gif"));
$f = fopen('image.gif', 'rb');
fpassthru($f);
fclose($f);
Вероятно, это было бы быстрее всего для изображения с диска, но (особенно если вы используете кэширование байт-кода) для небольших изображений, заранее известных, я думаю, что способ base64 будет самым быстрым. Отправка Content-Length
также может быть хорошей идеей, так как для небольшого изображения браузер в большинстве случаев ничего не будет ждать после получения байтов, поэтому, хотя ваш сервер займет столько же времени, опыт использования будет намного лучше.
Другим способом было бы позволить Apache/lighttpd/nginx обслуживать изображение, регистрируйте доступ и анализируйте его в автономном режиме.
С Ларавелем:
$pixel = "\x47\x49\x46\x38\x39\x61\x1\x0\x1\x0\x80\x0\x0\xff\xff\xff\x0\x0\x0\x21\xf9\x4\x1\x0\x0\x0\x0\x2c\x0\x0\x0\x0\x1\x0\x1\x0\x0\x2\x2\x44\x1\x0\x3b";
return response($pixel,200,[
'Content-Type' => 'image/gif',
'Content-Length' => strlen($pixel),
]);
Если кто-то захочет этого по какой-то причине.
В качестве альтернативы, если вам не нравятся длинные (иш) шестнадцатеричные строки в вашем коде:
base64_decode('R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw')
Вместо динамической генерации/вывода изображения, почему бы просто не перенаправить на статическое изображение?
<?php
// process query param stuff
header('Location: pixel.gif');
exit();
?>