Smartor Photo Album mit Clowns Pack -> Tuning

Du hast Probleme beim Einbau oder bei der Benutzung eines Mods? In diesem Forum bist du richtig.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.0, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Benutzeravatar
Markus67
Ehrenadmin
Beiträge: 28346
Registriert: 12.01.2004 16:02
Wohnort: Neuss
Kontaktdaten:

Beitrag von Markus67 »

Hi ...

die Änderungen sind für den "Full Album Pack" gedach und nicht für das normale Album von Smartor :wink:

Den Link dorthin findest du im ersten Beitrag auf dieser Seite

Markus
dennis84
Mitglied
Beiträge: 243
Registriert: 06.04.2005 16:22
Wohnort: NRW
Kontaktdaten:

Beitrag von dennis84 »

Hallo mgutt,
habe deinen Tipp mal eingebaut und bin begeistert! :o :o
Die Vorschauseite ist in weniger als einer Sekunde komplett geladen (dsl3000 -40Bilder)
Auch das switchen der album_showpage geht rasend schnell.. leider bleibt dann das Problem mit dem Bildklau, kann ich da ne htaccess oder dergleichen erstellen?

Kann man dies auch mit der album.php (Vorschaubilder) machen? Hab geshen bei dir auf der Seite hast du die Thumbs deaktiviert und lässt nur die drei blöcke anzeigen.

Vielen Dank für dein Snippet :D
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

Ich gehe nun Schritt für Schritt vor und entferne das Album aus meinem Forum.

Wer also nur die Performance steigern will, dem wird nicht jeder Tipp helfen, der hier noch folgen wird. Ich erkläre aber immer was ich tue.

Da ich in Beiträgen ebenfalls erlaubt habe, dass Bilder aus dem Album verlinkt werden hatte ich das Problem, dass unendlich viele Bilder auf einer Seite geladen werden können. D.h. pro Bild mindestens 2 Queries. Weiterhin war einer davon total lahm.

Daher habe ich mir erlaubt das zu ändern. Nun werden keine Thumbnails mehr erstellt, wenn diese fehlen sollten. (daher nicht den Cache löschen!) Auch habe ich den Viewcounter wegrationalisiert, da ich ihn für überflüssig hielt. Als letztes habe ich auch die Wasserzeichenfunktion rausgeschmissen, da dabei jedes Bild neu berechnet wurde was nicht gerade toll für die CPU bzw. Arbeitsspeicher ist.

Obwohl ich die album_pic.php eigentlich gar nicht mehr benutze und ich die Bilder ja auf Grund des Tricks aus dem 1. Beitrag nun als richtige Bilder darstellen lasse und sie nicht erst aus der Datenbank lade, blieben immer noch eine ganze Menge an Aufrufen übrig, da sie immernoch in Beiträgen verlinkt sind. Insgesamt waren das letzten Monat ca. 200.000 Aufrufe. Mit der nun angesprochenen Aktion spare ich mir also 200.000 Update-Queries und nochmal 200.000 schnellere Queries sind nun auch dabei *freu*

Hier meine aktuelle album_pic.php:

Code: Alles auswählen

<?php 

define('IN_PHPBB', true); 
$phpbb_root_path = './'; 
include($phpbb_root_path . 'extension.inc'); 
include($phpbb_root_path . 'common.'.$phpEx); 

// ------------------------------------ 
// Check the request 
// ------------------------------------ 
if( isset($HTTP_GET_VARS['pic_id']) ) 
{ 
   $pic_id = intval($HTTP_GET_VARS['pic_id']); 
} 
else if( isset($HTTP_POST_VARS['pic_id']) ) 
{ 
   $pic_id = intval($HTTP_POST_VARS['pic_id']); 
} 
else 
{ 
   message_die(GENERAL_MESSAGE, 'No pics specified'); 
} 

//--- Album category Hierarchy : begin
//--- version : 1.1.0
// ------------------------------------ 
// Get this pic info
// ------------------------------------ 
$sql = "SELECT pic_filename, pic_thumbnail
		FROM ". ALBUM_TABLE ."
		WHERE pic_id = '$pic_id'";

if( !$result = $db->sql_query($sql) ) 
{ 
   message_die(GENERAL_ERROR, 'Could not query pic information', '', __LINE__, __FILE__, $sql); 
} 

$thispic = $db->sql_fetchrow($result);
$db->sql_freeresult($result);

