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 ::

TYPO3 Kochbuch

TYPO3 Kochbuch 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 Grundlagen

PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 31.05.2010, 16:26:28
Benutzerbild von Indyk
Indyk Indyk ist offline
Member
 
Registriert seit: Aug 2006
Ort: Lübeck
Alter: 37
Beiträge: 900
Indyk eine Nachricht über ICQ schicken
curl flaschenhals finden / verstehen.

Hallo Forum,
ich hoffe es findet sich jemand der ein bisschen mehr Ahnung von der curl Materia hat.

Ich versuche mit Curl durch einen multi_handle mehrere Seiten aufzurufen und diese in einer whileschlieife abzuarbeiten sobald eine fertig ist. Leider habe ich bei dieser Methode eine relativ lange verzögerung am ende der Schleife entdeckt und habe keine Idee woher die stammen kann.

Quellcode:
PHP-Code:
        // anzahl aller zu importierenden artikel ermitteln
        
$_iArtikel $this->model->count_artikel();
        
$_iArtikel 50;
        echo 
$_iArtikel.' zu imporiteren'.'<br />';
        
$this->_iImportiert 0;
        do {
            
// holt eine feste anzahl an artikeln aus der db (20)
            
$_aArtikel $this->model->restore_artikel();
            
$i           count($_aArtikel);
            
$_aCh      = array();
            
$_mch       curl_multi_init();
            
#echo $i.' neue Artikel geholt'.'<br />';
            
            //+++ INIT
            
$start_init time();
            foreach (
$_aArtikel as $_artikel) {
                
                
$_url $this->_url.$_artikel['amazon_asin'];
                
// curl init and setup
                
$_ch curl_init($_url);
                
curl_setopt($_chCURLOPT_RETURNTRANSFERTRUE);
                
// multi handle add
                
curl_multi_add_handle($_mch$_ch);
                
// store curl handles
                
$_aCh[(string) $_ch] = array(
                    
'asin'    => $_artikel['amazon_asin'],
                    
'ch'    => $_ch,
                );
            }
            
$ende_init time();
            
$dauer_init $ende_init $start_init;
            
//--- INIT
            
            
echo $i.' Urls in '$dauer_init .'s initialisiert'.'<br />';
            
            
//+++ EXEC
            
$_start_exec time();
            
$_running_earlier 0;
            do {
                
curl_multi_exec($_mch$_running);
                
// seite fertig geworden?
                
if ($_running != $_running_earlier) {
                    
                    
$_running_earlier $_running;
                    if (
$_info curl_multi_info_read($_mch)) {        
                        
// holt den HTML String                
                        
$sHTML curl_multi_getcontent($_aCh[(string) $_info['handle']]['ch']);
                        
// löscht den handle
                        
curl_multi_remove_handle($_mch$_aCh[(string) $_info['handle']]['ch']);
                        
// zugehörige id
                        
$sAsin $_aCh[(string) $_info['handle']]['asin'];
                        
// html verarbeiten
                        
$this->process_html($sHTML$sAsin);
                        
                        
$_jetzt time();
                        
$_dauer $_jetzt $_start_exec;
                        echo 
' nach '.$_dauer.'s <br />'
                        
$this->_iImportiert++;    

                    }                                                    
                }
            } while (
$_running 0);
            
$_ende_exec time();
            
$_dauer_exec $_ende_exec $_start_exec;
            
//+++ EXEC
            
            
echo $i .' Urls in '$_dauer_exec .'s aufgerufen'.'<br />';
                        
        } while (
$this->_iImportiert $_iArtikel); 
Meine Frage dreht sich genauer um diesen Teil:
PHP-Code:
            //+++ EXEC
            
$_start_exec time();
            
$_running_earlier 0;
            do {
                
curl_multi_exec($_mch$_running);
                
// seite fertig geworden?
                
if ($_running != $_running_earlier) {
                    
                    
$_running_earlier $_running;
                    if (
$_info curl_multi_info_read($_mch)) {        
                        
// holt den HTML String                
                        
$sHTML curl_multi_getcontent($_aCh[(string) $_info['handle']]['ch']);
                        
// löscht den handle
                        
curl_multi_remove_handle($_mch$_aCh[(string) $_info['handle']]['ch']);
                        
// zugehörige id
                        
$sAsin $_aCh[(string) $_info['handle']]['asin'];
                        
// html verarbeiten
                        
$this->process_html($sHTML$sAsin);
                        
                        
$_jetzt time();
                        
$_dauer $_jetzt $_start_exec;
                        echo 
' nach '.$_dauer.'s <br />'
                        
$this->_iImportiert++;    

                    }                                                    
                }
            } while (
$_running 0);
            
