【问题标题】:Combining css with php - 2 vhost with same configuration but different results - loadproxy_fcgi:error将 css 与 php 相结合 - 2 个具有相同配置但结果不同的 vhost - loadproxy_fcgi:error
【发布时间】:2018-04-30 11:29:09
【问题描述】:

我有一个 php 文件来组合我多年来一直使用的 css 文件,并且它一直有效。 现在我用最新的 Debian、Apache 2.4.25 MPM Event 和 PHP 7.2 设置了一个新的测试服务器。 我有两个虚拟主机,除了域是相同的:

<VirtualHost *:80>

   ServerAdmin webmaster@localhost
   ServerName balkenhantel.testb
   DocumentRoot /var/www/balkenhantel

   <Directory /var/www/balkenhantel>
      Order Deny,Allow
      Allow from all
      AllowOverride All
      Options -Indexes
   </Directory>

</VirtualHost>

<VirtualHost *:80>

   ServerAdmin webmaster@localhost
   ServerName eks-services.testb
   DocumentRoot /var/www/eks-services

   <Directory /var/www/eks-services>
      Order Deny,Allow
      Allow from all
      AllowOverride All
      Options -Indexes
   </Directory>

</VirtualHost>

这两个网站的头部都有这样的 css 链接:

<link rel="stylesheet" type="text/css" href="/design/css/css-fb201704032623.php" />

我确实用 WinMerge 检查了 .htaccess 和 css.php,它们是相同的。

css.php:

<?php
ob_start('ob_gzhandler');
header('Content-type: text/css; charset: UTF-8');
header('X-Powered-By: ');
header('Cache-Control: public');
header('Vary: Accept-Encoding');
header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($_SERVER['SCRIPT_FILENAME'])). ' GMT', true, 200);
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 2592000) . ' GMT'); // 1 month

define('DS', DIRECTORY_SEPARATOR);
define('PATH_ROOT', dirname(__FILE__) . DS);

$cssPath = PATH_ROOT;

//css path | css file name | css browser1
//css browser = "all" for all browser, "browser1,browser2,..." for defined various browser only
//IE = msie 6
//IE with various version = msie parent version or full version, e.g. "msie 6" or "msie 5.5" or "msie 5.0.1"
//IE 4 = msie 4
//IE 5 = msie 5
//IE 6 = msie 6
//IE 7 = msie 7
//Opera = opera
//Opera with various version = opera/version, e.g. "opera/9.10"
//Firefox = firefox
//Firefox with various version = firefox/version, e.g. "firefox/2.0.0.14"

$cssGZIP[] = $cssPath."|reset.css|all";
$cssGZIP[] = $cssPath."|structure.css|all";
$cssGZIP[] = $cssPath."|content.css|all";
$cssGZIP[] = $cssPath."|gadgets.css|all";
$cssGZIP[] = $cssPath."|fancyforms.css|all";

foreach($cssGZIP as $GZIP) {
    $css = explode("|", $GZIP);
    if($css[2]=="all") {
    if(file_exists($css[0].$css[1])) {
        $buffer .= file_get_contents($css[0].$css[1]);
    }
    } else {
        $browsers = explode(",", $css[2]);
        $loadThisCSS = false;
        foreach($browsers as $browser) {
            if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']), $browser) !== false) {
               $loadThisCSS = true;
            }
        }
        if($loadThisCSS == true) {
            if(file_exists($css[0].$css[1])) {
            $buffer .= file_get_contents($css[0].$css[1]);
            }
       }
   }
}

// Remove comments
$buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);

// Remove space after colons
$buffer = str_replace(': ', ':', $buffer);

// Remove whitespace
$buffer = str_replace(array("\r\n", "\r", "\n", "\t", '  ', '    ', '    '), '', $buffer);

echo($buffer);
?>

有趣的是,在一个站点上 css 不起作用。它被加载但不起作用。我也可以在浏览器中调用它并显示出来。 更有趣的是,在 css 工作的第二个站点上我有一个错误:

[proxy_fcgi:error] AH01071: Got error 'PHP message: PHP Notice:  Undefined variable: buffer in /var/www/eks-services/design/css/css.php on line 37\n', referer: http://eks-services.testb/

【问题讨论】:

  • 请解释“它已加载但不工作”。您的意思是在访问源文件时可以看到您的 CSS 代码,但它不会将样式应用于页面?
  • @Capsul 正是这种行为。但正如我在下面写的,我现在看到只加载了最后一个 css (fancyforms.css),这似乎是一个 FBM 问题。

标签: php css apache


【解决方案1】:

正如第 37 行的错误所说,您在没有先定义变量的情况下连接 .= 变量。你不能在 php 中这样做,你首先需要定义你的变量。

尽早定义$buffer,这将解决这个问题。

$buffer = '';
if(file_exists($css[0].$css[1])) {
    $buffer .= file_get_contents($css[0].$css[1]);
}

至于为什么它在一台服务器上运行而不是在另一台服务器上运行,也许您忽略了某些东西,或者它们运行的​​是不同版本的 php。我不确定旧版本是否允许你做你想做的事情。

【讨论】:

  • 这是一台服务器。这就是为什么我不知道不同结果的来源。
  • 现在我意识到只加载了最后一个 css。我从提供商服务器检查了 php 版本,它是 7.0.29 CGI/FastCGI。我的测试服务器是 7.2 FPM/FastCGI。我的旧测试服务器是 5.3.3 CGI。所以 FPM 就是问题所在。
  • 这只是一个通知。不声明变量是不好的做法,但代码仍会运行。否则你会得到一个致命错误。在这种情况下,PHP 只是在进行连接之前为您定义变量。您在第二个站点中看到错误的事实可能是因为错误报告的配置不同(显示 E_NOTICE 而另一个没有)
  • 事实上,我会检查另一个错误日志(如果有的话)以了解它失败的原因。
  • 当然我已经检查了这两个(它是一个日志)并且那个站点的 php 通知是 apache 日志中的唯一错误。 FastCGI 进程管理器正在吃掉我的 css :-(
猜你喜欢
  • 2023-03-15
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多