Script "Serverschonender" machen

Andreas Späth

Erfahrenes Mitglied
Hallo ihr Freunde von PHP,

wer mich kennt weis dass ich mit PHP irgendwie auf Kriegsfuß stehe, und zwar etwas PHP kann, aber nicht wirklich den Durchblick hab.

Und ich hoffe erstmal dassich sowas hier überhaupt posten/fragen darf, falls nicht werd ich die Steinigung wie ein Mann ohne Augenbinde über mich ergehen lassen ;)

Ich habe folgendes Script, welches in einer Datenbank eines phpBB die bbcode_uids wiederherstellen soll.

Hier erstmal das Script

PHP:
<?php
##
## ACHTUNG! Vor der Nutzung unbedingt ein Datenbankbackup machen
## Der Author übernimmt keine Haftung für etwaige Schäden am Board
## bei Nutzung dieses Scripts!
##
 
define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);
include($phpbb_root_path . '/includes/bbcode.'.$phpEx);
//
// Set page ID for session management
//
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);
//
// End session management
//
// Erste Message ohne bbcode_uid suchen
$sql = "SELECT post_id, post_text FROM " . POSTS_TEXT_TABLE . "
WHERE bbcode_uid = ''
ORDER BY post_id ASC
LIMIT 1";
if ( !$result= $db->sql_query($sql) )
{
message_die(GENERAL_ERROR, "Konnte erste Message ohne bbcode_uid's nicht holen", '', __LINE__, __FILE__, $sql);
}
if ( !$row = $db->sql_fetchrow($result) )
{
message_die(GENERAL_ERROR, "Konnte erste Message ohne bbcode_uid's nicht holen", '', __LINE__, __FILE__, $sql);
}
prep_message($row['post_id'], $row['post_text']);
// Alles fertig
message_die(GENERAL_MESSAGE, "Alle Messages verarbeitet.");
// Rekursive BBCode_uid Erzeuger-Funktion
function prep_message($post_id, $message)
{
global $db;
// Möglicherweise vorhandene uid's aus der Message löschen.
$message = preg_replace("#\[(.*?)(:.{10}(.*?))?\]#", "[\\1\\3]", $message);
// Zufällige BBCode_uid erzeugen
$bbcode_uid = make_bbcode_uid();
// Text des Postings parsen
$message = addslashes(bbencode_first_pass($message, $bbcode_uid));
// Den Eintrag des Postings in der DB updaten
$sql = "UPDATE " . POSTS_TEXT_TABLE . "
SET post_text = '$message', bbcode_uid = '$bbcode_uid'
WHERE post_id = $post_id";
if ( !$db->sql_query($sql) )
{
message_die(GENERAL_ERROR, "Updaten der Message fehlgeschlagen", '', __LINE__, __FILE__, $sql);
}
// Nächste Message ohne bbcode_uid suchen
unset ($row);
$sql = "SELECT post_id, post_text FROM " . POSTS_TEXT_TABLE . "
WHERE bbcode_uid = ''
ORDER BY post_id ASC
LIMIT 1";
if ( !$result= $db->sql_query($sql) )
{
message_die(GENERAL_ERROR, "Konnte nächste Message ohne bbcode_uid's nicht holen", '', __LINE__, __FILE__, $sql);
}
if ( !$row = $db->sql_fetchrow($result) )
{
return;
}
if ( isset($row['post_id']) )
{
// Nächste Rekursion angehen
prep_message($row['post_id'], $row['post_text']);
}
return;
}

Ich versteh zum Großteil nicht wirklich viel von dem was da passiert, oder besser gesagt ich hab keine Ahnung wie ich dieses Ding dazu bring den Server nicht den Heldentot sterben zu lassen.

Gibt es eine möglichkeit dieses Script in irgendeiner Art einzuschränken, so dass es diese "Endlosschleife" zB nur 100 mal durchführt, und dann aufhört ?
Oder generell ein Weg das Serverschonender zu machen, zweimal den Apache abschiesen hat mir nämlich gereicht, auch wenn es ansonsten zu funktionieren scheint.

Ich wäre wirklich unheimlich dankbar wenn mir da Jemand helfen könnte, weil bei 84.000 Postings im Forum für jedes die bbcode_uid per Hand wiederstelen.. :rolleyes:
 
ich sehe beim Überfliegen keine Endlosschleife.. er holt sich halt jede Nachricht einzeln, bearbeitet die bbcode_uid's und schreibt den geänderten Datensatz zurück in die Tabelle. Bei 84.000 Beiträgen braucht das natürlich seine Zeit..

Hast du Probleme mit der Skript-Laufzeit oder einfach der Server-Performance?

Idee:
Forum für 1 Stunde vom Netz, Backup der Datenbank auf den PC ziehen, das Skript lokal drüberjagen (da kannst du wenigstens die Laufzeitbeschränkung umgehen, falls das dein Webhoster nicht zulässt) und danach wieder auf den Server laden - fertig =)
 
Ich kann auch nichts wirklich verlangsamendes entdecken.
Das einzige was ein wenig Performence bringen könnte wäre Dinge wie

PHP:
$sql = "SELECT post_id, post_text FROM " . POSTS_TEXT_TABLE . "
WHERE bbcode_uid = ''
ORDER BY post_id ASC
LIMIT 1";

durch

PHP:
$sql = 'SELECT post_id, post_text FROM ' . POSTS_TEXT_TABLE . '
WHERE bbcode_uid = \'\'
ORDER BY post_id ASC
LIMIT 1';

zu ersetzen, da PHP in Anführungsstrichen stehenden Text immer nach Variabeln durchparst, und da diese sowieso extra stehen.... .
(es sind auch einfache Ausgaben vorhanden, die so etwas beschleunigt werden könnten.)

Ansonsten habe ich wie gesagt, nichts gesehen, habe allerdings auch nur überflogen. :-(
 
Also es geht hauptsächlich um Serverperformance, sobald dieses Script aufgerufen wird, geht der Server in die Knie.
Mein Hoster hat mir deswegen Vorgestern vorübergehend den Account dichtgemacht. Es wundert mich persönlich dass der bei einem solchem Problem überhaupt mal reagiert hatte... da das Script bereits seit über einer Woche nachts per Cronjob lief...
 
Nein also seit ca einer Woche, zwischen 0 und 5 Uhr Nachts, alle 15 Minuten.
Das Script wird halt durch die Laufzeitbeschränkung (die ich nicht beeinflussen kann) nach 30 Sekunden abgewürgt, und da schafft es nunmal nicht wirklich postings.
Ich weis ehrlichgesagt gerade auch garnicht wie weit es seine Aufgabe bis jetzt geschafft hat, müsste ich mal eben in die Datenbank schielen.


Edit: Ich hätte mal in die Datenbank schauen sollen, das Script hat in dieser Woche ~82.000 Postings geschafft.
Würde mich mein Hoster das noch eine Nacht ausführen lassen....

Ich glaub ich schreib denen mal schnell eine eMail ;)

Auf jeden Fall danke für die Hilfe :)
 
Zuletzt bearbeitet:
Zurück