$_ende_exec time();
            
$_dauer_exec $_ende_exec $_start_exec;
            
//+++ EXEC 
Hier eine Beispielausgabe:
Code:
50 zu imporiteren
20 neue Artikel geholt in 1 s
20 Urls in 0s initialisiert
00000 http://www.amazon.de/dp/B002TETL5U nach 9s
00001 http://www.amazon.de/dp/B0013G47J0 nach 10s
00002 http://www.amazon.de/dp/B000CRY3H2 nach 11s
00003 http://www.amazon.de/dp/B002WOZU1Q nach 12s
00004 http://www.amazon.de/dp/B001YXQE70 nach 12s
00005 http://www.amazon.de/dp/B0035018NA nach 13s
00006 http://www.amazon.de/dp/B001AITPVG nach 14s
00007 http://www.amazon.de/dp/B0027W732W nach 15s
00008 http://www.amazon.de/dp/B002TF0R0W nach 15s
00009 http://www.amazon.de/dp/B00303KEJG nach 15s
00010 http://www.amazon.de/dp/B001D8C5V0 nach 15s
00011 http://www.amazon.de/dp/B00007MFXC nach 15s
00012 http://www.amazon.de/dp/B000VEEFBU nach 16s
00013 http://www.amazon.de/dp/B001E9UUF6 nach 16s
00014 http://www.amazon.de/dp/B000MFOGCG nach 17s
00015 http://www.amazon.de/dp/B0009M1LCU nach 17s
00016 http://www.amazon.de/dp/B00371POMI nach 17s
00017 http://www.amazon.de/dp/B000RMBNHA nach 18s
00018 http://www.amazon.de/dp/B001FB5ATE nach 18s
00019 http://www.amazon.de/dp/B000OIRLWI nach 32s
20 Urls in 32s aufgerufen
Wie man an der Ausgabe sehen kann, dauert der letzte aufruf fast so lange wie alle anderen zusammen. Woran könnte das liegen? Verwende ich curl falsch oder vergesse ich etwas? Oder liegt das in der Natur von curl und ich kann daran nicht ändern?

Ich wäre auch über einen Tipp dankbar der mir ein etwas schöneres Weg weist was die resource Id´s der einzelnen handels angeht.

Falls ich den Quelltext unzureichend kommentiert habe stehe ich hier rede und antwort.

Danke für Zeit und Mühe.
Mit Zitat antworten
  #2  
Alt 01.06.2010, 17:03:55
Benutzerbild von Indyk
Indyk Indyk ist offline
Member
 
Registriert seit: Aug 2006
Ort: Lübeck
Alter: 37
Beiträge: 900
Indyk eine Nachricht über ICQ schicken
AW: curl flaschenhals finden / verstehen.

Hallo Forum,

nach einer Weile testen und rumprobieren bin ich zu folgenden Erkenntnissen gekommen:
  • Der letzte aufruf ist der langsamste weil es nunmal der langsamste der letzt ist, das kann ne sekunde mehr sein oder auch 20.
  • Der verwendete code hat ein grooooßer Speicherproblem welches ich mit curl_close() beheben konnte.
  • Nur auf running und running_earlier zu reagieren reicht nicht aus da zur selben zeit auch mehrere requests fertig sein können und schon hat man welche übersprungen, also muss man nach der schleife nochmal alle durchgehen die man "übersehen" hat.
Ich poste zum schluss den code mit dem ich ziemlcih zufrieden bin.
(3000 Aufurfe in 60s bei ~900.000 Bytes an Speicher) [HINWEIS: Stark vom der Rechnleistung des Servers abhängig]

