Можно сделать это. Создайте основной шаблон. Заставьте его иметь только Частных конструкторов. Тогда создайте специализации для каждого случая, который Вы хотите позволить (или сделать противоположное, если запрещенный список является значительно уменьшенным, чем позволенный список).
компилятор не позволит Вам инстанцировать шаблонов, которые используют версию с частными конструкторами.
Этот пример только позволяют инстанцирование с интервалом и плавание.
template<class t> class FOO { private: FOO(){}};
template<> class FOO<int>{public: FOO(){}};
template<> class FOO<float>{public: FOO(){}};
не короткий и изящный способ сделать его, но его возможное.
Прежде всего, вместо того, чтобы читать файл с file_get_contents
и только потом повторять его содержимое, вы можете использовать readfile
: он выполнит обе операции за один вызов, что, вероятно, будет самым быстрым и будет использовать меньше памяти, чем:
file_get_only
. Затем, если вы хотите, чтобы идентифицировали только для доступа к изображениям, у вас нет особого выбора: если ваш механизм идентификации основан на PHP, у вас будет передать PHP для ограничения доступа к файлу - что, да,будет немного медленнее, чем при использовании Apache напрямую для обслуживания контента.
Также: здесь вы говорите:
Я надеюсь, что пользователь никогда не узнает прямой URL-адрес изображения
Читая это, я полагаю, что к вашим изображениям можно получить доступ напрямую через Apache, минуя ваш PHP-скрипт, если кто-то знает их URL; безопасность посредством неизвестности - это плохо.
Лучшим решением, если вы не хотите, чтобы ваши изображения обслуживались Apache, было бы поместить их в каталог, из которого Apache ничего не будет обслуживать:
Запретить всем
» В любом случае это гарантирует, что только ваши сценарии могут получить доступ к файлам, а не напрямую Apache, что означает, что пользователь не будет обходить сценарий.
Другая идея, касающаяся проблемы с производительностью, может заключаться в том, чтобы указать браузеру, что он может кэшировать ваши изображения - по крайней мере,
Поскольку вам требуется, чтобы изображение просматривали только зарегистрированные пользователи, я бы сказал, что у вас действительно нет выбора, когда дело доходит до этого. Вам придется продолжать делать это так до тех пор, пока ваш сайт не станет безумно популярным, после чего вы сможете найти более эффективную систему для нескольких серверов, используя проверку доступа более низкого уровня, чем PHP (что стоит дорого).
<?php
if($_SESSION['user']){
$result = mysql_query("SELECT src FROM Media WHERE id = '"
. mysql_real_escape_string($_GET['id']) ."'");
$data = mysql_fetch_assoc($resultat);
// Output the image
header('Content-Type: image/jpeg');
readfile("media/". $data['src']));
}
Паскаль МАРТИН прав, что readfile
по существу совпадает с echo
и file_get_contents
. Я сомневаюсь, что есть какая-то значительная разница в производительности, но проще использовать readfile
.
Что касается разрешения просмотра изображений только зарегистрированным пользователям, поместите изображения за пределы вашего веб-каталога. Используя readfile
, вы можете получить файл из другого каталога. Таким образом, они не смогут получить к нему доступ, даже если они угадывают URL.