PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP Entwicklung und Softwaredesign (http://www.selfphp.de/forum/forumdisplay.php?f=14)
-   -   Performance verbessern (http://www.selfphp.de/forum/showthread.php?t=21360)

JakobD 25.04.2009 14:35:30

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);
    } 


Domi 27.04.2009 12:01:39

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

JakobD 27.04.2009 19:37:32

AW: Performance verbessern
 
Zitat:

Zitat von Domi (Beitrag 127144)
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?)

Domi 27.04.2009 19:49:02

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

JakobD 27.04.2009 19:53:49

AW: Performance verbessern
 
Zitat:

Zitat von Domi (Beitrag 127160)
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?

Damir 27.04.2009 19:55:47

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

JakobD 27.04.2009 20:08:48

AW: Performance verbessern
 
Und wie messe ich das?

Damir 27.04.2009 20:13:55

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
)


JakobD 28.04.2009 21:39:19

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 ;)

Domi 28.04.2009 22:57:47

AW: Performance verbessern
 
Zitat:

Zitat von JakobD (Beitrag 127223)
Also wenn zum Beispiel länger als 5 Sekunden nix geht oder so?

... geht das nicht per timeout?


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:17:30 Uhr.

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