[gelöst] Probleme mit serving binary content und mod_fcgi
Posted: 2009-09-08 14:35
Vielleicht habe ich noch nicht genug 'gegooglet' aber mir ist folgendes Verhalten schleierhaft:
Ich benutze ein Skript um in Grafiken in einem Verzeichnis ein Watermark Image 'on-the-fly' einzufügen. Dazu benutze ich in dem Verzeichnis in dem die Grafiken (jpg in diesem Beispiel) liegen, folgenden Eintrag in .htaccess:
Verkürzt gesagt erstellt das Skript modify.php über imagecreatefromjpeg(), imagecopymerge() und imagejpeg() aus dem Original und dem Watermark-Image ein neues jpg und gibt dieses dann mit einem entsprechenden Header versehen aus.
Quellcode:
Wenn ich PHP (Version 5.2.6) als CGI benutze, funktioniert dies ohne Probleme.
Wenn ich dagegen FastCGI verwende (mod_fcgi) bekomme ich folgende Fehlermeldung im Error Log meines Indianers (Apache 2.2.4):
Nach meinem Verständnis versucht der PHP Interpreter binary content zu parsen, was natürlich nicht funktioniert.
Die php.ini ist in beiden Fällen identisch da sowohl bei CGI als auch bei FastCGI dieselbe genutzt wird. Der Webserver liefert nur eine leere -sprich weisse- Seite aus.
Edit:
short_open_tags = On ist gesetzt
Gibt es bei der Verwendung von mod_fcgi im Zusammenhang mit binary content irgendetwas besonderes zu beachten? In :google: habe ich jedenfalls keine spezifischen Problembeschreibungen im Zusammenhang mit binary content gefunden.
Ich benutze ein Skript um in Grafiken in einem Verzeichnis ein Watermark Image 'on-the-fly' einzufügen. Dazu benutze ich in dem Verzeichnis in dem die Grafiken (jpg in diesem Beispiel) liegen, folgenden Eintrag in .htaccess:
Code: Select all
RewriteEngine on
Options FollowSymlinks
RewriteBase /
AddHandler wtmrk jpg
action wtmrk /modify.phpQuellcode:
Code: Select all
<?
/*
activeWatermark
Free script that places watermark on images in folder
Copyright (C) 2005 ActiveUnit.com
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
// IMAGE WATERMARK (comment line below if you do not want to use image watermark)
Define('WATERMARK_IMAGE', $_SERVER['DOCUMENT_ROOT'] . '/img/watermark/watermark.png'); // path to watermark image
Define('WATERMARK_PERCENT', '50'); // Intensity of the transition (in percent)
// TEXT WATERMARK (comment line below if you do not want to use text)
//Define('WATERMARK_TEXT', 'Copyright (c) 2005 www.activeunit.com'); // text to place (image will not be used)
Define('WATERMARK_TEXT_FONT', '3'); // font 1 / 2 / 3 / 4 / 5
Define('TEXT_SHADOW', '1'); // 1 - yes / 0 - no
Define('TEXT_COLOR', '#FFFFFF'); // text color
// GENERAL SETTINGS
Define('WATERMARK_ALIGN_H', 'right'); // left / right / center
Define('WATERMARK_ALIGN_V', 'bottom'); // top / bottom / center
Define('WATERMARK_MARGIN', '10'); // margin
// ----------------------------------------------------------------------------------------
/* ======================== Dirty FIX for switching between php4 and php5 ==== */
if (!isset($_SERVER['PATH_INFO'])) { $_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];
}
$dr=preg_replace('/modify.php.+/', '', $_SERVER['SCRIPT_NAME'] . $_SERVER['PATH_INFO']);
$filename=str_replace($dr, './', $_SERVER['PATH_INFO']);
$lst=GetImageSize($filename);
$image_width=$lst[0];
$image_height=$lst[1];
$image_format=$lst[2];
if ($image_format==1) {
// GIF format, send proper content-type and do not process
Header("Content-Type: image/gif");
readfile($filename);
exit;
}
elseif ($image_format==2) {
// JPEG format, send proper content-type and process
Header("Content-Type: image/jpg");
$old_image=imagecreatefromjpeg($filename);
}
elseif ($image_format==3) {
// PNG format, send proper content-type and process
Header("Content-Type: image/png");
$old_image=imagecreatefrompng($filename);
}
else {
// Show error message instead
Header("Content-Type: text/plain");
echo "Unknown file format: $filename";
exit;
}
if (Defined('WATERMARK_TEXT') && WATERMARK_TEXT!='') {
// text
$color = eregi_replace("#","", TEXT_COLOR);
$red = hexdec(substr($color,0,2));
$green = hexdec(substr($color,2,2));
$blue = hexdec(substr($color,4,2));
$text_color = imagecolorallocate ($old_image, $red, $green, $blue);
$text_height=imagefontheight(WATERMARK_TEXT_FONT);
$text_width=strlen(WATERMARK_TEXT)*imagefontwidth(WATERMARK_TEXT_FONT);
$wt_y=WATERMARK_MARGIN;
if (WATERMARK_ALIGN_V=='top') {
$wt_y=WATERMARK_MARGIN;
} elseif (WATERMARK_ALIGN_V=='bottom') {
$wt_y=$image_height-$text_height-WATERMARK_MARGIN;
} elseif (WATERMARK_ALIGN_V=='center') {
$wt_y=(int)($image_height/2-$text_height/2);
}
$wt_x=WATERMARK_MARGIN;
if (WATERMARK_ALIGN_H=='left') {
$wt_x=WATERMARK_MARGIN;
} elseif (WATERMARK_ALIGN_H=='right') {
$wt_x=$image_width-$text_width-WATERMARK_MARGIN;
} elseif (WATERMARK_ALIGN_H=='center') {
$wt_x=(int)($image_width/2-$text_width/2);
}
if (TEXT_SHADOW=='1') {
imagestring($old_image, WATERMARK_TEXT_FONT, $wt_x+1, $wt_y+1, WATERMARK_TEXT, 0);
}
imagestring($old_image, WATERMARK_TEXT_FONT, $wt_x, $wt_y, WATERMARK_TEXT, $text_color);
}
if (Defined('WATERMARK_IMAGE') && WATERMARK_IMAGE!='' && file_exists(WATERMARK_IMAGE) && ($image_width > 200)) {
// image
$lst2=GetImageSize(WATERMARK_IMAGE);
$image2_width=$lst2[0];
$image2_height=$lst2[1];
$image2_format=$lst2[2];
if ($image2_format==2) {
$wt_image=imagecreatefromjpeg(WATERMARK_IMAGE);
} elseif ($image2_format==3) {
$wt_image=imagecreatefrompng(WATERMARK_IMAGE);
}
if ($wt_image) {
$wt_y=WATERMARK_MARGIN;
if (WATERMARK_ALIGN_V=='top') {
$wt_y=WATERMARK_MARGIN;
} elseif (WATERMARK_ALIGN_V=='bottom') {
$wt_y=$image_height-$image2_height-WATERMARK_MARGIN;
} elseif (WATERMARK_ALIGN_V=='center') {
$wt_y=(int)($image_height/2-$image2_height/2);
}
$wt_x=WATERMARK_MARGIN;
if (WATERMARK_ALIGN_H=='left') {
$wt_x=WATERMARK_MARGIN;
} elseif (WATERMARK_ALIGN_H=='right') {
$wt_x=$image_width-$image2_width-WATERMARK_MARGIN;
} elseif (WATERMARK_ALIGN_H=='center') {
$wt_x=(int)($image_width/2-$image2_width/2);
}
imagecopymerge($old_image, $wt_image, $wt_x, $wt_y, 0, 0, $image2_width, $image2_height, WATERMARK_PERCENT);
}
}
if ($image_format==2) {
imageJpeg($old_image);
}
if ($image_format==3) {
imagePng($old_image);
}
?>
Wenn ich dagegen FastCGI verwende (mod_fcgi) bekomme ich folgende Fehlermeldung im Error Log meines Indianers (Apache 2.2.4):
Code: Select all
[Sun Sep 06 02:34:56 2009] [warn] mod_fcgid: stderr: PHP Warning: Unexpected character in input: 'x10' (ASCII=16) state=1 in /srv/www/vhosts/domain.tld/httpdocs/IMG.jpg on line 234
[Sun Sep 06 02:34:56 2009] [warn] mod_fcgid: stderr: PHP Parse error: syntax error, unexpected '[' in /srv/www/vhosts/domain.tld/httpdocs/IMG.jpg on line 234Die php.ini ist in beiden Fällen identisch da sowohl bei CGI als auch bei FastCGI dieselbe
Code: Select all
/etc/php5/fastcgi/php.iniEdit:
short_open_tags = On ist gesetzt
Gibt es bei der Verwendung von mod_fcgi im Zusammenhang mit binary content irgendetwas besonderes zu beachten? In :google: habe ich jedenfalls keine spezifischen Problembeschreibungen im Zusammenhang mit binary content gefunden.