$pic_filetype = substr($thispic['pic_filename'], strlen($thispic['pic_filename']) - 4, 4);
$pic_filename = $thispic['pic_filename'];

if( empty($thispic) or !file_exists(ALBUM_UPLOAD_PATH . $pic_filename) )
{
   message_die(GENERAL_MESSAGE, $lang['Pic_not_exist']);
}

// ------------------------------------ 
// Okay, now we can send image to the browser 
// ------------------------------------ 
switch( $pic_filetype ) 
{ 
   case '.png': 
      header('Content-type: image/png'); 
      break; 

   case '.gif': 
      header('Content-type: image/gif'); 
      break; 

   case '.jpg': 
      header('Content-type: image/jpeg'); 
      break; 

   default: 
      message_die(GENERAL_MESSAGE, 'The filename data in the DB was corrupted'); 
} 

readfile(ALBUM_UPLOAD_PATH  . $thispic['pic_filename']); 

exit; 

?>
Jetzt werde ich versuchen ein Script zu schreiben, dass alle album_pic.php Links in echte Bilderurls umwandelt. So dass ich endlich ganz auf diese Queries bzw. die Datei verzichten kann.
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
Gumfuzi
Ehemaliges Teammitglied
Beiträge: 2448
Registriert: 26.03.2004 22:25
Wohnort: Linz, AT
Kontaktdaten:

Beitrag von Gumfuzi »

Hoffentlich werden all diese Performance-Änderungen bei der nächsten Version des Mods berücksichtigt.

Frage:
diese Wasserzeichen, werden die auch mitgespeichert im Cache oder nicht (wenn man das zB. nur für Gäste aktiviert hat)? Ich vermute mal nicht, oder?
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

Diese "Tuning"-Maßnahmen werden kaum berücksichtigt werden, da sowas wie Wasserzeichen etc. Wunschmodis sind von Usern, die kaum darauf verzichten möchten.

Wie Du schon richtig vermutet hast fallen die Wasserzeichen dann raus.

Besser wäre es, wenn man bei Upload das Wasserzeichen fest einbinden würde und damit abspeichert. Wobei dann aber in ein extra Wasserzeichenverzeichnis, damit die Originalbilder nicht verschandelt werden.

Ähnlich einer Autogenerierung des Caches, nur halt für Bilder mit Wasserzeichen.

Viele wissen einfach nicht wie speicherintensiv die Bildberechnung ist.

Dann der Viewcounter.. das wollen die User ja auch, wobei diese Änderung fast nicht nötig erscheint, wenn man ein normal großes Forum hat. Ich kann nur gut darauf verzichten, weil ich das in Zukunft wie gesagt anders lösen werde.

Ich weiß nicht wann, aber irgendwann wird es ein Album basierend auf dem Attachment Mod von mir geben: (unter "Album" gibts die erste Ansicht bzw. im Forum kann man die entsprechenden Beiträge heraussuchen)
http://w0072572.dd7928.kasserver.com/phpBB2/

Weiterhin habe ich große Probleme mit dem Attachment Mod, weil ich X-tausend Dateien im Verzeichnis "files" habe und das Verzeichnis selbst deswegen gar nicht mehr zu öffnen ist. Daher bat ich schon dringend um eine Änderung des Mods, damit man z.b. "files2006" automatisiert anlegen kann.


EDIT:

So nun habe ich alle album_urls gegen die echten Bilderadresse in Beiträgen ersetzen lassen:
Post-ID 230 wird abgearbeitet...
1. Durchlauf mit ID: 4
alte Url maxrev.de/album_pic.php?pic_id=4 wird zu: maxrev.de/album_mod/upload/2981d0d2a0b6a36962ffe24c6f8b10b4.jpg
2. Durchlauf mit ID: 5
alte Url maxrev.de/album_pic.php?pic_id=5 wird zu: maxrev.de/album_mod/upload/0d8adbf9fef0544a99ba47d4b69e64aa.jpg
...updated database.

Post-ID 232 wird abgearbeitet...
1. Durchlauf mit ID: 6
alte Url maxrev.de/album_pic.php?pic_id=6 wird zu: maxrev.de/album_mod/upload/0ac165ad2940eb3abbdc9995765aace6.jpg
...updated database.

Post-ID 249 wird abgearbeitet...
1. Durchlauf mit ID: 7
alte Url maxrev.de/album_pic.php?pic_id=7 wird zu: maxrev.de/album_mod/upload/7325bbe709ad110bc191600068f4966d.jpg
...updated database.

