foreach zu schnell Browser absturz....
Sneap
- php
Hallo Leute,
also ich hab da ein kleines Problem mit meiner foreach Schleife und zwar ist diese zu schnell, da hängt sich der Browser immer weg oder es dauert ellen lange bis etwas angezeigt wird.
So sieht das ganze aus:
[code lang=php]
function proxyload($proxy,$host,$useragent,$Fehler){
$ch = curl_init($host);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
[...]
$result = curl_exec($ch);
[...]
if (stripos($result, '404 Not Found') !== false){
echo '<div font-size:14px;"><b>Fehler</b>: Fehler 404 Seite nicht gefunden!</div><br>';
}
[...]
curl_close($ch);
return;
}
[...]
foreach($array as $proxy){
proxyload($proxy,$host,$useragent,$Fehler);
}
[...]
[/code
Das Problem ist halt das die Schleife, so schnell hintereinander aufgerufen wird, das es voll lange braucht bis echo angezeigt wird. Ist es irgendwie möglich zu warten bis alles ausgegeben und angezeigt wurde und dann erst die function neu aufzurufen?
Danke schon mal.
Mfg Sneap
Hallo!
Das Problem ist halt das die Schleife, so schnell hintereinander aufgerufen wird, das es voll lange braucht (...)
Ist Dir nicht aufgefallen, wie wiedersinnig dieser Satz ist, als Du ihn geschrieben hast? Etwas ist so schnell, dass es sehr langsam wird? So wie Napoleon, der seinem Kutscher sagte: "fahre er langsam, ich habe es eilig"?
Es dürfte vielleicht daran liegen, dass Du ständig neue Curl-Instanzen aufbaust. Warum verwendest Du nicht das dafür gedachte Multi-Interface von Curl?
Gruß, LX
Hallo!
Das Problem ist halt das die Schleife, so schnell hintereinander aufgerufen wird, das es voll lange braucht (...)
Ist Dir nicht aufgefallen, wie wiedersinnig dieser Satz ist, als Du ihn geschrieben hast? Etwas ist so schnell, dass es sehr langsam wird? So wie Napoleon, der seinem Kutscher sagte: "fahre er langsam, ich habe es eilig"?
Ähhh ok da hast du wohl recht. Ok dann halt vll ich weiß nicht genau wo drann es liegt, aber es dauert ellen lange bis die echos ausgegeben werden ;)
Es dürfte vielleicht daran liegen, dass Du ständig neue Curl-Instanzen aufbaust. Warum verwendest Du nicht das dafür gedachte Multi-Interface von Curl?
Wäre das so richtig?
$ch = curl_multi_init();
foreach ($array as $proxy) {
// erzeuge einen neuen cURL-Handle
$mh = curl_init($host);
// setze die URL und andere Optionen
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //TRUE um den Tranfer als String zurückzuliefern, anstatt ihn direkt auszugeben.
curl_setopt($ch, CURLOPT_USERAGENT, $useragent); //Useragent Mozilla/5.0 (Windows; U; Windows NT 5.1;....
curl_setopt($ch, CURLOPT_TIMEOUT, 5); //Die Anzahl Sekunden, die der Verbindungsaufbau maximal dauern darf; 0 = max.
curl_setopt($ch, CURLOPT_PROXY, $proxy); //Der HTTP-Proxy, durch den Requests getunnelt werden sollen.
curl_multi_add_handle ($mh,$ch);
}
do { $n=curl_multi_exec($mh,$active); } while ($active);
foreach ($array as $proxy) {
$result=curl_multi_getcontent($ch);
curl_multi_remove_handle($mh,$ch);
curl_close($ch);
if (stripos($result, '404 Not Found') !== false){
echo '<div font-size:14px;"><b>Fehler</b>: Fehler 404 Seite nicht gefunden!</div><br>';
}
}
curl_multi_close($ch);
Hi,
es dauert ellen lange bis die echos ausgegeben werden ;)
ja, weil es ellenlang dauert, bis der Output-Buffer eine genügende Größe erreicht hat, um an den Client geschickt zu werden.
Cheatah
Hi,
es dauert ellen lange bis die echos ausgegeben werden ;)
ja, weil es ellenlang dauert, bis der Output-Buffer eine genügende Größe erreicht hat, um an den Client geschickt zu werden.
Cheatah
Ist das normal oder könnte man es so machen, das wenn die erste Ausgabe erfolgt ist, dann erst die schleife neu durchlaufen wird?....
Hi,
Ist das normal oder könnte man es so machen, das wenn die erste Ausgabe erfolgt ist, dann erst die schleife neu durchlaufen wird?....
die erste Ausgabe erfolgt, wenn genügend Daten im Output-Buffer stecken. Wenn Du solange wartest, bis dies geschehen ist, und während dessen keine weiteren Daten reinschreibst, passiert das nach neuesten Studien, ähm, nie. Alternativ kannst Du den für Dich vermutlich neuen Begriff "Output-Buffer" auch in die Suchmaschine Deines Vertrauens stecken, ihn mit zusätzlichen sinnvollen Begriffen (als erster sei "PHP" genannt) ergänzen und schauen, was Du daraus Hilfreiches erlernen kannst.
Cheatah
Hi,
Ist das normal oder könnte man es so machen, das wenn die erste Ausgabe erfolgt ist, dann erst die schleife neu durchlaufen wird?....
die erste Ausgabe erfolgt, wenn genügend Daten im Output-Buffer stecken. Wenn Du solange wartest, bis dies geschehen ist, und während dessen keine weiteren Daten reinschreibst, passiert das nach neuesten Studien, ähm, nie. Alternativ kannst Du den für Dich vermutlich neuen Begriff "Output-Buffer" auch in die Suchmaschine Deines Vertrauens stecken, ihn mit zusätzlichen sinnvollen Begriffen (als erster sei "PHP" genannt) ergänzen und schauen, was Du daraus Hilfreiches erlernen kannst.
Cheatah
Ok hab ich mal gemacht.
Ergebniss:
<?php
ob_start();
ob_end_flush();
?>
setzen um eine schneller Ausgabe zu erziehlen, weil der Buffer erst dann ausgegeben wird wenn alles fertig ist.
Quelle
Hi!
So wie Napoleon, der seinem Kutscher sagte: "fahre er langsam, ich habe es eilig"?
Das lag wohl daran, dass die Wege sehr schlecht waren und bei zu schneller Geschwindigkeit die Gefahr eines Achsbruches stieg. Die für die Reparatur oder Ersatzbeschaffung benötigte Zeit wäre deutlich länger gewesen als die Einbuße beim langsameren Reisen.
Lo!
Hallo Sneap (alias DiamondDog?),
######################################################
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if (stripos($result, '404 Not Found') !== false){}
######################################################
das kann schon falsch sein. [curl_exec()](http://de2.php.net/manual/en/function.curl-exec.php) gibt so keine Informationen der HTTP-Schicht zurück. Die Abfrage kann also scheitern, denn sie durchsucht den völlig falschen Kontext der Ressource. Aber auch wenn Du `curl_setopt($ch, CURLOPT_HEADER, TRUE);`{:.language-php} hier nur ausgelassen hast, ist diese Abfrage fehleranfällig. Dazu drei Response-Beispiele:
> HTTP/1.1 200 OK
> Date: Fri, 17 Jul 2009 13:12:51 GMT
> Content-Type: text/html; charset=ISO-8859-1
>
> ~~~html
<html>
> <head>
> <title>Was tun bei HTTP-Status 404 Not Found</title>
> </head> <!-- restlicher Inhalt -->
Da $result
, jedenfalls aus Deinem Auszug nicht anders ersichtlich, zwei Kontexte als MIME "message/http" haben wird, schlägt hier Deine Scriptlogik fehl.
HTTP/1.1 200 OK
Date: Fri, 17 Jul 2009 13:12:51 GMT
Content-Type: text/html; charset=ISO-8859-1
X-Interredirect-from: 404 Not Found
Hier hast Du einen Fall innerhalb des HTTP-Kontexts, wo die Scriptlogik fehlschlagen wird.
HTTP/1.1 404 Nicht gefunden
Date: Fri, 17 Jul 2009 13:15:06 GMT
Content-Type: text/html; charset=ISO-8859-1
Auch in diesem, zugestandener Maßen sehr unwahrscheinlichen aber RFC-konformen, Fall verfehlt die Scriptlogik.
Was suchst Du also? Den Status des HTTP-Response: Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
Du musst also die aller erste Suchen, und kannst Dich nur auf den Status-Code (im Beispie $status
) verlassen:
##########################################################################################
$ch=curl_init($host);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
[link:http://de2.php.net/manual/en/function.list.php@title=list]($header, $result) =[link:http://de2.php.net/manual/en/function.explode.php@title=explode]("\r\n\r\n",curl_exec($ch),2);
list($statusline, $header) =explode("\r\n",$header,2);
list($httpversion,$status,$rest)=explode(' ',$statusline,3);
if($status!=404){
echo '<div font-size:14px;"><b>Fehler</b>: Fehler 404 Seite nicht gefunden!</div><br>';
}
curl_close($ch);
##########################################################################################
Es ist eben das Bedauerliche an diesem Forum, dass manche, die mit Artikeln winken, statt zu helfen, sich dünnpfiffiger Konversation hingeben.
Gruß aus Berlin!
eddi