Требуется на самом деле часто много для чего. Например для своего сборщика скриптов, по сложности, отличного от хомпэйджных и лэндинговых проектов.
Но все предложенные варианты плохи "дёрганием" php в любом случае.
Лучше учите рерайты nginx.
Привожу пример, как у меня работает сборщик scss/sass на php для конечного .css (тоже будет и для .js) каждого из шаблонов проекта:
nginx:
somehost.conf:
location ~* ^/(.*)/styles/css/compiled/compile.css$ {
set $nocache 'no';
set $ccontrol "max-age=31536000";
if ($arg_dev = 'yes'){
set $nocache 'yes';
set $ccontrol "no-store,no-cache,must-revalidate";
}
add_header Cache-Control $ccontrol;
if (!-f /home/dev/dev.test/$1/styles/css/compiled/compile.css){
set $nocache 'yes';
}
if ($nocache = 'yes'){
rewrite ^(.*)(styles/css/compiled/compile.css)$ $1styles/css/virtual/compile.css;
}
access_log off;
log_not_found off;
error_log off;
}
location ~* ^/(.*)/styles/css/virtual/compile.css$ {
access_log off;
log_not_found off;
error_log off;
proxy_pass http://unix:/var/run/scss.sock;
proxy_store off;
}
nginx:
scss.conf:
server {
listen unix:/var/run/scss.sock;
access_log off;
error_log /var/log/nginx/less.error.log;
root /home/dev/dev.test;
location ~* ^/(.*)/styles/css/compiled/compile.css$ {
alias /home/dev/dev.test/$1/styles/css/compile.css;
access_log off;
log_not_found off;
error_log off;
expires max;
}
#обратите внимание на путь /virtual/ которого нету. Именно на него "попадаем" из внешнего конфига в случае промаха по кэшу
location ~* ^/(.*)/styles/css/virtual/compile.css$ {
fastcgi_pass backend_m;
# это ваш php файл
fastcgi_index /scsscompiler/csscompile.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/scsscompiler/csscompile.php;
fastcgi_param CSS_PATH $1;
fastcgi_param CONTENT_TYPE text/css;
}
location ~ /\.ht {
deny all;
}
}
csscompiler.php
обратите внимание на $_SERVER['CSS_PATH']. В неё передаем путь к файлам как fastcgi_param, у вас это может быть всё что угодно нужное.
<?php
$pathroot = $_SERVER['DOCUMENT_ROOT'].'/'.$_SERVER['CSS_PATH'];
if (is_dir($pathroot)){
header('Content-Type: text/css');
$files = [
//'../../styles/css/dropdown-enc.css'
];
$sass = new Sass();
$x = $sass->compile_file('../../styles/scss/_out.scss');
foreach($files as $file){
if (file_exists($file)) $x .= PHP_EOL.file_get_contents($file);
}
$file = $pathroot.'/styles/css/compiled/compile.css';
$dir = $pathroot.'/styles/css/compiled';
if (!is_dir($dir)) mkdir($dir,0755,true);
file_put_contents($file,$x);
$time = filemtime($file);
$etag = dechex($time).'-'.dechex(filesize($file));
header('ETag:"'.$etag.'"');
header('Last-Modified:'.gmdate('D, d M Y H:i:s', $time).' GMT');
echo $x;
} else {
header('Content-Type: text/css');
echo '/* SASS CSS ERROR: no dir at: ',$pathroot,' */';
}
?>
Т.е. теперь при первом запросе отрабатывает 1 раз php, далее, если нет изменений и нужно максимально кешировать статику, работает только nginx.
$arg_dev в первом конфиге для отключения кеширования на время разработки.