Post-ID 287 wird abgearbeitet...
usw.....
Dazu habe ich den folgenden Codeschnippsel benutzt (ACHTUNG es muss händisch die Url etc. angepasst werden, sonst geht das kräftig in die Hose!):

Code: Alles auswählen

<?php 

define('IN_PHPBB', true); 
$phpbb_root_path = './'; 
include($phpbb_root_path . 'extension.inc'); 
include($phpbb_root_path . 'common.'.$phpEx); 

//
// Get the album_pic.php-urls
//
$sql = "SELECT post_id, post_text
		FROM phpbb_posts_text 
			WHERE post_text LIKE '%album_pic.php%'
		LIMIT 0,30";
if ( !($result = $db->sql_query($sql)) )
{
	message_die(GENERAL_ERROR, "Could not obtain post information.", '', __LINE__, __FILE__, $sql);
}

// Did the query return any data?
if ( $row = $db->sql_fetchrow($result) )
{
	$i = 0;
	do
	{
		$post_id = $row['post_id'];
		$post_text = $row['post_text'];

		echo "Post-ID $post_id wird abgearbeitet...<br />";

		preg_match_all('#(deindomain.de/album_pic.php\?pic_id=)([0-9]{0,5})#i', $post_text, $treffer);
		$urls = $treffer[0];
		$ids = $treffer[2];

		$count_ids = count($ids);
		for($i = 0; $i < $count_ids; $i++)
		{
			echo $i + 1 . ". Durchlauf mit ID: $ids[$i] <br />";

			$sql = "SELECT pic_filename
				FROM phpbb_album
					WHERE pic_id = " . $ids[$i];
			if ( !($result2 = $db->sql_query($sql)) )
			{
				message_die(GENERAL_ERROR, "Could not obtain pic information.", '', __LINE__, __FILE__, $sql);
			}
			$row2 = $db->sql_fetchrow($result2);
			$db->sql_freeresult($result2);

			echo "alte Url deindomain.de/album_pic.php?pic_id=" . $ids[$i] . " wird zu: deindomain.de/album_mod/upload/" . $row2['pic_filename'] . "<br />";
			$post_text = preg_replace('#(deindomain.de/album_pic.php\?pic_id=[0-9]{0,5})#i', "deindomain.de/album_mod/upload/" . $row2['pic_filename'], $post_text, 1);
		}

		$post_text = addslashes($post_text);
		$post_text = str_replace("\'", "''", $post_text);
		$post_text = str_replace('"', '\"', $post_text);

		//
		// Update the post text
		//
		$sql = "UPDATE phpbb_posts_text
			    SET post_text = '$post_text'
					WHERE post_id = $post_id";
		if ( !$db->sql_query($sql) )
		{
			message_die(GENERAL_ERROR, 'Could not update post text.', '', __LINE__, __FILE__, $sql);
		}

		echo "...updated database.<br /><br />";
		$i++;
	}
	while ( $row = $db->sql_fetchrow($result) );
	$db->sql_freeresult($result);
}

?>
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
Gumfuzi
Ehemaliges Teammitglied
Beiträge: 2448
Registriert: 26.03.2004 22:25
Wohnort: Linz, AT
Kontaktdaten:

Beitrag von Gumfuzi »

jo, danke für die Info!
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

Auf Grund der Änderungen habe ich die album_pic.php und album_thumbnail.php komplett entfernt.

Mal sehen was die nächsten Tage bringen. Vielleicht hat das ja tatsächlich was an Performance gebracht.

Gruß
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

Ich möchte nur mal eben mitteilen, dass im Album noch eine extreme Serverbremse steckt. Die saug mit steigender Anzahl der Mitglieder den Arbeitsspeicher leer:

album_upload.php

Ich suche gerade eine Problemlösung. Der füllt ein Array.. das würde nichtmal hier in den Beitrag passen :roll:

Alleine der Auszug der Daten war 12 MB groß (nur Text) :o

EDIT:

Hier ein kleiner Auszug:

Code: Alles auswählen

userinfo enthält ein Array mit den folgenden Werten:
0['Array']
1['Array']
2['Array']
Und das geht dann bis zur letzten ID (bei mir ca. 11k User :cry: )

Danach wird eine Jumpbox erstellt.. mit all den Usern :evil:


EDIT2:

Hier der Bösewicht:

Code: Alles auswählen

    	// build fake list of personal galleries (these will get created when needed later automatically
		$userinfo = album_get_nonexisting_personal_gallery_info();