PHP-Code:
    public function curl_process()
    {
        
// anzahl aller zu importierenden artikel ermitteln
        
$_iArtikel $this->model->count_artikel();
        
$_iArtikel 100;
        if (isset(
$_GET['asin'])) {
            
$_iArtikel 1;
        }
        echo 
$_iArtikel.' zu imporiteren'.'<br />';
        
$this->_iImportiert 0;
        do {
            
//+++ TIME
            
$_jetzt time();
            
$_dauer $_jetzt $this->start;
            
//--- TIME
            
echo $_dauer.'s und Bytes '.number_format(memory_get_usage(), 0',','.').' <br />';
            
            
// holt eine feste anzahl an artikeln aus der db (20)
            
$_aArtikel $this->model->restore_artikel();
            
$i           count($_aArtikel);
            
$_aCh      = array();
            
$_mch       curl_multi_init();
            
#echo $i.' neue Artikel geholt'.'<br />';
            
            //+++ INIT
            
$start_init time();
            foreach (
$_aArtikel as $_artikel) {
                
                
$_url $this->_url.$_artikel['amazon_asin'];
                
// curl init and setup
                
$_ch curl_init($_url);
                
curl_setopt($_chCURLOPT_RETURNTRANSFERTRUE);
                
// multi handle add
                
curl_multi_add_handle($_mch$_ch);
                
// store curl handles
                
$_aCh[(string) $_ch] = array(
                    
'asin'    => $_artikel['amazon_asin'],
                    
'ch'    => $_ch,
                    
'url'    => $_url,
                );
            }
            
$ende_init time();
            
$dauer_init $ende_init $start_init;
            
//--- INIT
            
            
echo $i.' Urls in '$dauer_init .'s initialisiert'.'<br />';
            
            
//+++ EXEC
            
$_start_exec time();
            
$_running_earlier 0;
            do {
                
curl_multi_exec($_mch$_running);
                
// seite fertig geworden?
                
if ($_running != $_running_earlier) {
                    
#echo 'running :'.$_running.' '.$_running_earlier.'<br />';
                    
$_running_earlier $_running;
                    if (
$_mhInfo curl_multi_info_read($_mch)) {
                            
                        
$_chInfo curl_getinfo($_aCh[(string) $_mhInfo['handle']]['ch']);                            
                        
// holt den HTML String                
                        
$sHTML curl_multi_getcontent($_aCh[(string) $_mhInfo['handle']]['ch']);
    
                        
// löscht den handle
                        
curl_multi_remove_handle($_mch$_aCh[(string) $_mhInfo['handle']]['ch']);
                        
curl_close($_aCh[(string) $_mhInfo['handle']]['ch']);
                        
// zugehörige id
                        
$sAsin $_aCh[(string) $_mhInfo['handle']]['asin'];
                        
// html verarbeiten
                        
$this->process_html($sHTML$sAsin$_chInfo['http_code']);    
                        unset(
$_aCh[(string) $_mhInfo['handle']]);                        

                                                
                        
$_jetzt time();
                        
$_dauer $_jetzt $_start_exec;
                        echo 
' nach '.$_dauer.'s <br />'
                        
$this->_iImportiert++;    

                    }                                                    
                }
            } while (
$_running 0);
            
$_ende_exec time();
            
$_dauer_exec $_ende_exec $_start_exec;
            
//--- EXEC            
            
            //+++ LEFTOVERS
            
if (count($_aCh)) {
                
$_start_lo time();
                echo 
'LEFTOVERS: '.count($_aCh).'<br />';
                foreach (
$_aCh as $ch) {
                    
#$this->debug($ch);
                    
$_chInfo curl_getinfo($ch['ch']);
                    
$sHTML curl_multi_getcontent($ch['ch']);
                    
curl_multi_remove_handle($_mch$ch['ch']);
                    
curl_close($ch['ch']);
                    
$sAsin $ch['asin'];
                    
$this->process_html($sHTML$sAsin$_chInfo['http_code']);    
                    unset(
$ch['ch']);

                    
$_jetzt time();
                    
$_dauer $_jetzt $_start_lo;
                    echo 
' nach '.$_dauer.'s <br />'
                    
$this->_iImportiert++;            
                }
                
$_ende_lo time();
                
$_dauer_lo $_ende_lo $_start_lo;        
            }
            
//--- LEFTOVERS
            
            
echo $i .' Urls in '$_dauer_exec .'s aufgerufen'.'<br /><hr/>';
                        
        } while (
$this->_iImportiert $_iArtikel);
            
    } 
Mit Zitat antworten
Antwort

Stichworte
asynchron, curl, curl multi, falschenhals, performence


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
Mit CURL und PHP auf der Commerzbank-Seite einloggen burpy PHP für Fortgeschrittene und Experten 5 08.12.2009 11:53:27
SOAP-Request mit curl rencarl PHP Grundlagen 0 07.09.2009 23:00:40
Installation von cURL Nano PHP Grundlagen 0 29.03.2007 16:17:54
Dateigroeße mit cUrl Mageta PHP Grundlagen 5 27.11.2006 12:12:44
Curl, Websprache der Zukunft??? s-fox Off Topic Area 1 19.11.2003 19:44:45


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:40:47 Uhr.


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


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