CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP Entwicklung und Softwaredesign Hier können strukturelle (Programmier-) Konzepte diskutiert und Projekte vorgestellt werden |
25.04.2009, 13:35:30
|
Anfänger
|
|
Registriert seit: Apr 2009
Alter: 30
Beiträge: 15
|
|
Performance verbessern
Ich arbeite grade an einem Projekt. (Es ist auch schon veröffentlicht)
Wenn ihr mal auf die Seite geht werdet ihr verstehen worum es ungefähr geht. Ich hoffe ihr kennt Twitter und StudiVZ oder so ein bisschen.
Mein Projekt besteht eigentlich aus einem Webinterface, einer MySQL-Datenbank mit den ganzen Benutzerdaten und einem Skript, dass die Hauptarbeit macht und eben so jede Viertelstunde mit nem Cronjob dann ausgeführt wird.
Leider habe ich jetzt bereits 200 Nutzer und es werden mehr. Und irgendwie braucht das PHP-Skript natürlich immer länger und länger. Dazu kommt, dass es stehen bleibt, wenn es auf einen Nutzer stößt, der falsche Daten angegeben hat.
Also dachte ich mir, schreibste das mal neu. Das Problem mit dem anhalten bei falschen Daten ist jetzt auch behoben und ich hab sogar zum ersten Mal objektorientiert programmiert. Klappt eigentlich auch alles.
Aber es ist immer noch zu langsam. Ja und das ist meine Frage. Am meisten Zeit braucht ja immernoch cURL. Kann man das irgendwie optimieren? Hier mal die 2 Funktionen aus meiner Klasse.
Einmal für die Twitter API:
PHP-Code:
public function get_update($user, $password)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://twitter.com/statuses/user_timeline.json');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERPWD, $user.':'.$password);
$buffer = curl_exec($ch);
$json = json_decode($buffer);
$tweet = $json[0]->text;
return $tweet;
}
Und einmal um die Statusnachricht in einem der VZs zu ändern:
PHP-Code:
public function update_vz($text, $vz, $user, $password)
{
switch ($vz) {
case 'pvz':
$page_url = 'http://m.schuelervz.net/op/schuelervz/de/mcat/';
$needle = '/op/schuelervz/de/mcat/login/;jsessionid=';
break;
case 'svz':
$page_url = 'http://m.studivz.net/op/studivz/de/mcat/';
$needle = '/op/studivz/de/mcat/login/;jsessionid=';
break;
case 'mvz':
$page_url = 'http://m.meinvz.net/op/meinvz/de/mcat/';
$needle = '/op/meinvz/de/mcat/login/;jsessionid=';
break;
}
$ch = curl_init();
// Session-ID holen
$url = $page_url.'login/';
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en)');
$buffer = curl_exec($ch);
$session = substr($buffer,strpos($buffer,$needle)+strlen($needle),32);
// Einloggen ins VZ
$url = $page_url.'login/;jsessionid='.$session;
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'username='.$user.'&password='.$password);
$buffer = curl_exec($ch);
// Aktualisieren der Status-Nachricht
$url = $page_url.'status/senden/;jsessionid='.$session;
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'text='.$text);
$buffer = curl_exec($ch);
}
Geändert von JakobD (25.04.2009 um 17:45:33 Uhr)
|
27.04.2009, 11:01:39
|
|
Senior Member
|
|
Registriert seit: Nov 2003
Ort: Kempten @ Allgäu
Alter: 36
Beiträge: 1.408
|
|
AW: Performance verbessern
evtl kannst du die was rausholen, wenn du die Sockets direkt ansprichst, was aber nicht signifikant sein wird.
Du hast einfach das Problem, dass du immer auf die Gegenseite warten musst, was natürlich Zeit kostet.
Vielleicht würde es dir helfen, wenn du deine Arbeit einfach auf mehrere Threads verteilst, evtl mehrere Server? Hab keine Ahnung wo bei dir der Flaschenhals ist, so ganz ohne Glaskugel. Am besten du beobachtest mal ob du lokal irgendwo einen Flaschenhals hast, wenn nicht kannst du immernoch Threads parallel laufen lassen.
Gruß
Domi
__________________
the best way to be ready for the future is to invent it
|
27.04.2009, 18:37:32
|
Anfänger
|
|
Registriert seit: Apr 2009
Alter: 30
Beiträge: 15
|
|
AW: Performance verbessern
Zitat:
Zitat von Domi
evtl kannst du die was rausholen, wenn du die Sockets direkt ansprichst, was aber nicht signifikant sein wird.
Du hast einfach das Problem, dass du immer auf die Gegenseite warten musst, was natürlich Zeit kostet.
Vielleicht würde es dir helfen, wenn du deine Arbeit einfach auf mehrere Threads verteilst, evtl mehrere Server? Hab keine Ahnung wo bei dir der Flaschenhals ist, so ganz ohne Glaskugel. Am besten du beobachtest mal ob du lokal irgendwo einen Flaschenhals hast, wenn nicht kannst du immernoch Threads parallel laufen lassen.
Gruß
Domi
|
Parallel? Wie gehtn das? Weil das war eigentlich das was ich zuerst gesucht hab. Am meisten Zeit brauchen eben diese cURL Teile da. Wie kann man die Sockets direkt ansprechen? (bzw. was genau ist das?)
|
27.04.2009, 18:49:02
|
|
Senior Member
|
|
Registriert seit: Nov 2003
Ort: Kempten @ Allgäu
Alter: 36
Beiträge: 1.408
|
|
AW: Performance verbessern
kannst du nicht einfach mehrere Scripte per cronjob paar Sekunden versetzt starten lassen? Dann sollte er die doch parallel abarbeiten. Geht das nicht wird dir die Suchmaschine deines Vertrauens sicher eine Lösung dazu geben ;)
Domi
__________________
the best way to be ready for the future is to invent it
|
27.04.2009, 18:53:49
|
Anfänger
|
|
Registriert seit: Apr 2009
Alter: 30
Beiträge: 15
|
|
AW: Performance verbessern
Zitat:
Zitat von Domi
kannst du nicht einfach mehrere Scripte per cronjob paar Sekunden versetzt starten lassen? Dann sollte er die doch parallel abarbeiten. Geht das nicht wird dir die Suchmaschine deines Vertrauens sicher eine Lösung dazu geben ;)
Domi
|
naja mhh ich kenn mich mit cronjobs nicht so aus
also ich hab ne mysql-datenbank und für jeden user muss ein script gestartet werden ... also die zahl variiert und so .. sind cronjobs so flexibel und können auch mysql-datenbanken auslesen?
|
27.04.2009, 18:55:47
|
Administrator
|
|
Registriert seit: Jan 2002
Ort: Köln
Alter: 53
Beiträge: 1.276
|
|
AW: Performance verbessern
Hi,
also Du solltest wirklich erst einmal herausfinden wo der Flaschenhals ist. Einfach zu sagen es liegt an Curl ist absolut unzureichend denn das Problem kann ganz woanders liegen. Analysiere einfach mal mit Curl wie lange er für die einzelnen Bereiche (Nameserver abfragen, Anpingen der Seite, Response erhalten etc) benötigt.
Mit diesen Informationen kannst Du sehr gut sehen wo und wie Du optimieren kannst.
Bei unserem CronJob-Service machen wir das nicht anders - CURL und mehrere Threads mittels CronJob. Und der ballert mehrere 1000 pro Minute locker raus.
Damir
__________________
Qozido - Die Bilderverwaltung mit Logbuch für Taucher und Schnorchler.
www.qozido.de
|
27.04.2009, 19:08:48
|
Anfänger
|
|
Registriert seit: Apr 2009
Alter: 30
Beiträge: 15
|
|
AW: Performance verbessern
Und wie messe ich das?
|
27.04.2009, 19:13:55
|
Administrator
|
|
Registriert seit: Jan 2002
Ort: Köln
Alter: 53
Beiträge: 1.276
|
|
AW: Performance verbessern
Ich hab mal das Unnötige was Du nicht brauchst aus unserer Function heraus geschmissen und für Dich einige Parameter gesetzt - den Rest musst Du selber nach belieben anpassen:
PHP-Code:
<?PHP
function curlStart($domain){
$fp = curl_init($domain);
// Maximale Ausfuehrungszeit
curl_setopt($fp,CURLOPT_TIMEOUT,20);
// Durchlauf abbrechen wenn Server mit einem ERROR > 300 antwortet
curl_setopt($fp,CURLOPT_FAILONERROR,1);
// TRUE um den Tranfer als String zurückzuliefern, anstatt ihn direkt auszugeben.
curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1);
// TRUE um jedem "Location: "-Header zu folgen, den der Server als Teil der HTTP-Header zurückgibt.
curl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1);
// Wieviel Header er max. folgen soll - gibt man es nicht an sind es max. 20
curl_setopt($fp, CURLOPT_MAXREDIRS, 30);
// 2009-03-11 20:31:02
$message['start_time'] = date("Y-m-d H:i:s");
$output = curl_exec($fp);
$message['end_time'] = date("Y-m-d H:i:s");
$info = curl_getinfo($fp);
// letzte Fehlermeldung
if(curl_errno($fp) != 0){
$message['curl_errno'] = FALSE;
$message['curl_error'] = curl_error($fp);
}
else{
$message['curl_errno'] = TRUE;
$message['curl_error'] = "+OK";
}
$message['http_code'] = $info['http_code'];
$message['total_time'] = $info['total_time'];
//$message['output'] = $output;
$message['namelookup_time'] = $info['namelookup_time'];
$message['connect_time'] = $info['connect_time'];
$message['pretransfer_time'] = $info['pretransfer_time'];
$message['starttransfer_time'] = $info['starttransfer_time'];
$message['redirect_count'] = $info['redirect_count'];
$message['redirect_time'] = $info['redirect_time'];
curl_close($fp);
return $message;
}
print_r(curlStart("http://www.selfphp.de"));
?>
Bei SELFPHP kam gerade z.B. das heraus:
Code:
Array
(
[start_time] => 2009-04-27 19:10:23
[end_time] => 2009-04-27 19:10:23
[curl_errno] => 1
[curl_error] => +OK
[http_code] => 200
[total_time] => 0.031759
[namelookup_time] => 0.008693
[connect_time] => 0.008779
[pretransfer_time] => 0.008823
[starttransfer_time] => 0.020082
[redirect_count] => 0
[redirect_time] => 0
)
__________________
Qozido - Die Bilderverwaltung mit Logbuch für Taucher und Schnorchler.
www.qozido.de
|
28.04.2009, 20:39:19
|
Anfänger
|
|
Registriert seit: Apr 2009
Alter: 30
Beiträge: 15
|
|
AW: Performance verbessern
Mit dem Zeit messen mach ich später grade hab ich noch ein anderes Problem (das möglichst sofort behoben werden muss).
Falls ein User falsche Daten angibt stockt das ganze System und hört dann irgendwann wegen Timeout auf. Gibt es eine cURL-Option, die so was verhindert? Also wenn zum Beispiel länger als 5 Sekunden nix geht oder so? Oder gibt es andere Lösungsansätze für so etwas? TIA,
Jakob ;)
|
28.04.2009, 21:57:47
|
|
Senior Member
|
|
Registriert seit: Nov 2003
Ort: Kempten @ Allgäu
Alter: 36
Beiträge: 1.408
|
|
AW: Performance verbessern
Zitat:
Zitat von JakobD
Also wenn zum Beispiel länger als 5 Sekunden nix geht oder so?
|
... geht das nicht per timeout?
__________________
the best way to be ready for the future is to invent it
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 05:02:27 Uhr.
|