print_r($userinfo);
exit;

EDIT3:
Die Rechteüberprüfung ist total daneben:

Code: Alles auswählen

		 	// is user allowed to create this personal gallery ?
		 	// NOTE : that it isn't nesecary to create the $personal_gallery variable first,
		 	//        it will be generated inside the album_permissions function if needed
		 	//		  but here it's done to make the code easier to read
		 	$personal_gallery = init_personal_gallery_cat($userinfo[$idx]['user_id']);
			$album_user_access = album_permissions($userinfo[$idx]['user_id'], 0, ALBUM_AUTH_CREATE_PERSONAL, $personal_gallery);

			if (album_check_permission($album_user_access, ALBUM_AUTH_CREATE_PERSONAL) == TRUE)
			{
				$selected = (($userdata['user_id'] ==  $userinfo[$idx]['user_id'])) ? ' selected="selected"' : '';
			 	$personal_gallery_list .= '<option value="-'.$userinfo[$idx]['user_id'].'" ' . $selected . '>' . sprintf($lang['Personal_Gallery_Of_User'], $userinfo[$idx]['username']) . '</option>';
			}
EDIT4:
Was soll diese schwachsinnige Funktion :-?

Code: Alles auswählen

// ------------------------------------------------------------------------
// Return a list of user ids and usernames which doesn't have a personal gallery
// ------------------------------------------------------------------------
function album_get_nonexisting_personal_gallery_info()
{
	global $db, $lang;

	$userinfo = array();
	$album_user_ids = ANONYMOUS;

	// ------------------------------------------------------------------------
	// sine MySQL doesn't support sub selects in select statements I have to split
	// this statement up into two statements...or maybe I should try harder to do it in one ;)
	// ------------------------------------------------------------------------

	// first get the list of users who does have a personal gallery
  	$sql = "SELECT DISTINCT user_id, cat_id
			FROM ". USERS_TABLE ." AS u, ". ALBUM_CAT_TABLE ." AS c
			WHERE c.cat_user_id = u.user_id
				AND c.cat_parent = 0";

    if( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Internal Message : Could not read user infor for fake list.', '', __LINE__, __FILE__, $sql);
	}

    while ($row = $db->sql_fetchrow($result) )
	{
	 	$album_user_ids .= ($album_user_ids == '') ? $row['user_id'] : ',' . $row['user_id'];
	}

	// get user names and user ids for info list
	$sql = "SELECT user_id,username
			FROM ". USERS_TABLE . "
	        WHERE user_id NOT IN (" . $album_user_ids .")"; // AND user_id <> " . ANONYMOUS;

	if( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Internal Message : Could not read user info for fake list.', '', __LINE__, __FILE__, $sql);
	}

	if ($db->sql_numrows($result) > 0)
	{
		while ($row = $db->sql_fetchrow($result) )
		{
		 	$userinfo[] = $row;
		}
	}
	
	$db->sql_freeresult($result);

	return $userinfo;
}
Wofür braucht der eine Liste der User, die keine persönliche Gallery erstellen dürfen..

die Daten werden übrigens dazu verwendet um die Jumpbox auf der album_upload Seite zu erstellen, wo private Gallerien wichtig sind.
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
mgutt
Mitglied
Beiträge: 2999
Registriert: 31.08.2004 16:44
Wohnort: Hennef
Kontaktdaten:

Beitrag von mgutt »

Sorry für Doppelpost.


Also dieser ganze Unfug kann weg: (zu finden in album_hierarchy_sql.php)

Code: Alles auswählen

