Hi, i ran into a problem with mod_fcgid and i wonder whether anybody can replicate my problem.
There is also a bug report in here: http://sourceforge.net/tracker/?func=detail&aid=2854396&group_id=174879&atid=870991 Since i wrote the bug report, i did a) update to Apache 2.2.13, PHP 5.3.0 and mod_fcgid 2.2 (was 2.1 before) b) downgrade php to 5.2.9 and update mod_fcgid to 2.3.1 beta but the error remains (should have upgraded before <sigh> but that is why i write here now). My server: Operating systemLinux 2.6.9-023stab048.6-smp CPUAuthenticAMD, Quad-Core AMD Opteron(tm) Processor 2352 Trying to replicate the problem just put a image.jpg file into a folder (i.e. 800x600 pixels) and another watermark.jpg like a banner 486x60 (size does not matter, it should just be smaller than the original image). Then put the following .htaccess into the same folder: #--- RewriteEngine on Options FollowSymlinks RewriteBase / AddHandler wtmrk jpg action wtmrk /modify.php #--- The code of the modify.php is this: --- <?php /* 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'] . '/watermark.jpg'); // 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 // ---------------------------------------------------------------------------------------- /* ======================== 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); } ?> --- When i use this url http://www.domain.tld/image.jpg i get this error mesage after updating to PHP 5.3.0 (from 5.2.6), Apache 2.2.13 (from 2.2.4) and mod_fcgid 2.2 (from 2.1): --- PHP Parse error: syntax error, unexpected '[' in /srv/www/vhosts/httpdocs/image.jpg on line 234 PHP Warning: Unexpected character in input: '' (ASCII=16) state=0 in /srv/www/vhosts/httpdocs/image.jpg on line 234 --- So, to me it seems the PHP parser tries to parse the content instead of the browser sending it with the image/jpeg (or image/jpg) header. When i use this url http://www.domain.tld/modify.php/image.jpg the image will be shown with the watermark. Any issues with the 'AddHandler' and/or 'action' statement in .htaccess probably? As soon as i switch from mod_fcgid to CGI or mod_php it does work using http://www.domain.tld/image.jpg. My httpd.include: --- <IfModule mod_fcgid.c> <Files ~ (\.php)> SetHandler fcgid-script FCGIWrapper /usr/bin/php-cgi5 .php Options +ExecCGI allow from all </Files> </IfModule> --- My /etc/apache2conf.d/mod_fcgid.conf (i did only add "Passheader Authorization" to it but this does not make a difference, obviously...): --- ################################################################################ ## ## Sample config for apache2_mod-fcgid ## ## All lines, that are commented out, reflect the default values. ## <IfModule fcgid_module> ## ## An idle fastcgi application will be terminated after IdleTimeout seconds. ## #IdleTimeout 300 ## ## The scan interval for idle fastcgi applications in seconds. ## #IdleScanInterval 120 ## ## a fastcgi application will be terminated if handing a single request longer ## than busy timeout. Value in seconds. ## #BusyTimeout 300 ## ## The scan interval for busy timeout fastcgi applications. Value in seconds. ## #BusyScanInterval 120 ## ## The scan interval for exit pending fastcgi applications. fastcgi applications ## will be terminated within this scanning. Value in seconds. ## #ErrorScanInterval 3 ## ## The scan interval for zombie process. Value in seconds. ## #ZombieScanInterval 3 ## PassHeader Authorization ## ## ## A fastcgi application will be terminated if lifetime expired, even no error ## is detected. Value in seconds. ## #ProcessLifeTime 3600 ## ## The directory to put the UNIX domain socket. (UNIX only) ## SocketPath /var/lib/apache2/fcgid/ ## ## The share memory file path. ## SharememPath /var/lib/apache2/fcgid/shm ## ## The spawn-speed control score up water limit. Score increases while a process ## is spawned or terminated, and decreases as time progresses; while the score is ## higher than SpawnScoreUpLimit, the spawning will be held for a while. The ## higher this number is, the higher speed of the spawning can be. ## #SpawnScoreUpLimit n (10) ## ## The weight of spawning. This weight will be plused to the spawn-control ## score on every spawn. The higher this number is, the lower speed of spawning ## can be. ## #SpawnScore n (1) ## ## The weight of termination. This weight will be plused to the score while ## fastcgi process terminates. The higher this number is, the lower speed of ## spawning can be. ## #TerminationScore n (2) ## ## The max count of total fastcgi process count. ## #MaxProcessCount n (1000) ## ## The maximum number of fastcgi application instances allowed to run for any ## one fastcgi application. ## #DefaultMaxClassProcessCount n (100) ## ## The default environment variables before a fastcgi application is spawned. ## You can set this configuration more than once. ## #DefaultInitEnv env_name env_value ## ## The connect timeout to a fastcgi application. Value in seconds. ## ## Default value: 2 ## IPCConnectTimeout 10 ## ## The communication timeout to a fastcgi application. Please increase this ## value if your CGI have a slow initialization or slow respond. Value in ## seconds. ## ## Default value: 5 ## IPCCommTimeout 40 ## ## CGI output cache buffer size. Value in kilobytes. ## #OutputBufferSize 64 ## ## Associate .fcgi files with mod_fcgid ## #AddHandler fcgid-script .fcgi ## ## PHP via FastCGI ## ## uncomment the following line if you want to handle php via mod_fcgid ## #<FilesMatch "\.php$"> # AddHandler fcgid-script .php # FCGIWrapper /srv/www/cgi-bin/php5 .php # Options +ExecCGI #</FilesMatch> ## </IfModule> # End of <IfModule fcgid_module> ## ################################################################################ I would appreciate any hints as i would prefer to use mod_fcgid. Thanks in advance, Marcus
