Мне нужно отправлять все запросы на любой веб-ресурс через PHP для проверки подлинности пользователя и не обслуживать какие-либо файлы напрямую через Apache.Вот мой .htaccess:
# All requests are routed to PHP (images, css, js, everything)
RewriteRule ^(.*)$ index.php?query=$1&%{QUERY_STRING} [L]
Затем я обрабатываю запрос, проверяю, что у пользователя есть доступ к ресурсу, а затем выводю любой файл, который не требует обработки, используя следующую функцию чтения PHP.Оказывается, это невероятно медленно по сравнению с тем, чтобы позволить Apache делать свое дело.
Кто-нибудь может порекомендовать способ помочь мне улучшить производительность?
static function read($path) {
if(!File::exists($path)) {
//echo 'File does not exist.';
header("HTTP/1.0 404 Not Found");
return;
}
$fileName = String::explode('/', $path);
if(Arr::size($fileName) > 0) {
$fileName = $fileName[Arr::size($fileName) - 1];
}
$size = File::size($path);
$time = date('r', filemtime($path));
$fm = @fopen($path, 'rb');
if(!$fm) {
header("HTTP/1.0 505 Internal server error");
return;
}
$begin = 0;
$end = $size;
if(isset($_SERVER['HTTP_RANGE'])) {
if(preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'], $matches)) {
$begin = intval($matches[0]);
if(!empty($matches[1]))
$end = intval($matches[1]);
}
}
if ($begin > 0 || $end < $size)
header('HTTP/1.0 206 Partial Content');
else
header('HTTP/1.0 200 OK');
// Find the mime type of the file
$mimeType = 'application/octet-stream';
//$finfo = @new finfo(FILEINFO_MIME);
//print_r($finfo);
//$fres = @$finfo->file($path);
//if(is_string($fres) && !empty($fres)) {
//$mimeType = $fres;
//}
// Handle CSS files
if(String::endsWith('.css', $path)) {
$mimeType = 'text/css';
}
header('Content-Type: '.$mimeType);
//header('Cache-Control: public, must-revalidate, max-age=0');
//header('Pragma: no-cache');
header('Accept-Ranges: bytes');
header('Content-Length:' . ($end - $begin));
header("Content-Range: bytes $begin-$end/$size");
header("Content-Disposition: inline; filename=$fileName");
header("Content-Transfer-Encoding: binary\n");
header("Last-Modified: $time");
header('Connection: close');
$cur = $begin;
fseek($fm, $begin, 0);
while(!feof($fm) && $cur < $end && (connection_status() == 0)) {
print fread($fm, min(1024 * 16, $end - $cur));
$cur += 1024 * 16;
}
}