/*
// ------------------------------------------------------------------------
// Return a list of user ids and usernames which doesn't have a personal gallery
// ------------------------------------------------------------------------
function album_get_nonexisting_personal_gallery_info()
{
	global $db, $lang;

	$userinfo = array();
	$album_user_ids = ANONYMOUS;

	// ------------------------------------------------------------------------
	// sine MySQL doesn't support sub selects in select statements I have to split
	// this statement up into two statements...or maybe I should try harder to do it in one ;)
	// ------------------------------------------------------------------------

	// first get the list of users who does have a personal gallery
  	$sql = "SELECT DISTINCT user_id, cat_id
			FROM ". USERS_TABLE ." AS u, ". ALBUM_CAT_TABLE ." AS c
			WHERE c.cat_user_id = u.user_id
				AND c.cat_parent = 0";

    if( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Internal Message : Could not read user infor for fake list.', '', __LINE__, __FILE__, $sql);
	}

    while ($row = $db->sql_fetchrow($result) )
	{
	 	$album_user_ids .= ($album_user_ids == '') ? $row['user_id'] : ',' . $row['user_id'];
	}

	// get user names and user ids for info list
	$sql = "SELECT user_id,username
			FROM ". USERS_TABLE . "
	        WHERE user_id NOT IN (" . $album_user_ids .")"; // AND user_id <> " . ANONYMOUS;

	if( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Internal Message : Could not read user info for fake list.', '', __LINE__, __FILE__, $sql);
	}

	if ($db->sql_numrows($result) > 0)
	{
		while ($row = $db->sql_fetchrow($result) )
		{
		 	$userinfo[] = $row;
		}
	}
	
	$db->sql_freeresult($result);

	return $userinfo;
}
*/
und in album_upload.php einfach das meiste auskommentieren:

Code: Alles auswählen

	// --------------------------------
	// Build categories select
	// --------------------------------
	//--- Album Category Hierarchy : begin
	//--- version : 1.3.0	
	album_read_tree($userdata['user_id'], ALBUM_READ_ALL_CATEGORIES|ALBUM_AUTH_VIEW_AND_UPLOAD);
/*
   	// build fake list of personal galleries (these will get created when needed later automatically
	$userinfo = album_get_nonexisting_personal_gallery_info();

	$personal_gallery_list = '';

	$count = count($userinfo);
	for($idx=0; $idx < $count; $idx++)
	{
		// is user allowed to create this personal gallery ?
		// NOTE : that it isn't nesecary to create the $personal_gallery variable first,
		//        it will be generated inside the album_permissions function if needed
		//		  but here it's done to make the code easier to read
		$personal_gallery = init_personal_gallery_cat($userinfo[$idx]['user_id']);
		$album_user_access = album_permissions($userinfo[$idx]['user_id'], 0, ALBUM_AUTH_CREATE_PERSONAL, $personal_gallery);

		if (album_check_permission($album_user_access, ALBUM_AUTH_CREATE_PERSONAL) == TRUE)
		{
			$selected = (($userdata['user_id'] ==  $userinfo[$idx]['user_id'])) ? ' selected="selected"' : '';
		 	$personal_gallery_list .= '<option value="-'.$userinfo[$idx]['user_id'].'" ' . $selected . '>' . sprintf($lang['Personal_Gallery_Of_User'], $userinfo[$idx]['username']) . '</option>';
		}
	}

	if (!empty($personal_gallery_list))
	{
		$personal_gallery_list = '<option value="'.ALBUM_JUMPBOX_SEPERATOR.'">------------------------------</option>' . $personal_gallery_list;
	}
*/
	$select_cat = '<select name="cat_id">';
	$select_cat .= album_get_tree_option($cat_id, ALBUM_AUTH_VIEW_AND_UPLOAD);
	if ( $cat_id == 0 )
	{
		$personal_gallery_list = '<option value="'.ALBUM_JUMPBOX_SEPERATOR.'">------------------------------</option>';
	 	$personal_gallery_list .= '<option value="-' . $userdata['user_id'] . '" selected="selected">' . sprintf($lang['Personal_Gallery_Of_User'], $userdata['username']) . '</option>';
	}
	$select_cat .= $personal_gallery_list;
	$select_cat .= '</select>';
//	unset($personal_gallery_list);

	album_free_album_data();
	//--- Album Category Hierarchy : end
Das Ergebnis ist das gleiche, nur das die ganzen "Fake"-Alben der User, die eh keine Gallery haben raus gelassen werden.

Erspart das weiße Seiten-Problem, erspart den empfindlichen Arbeitsspeicherverbrauch, erspart zwei zusätzliche Datenbankabfragen usw.

Das sollte ein Pflichtupdate im Mod sein. Aber der Author entwickelt den Mod nicht weiter...

Gruß
meine Foren: http://www.maxrev.de/communities.htm
Ich kaufe Dein Forum! Angebote bitte an marc at gutt punkt it
Benutzeravatar
Gumfuzi
Ehemaliges Teammitglied
Beiträge: 2448
Registriert: 26.03.2004 22:25
Wohnort: Linz, AT
Kontaktdaten:

Beitrag von Gumfuzi »

also diese Bremse ist nur aktiv, wenn man ein Bild uppt? oder woanders im Album auch?
Antworten

Zurück zu „phpBB 2.0: Mod Support“