PHP URLs vom fremden Server laden und durchsuchen - optimierung gesucht

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
557
Hallo,

ich habe hier ein Script geschrieben, mit dem ich eine Liste von URLs absurfe, und einen Wert überprüfe, ob er vorhanden ist.

Das Problem ist aktuell: die Liste an URLs beträgt aktuell 50 Einträge. Das Script ist dadurch verdammt langsam.

Hat jemand eventuell eine Idee wie man hier etwas optimieren kann?

Danke

PHP:
<?php
/**
 * Author: Blackbenji
 * Date: 10.06.12
 * Time: 21:46
 **/

ob_start();
ini_set("max_execution_time","false");

#error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING ^ E_DEPRECATED);

require('url.properties');
require('class/Cache.php');
$oCache = new Cache;
$sCacheName = 'ServerCheck';

function get_http_response_code($url) {
	$headers = get_headers($url);
	return substr($headers[0], 9, 3);
}

function check($url_live_array) {
	for($x=0; $x<count($url_live_array); $x++) {
		// zuweisung der url innerhalb des arrays nach $url
		$url = $url_live_array[$x];
		// abfrage durch funktion get_http_response_code ob 503 vorliegt
		if(get_http_response_code($url) == "404") {
			$url_array[] = array('checked' => "<font color='red'><a href='".$url."' target='_blank'>".$url."</a> 404 Not found <br /></font>");
		} elseif (get_http_response_code($url) == "503") {
			$url_array[] = array('checked' => "<font color='red'><a href='".$url."' target='_blank'>".$url."</a> 503 Service Temporarily Unavailable <br /></font>");
		}
		else {
			if(get_http_response_code($url) != "503" or get_http_response_code($url) != "404") {
				$code = file_get_contents($url);
				if(stristr($code, 'Up and running') === FALSE) {
					$url_array[] = array('checked' => "<font color='red'><a href='".$url."' target='_blank'>".$url."</a> Test failed! <br /></font>");
				} else {
					$url_array[] = array('checked' => "<a href='".$url."' target='_blank'>".$url."</a> up & running! <br />");
				}
			}
		}
	}
	return $url_array;
}

function get_new_status($oCache,$sCacheName,$url_live_array) {
	$url_check =  check($url_live_array);
	$sContent = $url_check;
	$oCache -> writeCache($sCacheName, $sContent);
	header('Location: ?');
}

if(isset($_GET['nav'])) {
	switch($_GET['nav']){
		case refresh:
			get_new_status($oCache,$sCacheName,$url_live_array);
	}
}

if ( ($sContent = $oCache -> readCache($sCacheName)) === false) {
	get_new_status($oCache,$sCacheName,$url_live_array);
} else {
	echo '<a href="?nav=refresh">Refresh</a> <br />';
	for($x=0; $x<count($sContent); $x++) {
		echo $sContent[$x]['checked'];
	}
}

ob_end_flush();
?>
 
Ich würde an Stellen wie der Funktion get_http_response_code mal etwas konstantes reinschreiben, um erst mal jede Funktion für sich testen zu lassen.

Ansonsten kann es ja auch sein, dass die Seiten langsam antworten?
 
Eben, das würde ich eher vermuten. Die "Time to first Byte" kann hier entscheidend sein. CB hier hat z.B. einen Wert von knapp unter einer Sekunde. Wenn du 50 Seiten abfragst, dann kannst du eben durchaus mal insgesamt ne halbe bis eine Minute damit zubringen, bei jeder deiner Seiten auf das erste Byte der Antwort zu warten.

Das Zauberwort heißt hier definitiv: AJAX.
Du wirst nicht schneller dadurch, aber du führst halt ein kleinen Script 50x aus anstatt ein großes nur ein Mal. Dadurch kommst du nie in die Verlegenheit, dass du die Max Execution Time überschreitest, selbst wenn du irgendwann 5000 Seiten prüfen willst.
 
Du machst pro URL 5 Anfragen und wunderst dich, dass es langsam ist?

Zeile 34 ist auch komisch. Es ist doch vorher (26 und 30) schon auf 404 und 503 gecheckt worden, aber das wird dann einfach nochmal gemacht.

Selbst wenn PHP intern das Ergebnis von get_headers cached (was sehr sehr unwahrscheinlich ist), sind es immer noch 2 Anfragen.

Eine einzige Anfrage würde reichen.
 
Zuletzt bearbeitet:
@ice-breaker: danke, werde ich mir mal anschauen!
@character: du hast recht, ich werde das nochmal überarbeiten!
 
Zurück
Oben