Go Back   vb.org Archive > vBulletin 3 Discussion > vB3 Programming Discussions
  #1  
Old 12-31-2006, 11:52 AM
sv1cec sv1cec is offline
 
Join Date: May 2004
Location: Athens, Greece
Posts: 2,091
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default Problem with getimagesize function

I have a serious problem with a modification I have done.

I've modified the handle_bbcode_img_match function in functions_bbcodeparse.php of vB, to check for large images in the posts. The code of the function has been extended to use the getimagesize function to check for the size of the images. However, this results in extreme increase of the time it takes to load a page, with lots of images. For example, a page which has 7 pictures and loads in 1.20 seconds without the size checking, takes 6.22 seconds if the function is used. Another one which has 26 pictures goes from 1.8 sec without the size checking to 30 secs when the size is checked.

Here is the code I am using to check the size of the pictures.

Code:
function handle_bbcode_img_match($link)
{
	// <-- This is the button/image that will be displayed instead of the big image.
	$img_replacement1 = "images/misc/toobigimage.gif"; 
	// <-- This is the button/image that will be displayed when there is no image at the URL.
	$img_replacement2 = "images/misc/notexistimage.gif";
	// <-- This is the maximum width that an image is allowed to be viewed safely.
	$img_max_width = 800; 
	// <-- This is the maximum height that an image is allowed to be viewed safely.
	$img_max_height = 600; 
	
		$link = strip_smilies(str_replace('\\"', '"', $link));
		$link = str_replace('  ', '', $link);
		
		// Let's get the properties of the image. We'll also check if the image exists
		if ($imginfo=@getimagesize($link)) 
		{
			// If image exists and its size is outside our specs....
			if (($imginfo[0] > $imginfo[1] and (($imginfo[0] > $img_max_width) or ($imginfo[1] > $img_max_height))) or ($imginfo[0] < $imginfo[1] and (($imginfo[1] > $img_max_width) or ($imginfo[0] > $img_max_height))) or ($imginfo[0] == $imginfo[1] and ($imginfo[0] * $imginfo[1] > $img_max_width * $img_max_height)))
			{
				// we change the image to a link,
				$w=imageResize($imginfo[0], $imginfo[1], 100);
				$thumb="<img src=\"$link\" $w>";
				$inp_string="<table><tr><td valign=\"middle\" align=\"left\"><a href=\"$link\" target=\"_blank\"><img src=\"$img_replacement1\" border=\"0\" alt=\"\"></A></td><td valign=\"middle\" align=\"left\"><a href=\"$link\" target=\"_blank\">$thumb</A></td></tr></table><p>";
				return $inp_string;
			} 
			else
			{
				// else, we return the image.
				$inp_string='<img src="' .  $link . '" border="0" alt="" />';
				return $inp_string;
			}
		}
		else
		{
			if (!$allowimgsizefailure) 
			{
				@unlink($link);				
				// If the image does not exist at the specified URL, show the proper icon and the URL
				$inp_string="<table><tr><td valign=\"middle\" align=\"left\"><img src=\"$img_replacement2\" border=\"0\" alt=\"\"></td><td valign=\"middle\" align=\"left\">($link)</td></tr></table><p>";
				return $inp_string;
			}
		}
}
Is that particular function so slow?? Has anyone managed to come up with a better/faster solution?

I would appreciate all the help you can give me on this.
Reply With Quote
  #2  
Old 01-05-2007, 03:08 PM
noppid noppid is offline
 
Join Date: Mar 2003
Location: Florida
Posts: 1,875
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I don't think the function is your problem. The problem lies, it appears IMO, in the latency of fetching and checking each remote image specified from the respective websites.
Reply With Quote
  #3  
Old 01-05-2007, 04:26 PM
sv1cec sv1cec is offline
 
Join Date: May 2004
Location: Athens, Greece
Posts: 2,091
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I could understand that, but the same page loads much faster without the image size checking. So it has to be something in the function, or in the way I've implemented it. However, most of the code is copied from vB itself, if my memory chips are still running. The funniest thing is that that particular page with the 26 images, which goes from 1.8 seconds to 30+, contains only correct-size images, so it doesn't do any resizing etc. I am getting frustrated about this, since I have no idea what is wrong with this.
Reply With Quote
  #4  
Old 01-05-2007, 04:41 PM
noppid noppid is offline
 
Join Date: Mar 2003
Location: Florida
Posts: 1,875
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Yes, when you remove that function you eliminate the remote calls to outside sites for images. The same function running local and fetching images local without going out to http would be much much faster.

You are at the mercy of the response time of the remote sites here IMO, not the function.
Reply With Quote
  #5  
Old 01-05-2007, 06:04 PM
sv1cec sv1cec is offline
 
Join Date: May 2004
Location: Athens, Greece
Posts: 2,091
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by noppid View Post
Yes, when you remove that function you eliminate the remote calls to outside sites for images. The same function running local and fetching images local without going out to http would be much much faster.

You are at the mercy of the response time of the remote sites here IMO, not the function.
Let me clarify that. Those 26 images are external to my site. So in both cases the program has to go and get them, from wherever they are stored. The time to show the page with those 26 images without the image size check is 1.8 sec. The time to show the same images with the image size check is 30 sec. some times even more.
Reply With Quote
  #6  
Old 01-05-2007, 07:05 PM
noppid noppid is offline
 
Join Date: Mar 2003
Location: Florida
Posts: 1,875
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

What I am saying is that you are making 26 remote calls. those are the slowness. if those images were on your server, it may would likely be faster. but in the end, you'll still be loading 26 tests.

Site to site latency is the big hit here and I don't think you can improve it.

You could try to fetch each image with fsockopen and buffer them using a time out to speed it up. But, you may then wind up with empty buffers and false not exists tests.
Reply With Quote
  #7  
Old 01-05-2007, 07:16 PM
sv1cec sv1cec is offline
 
Join Date: May 2004
Location: Athens, Greece
Posts: 2,091
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I am afraid I can't understand your point of view. Site to site latency is there, either with or without the image check. 26 remote calls are made either with or without the image check.
Reply With Quote
  #8  
Old 01-05-2007, 08:48 PM
noppid noppid is offline
 
Join Date: Mar 2003
Location: Florida
Posts: 1,875
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

No, the members browser calls the images, not your site in the case of normal display.

In your case, you are having your site fetch and size the image before displaying the img tags. Doing this causes your site to read the images from those sites which does not happen with an img tag.

So, in a normal situation, you supply the url and the members browser calls for the image.

In your case, your server fetches the image from the remote server then creates a url and the members browser fetches the image. That is two calls to a server per image you process. One for your server and one for the member.
Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 02:15 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.04097 seconds
  • Memory Usage 2,227KB
  • Queries Executed 13 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (1)ad_showthread_firstpost
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (1)bbcode_code
  • (1)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (8)post_thanks_box
  • (8)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (8)post_thanks_postbit_info
  • (8)postbit
  • (8)postbit_onlinestatus
  • (8)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_postinfo_query
  • fetch_postinfo
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete