SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



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



:: Buchempfehlung ::

PHP 5.3 & MySQL 5.1

PHP 5.3 & MySQL 5.1 zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP Entwicklung und Softwaredesign

PHP Entwicklung und Softwaredesign Hier können strukturelle (Programmier-) Konzepte diskutiert und Projekte vorgestellt werden

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 25.04.2009, 14:35:30
JakobD JakobD ist offline
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($chCURLOPT_URL'http://twitter.com/statuses/user_timeline.json');
        
curl_setopt($chCURLOPT_HEADERfalse);
        
curl_setopt($chCURLOPT_POST0);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
curl_setopt($chCURLOPT_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($chCURLOPT_URL,$url);
        
curl_setopt($chCURLOPT_HEADERfalse);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
curl_setopt($chCURLOPT_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($chCURLOPT_URL,$url);
        
curl_setopt($chCURLOPT_POST1);
        
curl_setopt($chCURLOPT_POSTFIELDS'username='.$user.'&password='.$password);
        
$buffer curl_exec($ch);

        
// Aktualisieren der Status-Nachricht
        
$url $page_url.'status/senden/;jsessionid='.$session;
        
curl_setopt($chCURLOPT_URL,$url);
        
curl_setopt($chCURLOPT_POSTFIELDS'text='.$text);
        
$buffer curl_exec($ch);
    } 

Geändert von JakobD (25.04.2009 um 18:45:33 Uhr)
Mit Zitat antworten
  #2  
Alt 27.04.2009, 12:01:39
Benutzerbild von Domi
Domi Domi ist offline
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
Mit Zitat antworten
  #3  
Alt 27.04.2009, 19:37:32
JakobD JakobD ist offline
Anfänger
 
Registriert seit: Apr 2009
Alter: 30
Beiträge: 15
AW: Performance verbessern

Zitat:
Zitat von Domi Beitrag anzeigen
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?)
Mit Zitat antworten
  #4  
Alt 27.04.2009, 19:49:02
Benutzerbild von Domi
Domi Domi ist offline
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
Mit Zitat antworten
  #5  
Alt 27.04.2009, 19:53:49
JakobD JakobD ist offline
Anfänger
 
Registriert seit: Apr 2009
Alter: 30
Beiträge: 15
AW: Performance verbessern

Zitat:
Zitat von Domi Beitrag anzeigen
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?
Mit Zitat antworten
  #6  
Alt 27.04.2009, 19:55:47
Damir Damir ist offline
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
Mit Zitat antworten
  #7  
Alt 27.04.2009, 20:08:48
JakobD JakobD ist offline
Anfänger
 
Registriert seit: Apr 2009
Alter: 30
Beiträge: 15
AW: Performance verbessern

Und wie messe ich das?
Mit Zitat antworten
  #8  
Alt 27.04.2009, 20:13:55
Damir Damir ist offline
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($fpCURLOPT_RETURNTRANSFER1); 
    
    
// TRUE um jedem "Location: "-Header zu folgen, den der Server als Teil der HTTP-Header zurückgibt.
    
curl_setopt($fpCURLOPT_FOLLOWLOCATION1);
    
    
// Wieviel Header er max. folgen soll - gibt man es nicht an sind es max. 20
    
curl_setopt($fpCURLOPT_MAXREDIRS30);    
    
    
    
    
// 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
Mit Zitat antworten
  #9  
Alt 28.04.2009, 21:39:19
JakobD JakobD ist offline
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 ;)
Mit Zitat antworten
  #10  
Alt 28.04.2009, 22:57:47
Benutzerbild von Domi
Domi Domi ist offline
Senior Member
 
Registriert seit: Nov 2003
Ort: Kempten @ Allgäu
Alter: 36
Beiträge: 1.408
AW: Performance verbessern

Zitat:
Zitat von JakobD Beitrag anzeigen
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
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
MySQL Performance (eine oder mehrere DBs) bjoernfal MySQLi/PDO/(MySQL) 2 02.01.2008 19:39:16
MySQL Performance bei Zugriff über verschiedene Webserver? janpeters MySQLi/PDO/(MySQL) 0 08.06.2007 12:06:44
Performance: Konstanten, String Vars, Array crowl PHP Grundlagen 1 10.03.2004 15:22:53
performance frage RDJ PHP Grundlagen 8 04.03.2004 11:34:49
Anfragen, bzw. Antworten an einen Server ...Performance ??? RDJ Apache HTTP-Server 0 25.09.2003 17:41:20


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:26:30 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt