Server überlastet?...

HTML:
<body>
....
<div id="banner1" />
...
CONTENT

....
<div id="banner2" />
...

CONTENT

....
<div id="banner3" />
...

<script type="text/javascript">
$(document).ready(function() {
  var response = $.ajax.get(url: 'ajax.php');
  $(#banner1).content(response(banner[id=1]));
  $(#banner2).content(response(banner[id=2]));
 // ...
});
PHP:
// ajax.php
header("content-type: text/xml; charset=UTF-8");

$fp = fsockopen("example.com", 80, $foo, $bar, 1);
if(!$fp) {
  // 1 sec: Timeout
  echo "<banners> <banner id=\"1\"> DEFAULT </banner> ...";
  exit;
}

// Daten holen
$banner = fgets($fp);
echo "<banners> <banner id=\"1\"> $banner</banner> ...";
So grob skizziert. JavaScript- und jQuery-Kenntnisse sind sehr bescheiden bei mir :mrgreen:
 
Ja@tH, prinzipiell geht sowas schon (abgesehen von der Performance der x-Millionen zusätzlichen Ajax-Requests an *meinen* Server), aber ich bekomme ja irgendwelche fertigen (statischen) JS-Tags die dann wiederum X andere JS-Tags von versch. Servern aufrufen und ineinander verschachteln. Es würde also u.U. gar nicht genügen "den AdServer" zu checken, wenn das JS wiederum (im selben Dokument) andere Server (von Endkunden) für die Grafiken kontaktiert - und da ggf. auch warten muss.

Hätte ich einfach BannerURL/KlickURL wäre das alles kein Problem. ;)

Alternative: Per Cron im Background alle paar min ma checken, ob der Haupt-AdServer überhaupt online ist und dann die Auslieferung komplett pausieren für einige Zeit. Aber das ist ja quasi nie der Fall. Die sind nur ab und zu kurz mal lahm und dann gehts wieder. Das gleiche Problem haben ja Seiten weltweit, die fastclick-AdServer einsetzen. Von daher werden die schon um ihre Uptime/Performance bemüht sein.

Edit: Serverside zu checken ist u.U. auch völliger Quark, denn die meisten "Hänger" sind Routing-Probleme zwischen dem Client und dem AdServer, nicht zwischen klamm und dem AdServer. Sprich: Kann sein, dass es im Großraum Köln ma 20min lahm ist, während es im Rest der Welt keine Probleme gibt.
 
Zuletzt bearbeitet von einem Moderator:
[...] JS-Tags die dann wiederum X andere JS-Tags von versch. Servern aufrufen und ineinander verschachteln. Es würde also u.U. gar nicht genügen "den AdServer" zu checken, wenn das JS wiederum (im selben Dokument) andere Server (von Endkunden) für die Grafiken kontaktiert - und da ggf. auch warten muss.
Wenn das aber alles zum Ende gemacht wird, kanns doch egal sein, wer danach noch alles gefragt werden muss.

Ich geh mal davon aus, wenn ich ein script-Tag nachträglich in den DOM-Tree einhänge, der Useragent dieses dann auch abruft, oder? Wenn nicht,
Hätte ich einfach BannerURL/KlickURL wäre das alles kein Problem. ;)
Dann stell halt mal entsprechend um, wenn das Probleme vermeidet.

Diese JavaScript-Dinger machen eh Probleme, wenn man sich an XHTML-Standards halt will, wenn da document.write()s drinnen sind. (Weiß gar ned, was HTML5 dazu sagt :think:)
 
Ich geh mal davon aus, wenn ich ein script-Tag nachträglich in den DOM-Tree einhänge, der Useragent dieses dann auch abruft, oder?
Genau.
document.write()s drinnen sind
Jede Menge - leider. Und ich muss mich drauf verlassen, dass die dann valides HTML bauen, sonst geht meine Seite kaputt.

Einzige Lösung: IFrames oder un-multimediale Bannerurl/Klickurl. Ich könnte den noscript-part einfach dafür verwenden ... Wie schon gesagt entgehen mit dann aber jede Menge gut bezahlter Kampagnen, die nur mit direkt ins Dokument integrierten JS-Tags ausgeliefert werden können. :-?
 
8O Mit document.write/innerHTML reinschreiben, oder mit DOM-Methoden?

Puh,.. gute Frage wie ich das da gemacht habe.. ich weiß gerade nicht mehr welche jQuery-Methode ich da verwendet habe. Aber ich denke eine, die auf innerHTML basiert.
Einen <script>-Tag habe ich nicht gebastelt und dann eingefügt.

Sollte das über DOM-Methoden gehen, oder wie? Was ich nämlich gelesen habe, war, dass das so auch nicht geht wenn ich mich richtig erinner (schon länger her)
 
Sollte das über DOM-Methoden gehen, oder wie?
So schreibt es zumindest der XHTML-Standard vor, deswegen is ja document.write() verboten. innerHTML is ja auch nix anderes.

"Richtig" wäre dieses
PHP:
var tag = document.createTag("script");
tag.appendAttribut(document.createAttribut("type", "text/javascript"));
document.getElementById("before").insertAfter(tag);
so in der Art. Viele Zeilen Code, um ein Element einzuhängen. Mit jQuery dürfte es etwas einfacher gehen.
 
So schreibt es zumindest der XHTML-Standard vor, deswegen is ja document.write() verboten. innerHTML is ja auch nix anderes.

Hmm.. ich weiß gerade nicht wie $(element).html('<script ...>...</script>') arbeitet.. Ich nehme aber mal an, dass jQuery nicht versucht Tags zu erstellen und diese anzuhängen usw usf sondern es mit innerHTML gemacht wird..

Mit jQuery dürfte es etwas einfacher gehen.

PHP:
$('#before').after($('<script type="text/javascript" />'));

So in der Art sollte es sein, also um einiges einfacher, ja ;) .
 
Wenn du in jQuery nur ein jQuery('<script>') reinschreibst, wandelt jQ das in ein document.createElement um.

Allerdings parst jQuery keine Attribute/verschachtelte Tags. Sobald du ein Attribut hinzufügst, wird mit innerHTML gearbeitet.
 
Mal zur Anregung ein kleiner Code-Schnipsel von mir. Funktioniert natürlich auch nur ohne document.write().

PHP:
// asynchrone Einbindung von Google Analytics
$(document).ready(
	function() {
		$.ajax({
			type: 'GET',
			url: 'https://www.google-analytics.com/ga.js',
			success:
				function() {
					var pageTracker = _gat._getTracker('UA-XXXXXXX-X');
					pageTracker._trackPageview();
				},
			dataType: 'script',
			cache: true

		});
	}
);

Eine Alternative wäre, die Werbung, die Script-Tags enthält, in einem iFrame zu laden. Leider macht das die Sache ziemlich unperformant, weil man einen zusätzlichen Request zum Klamm-Server braucht (für jeden Script-Banner), aber es wäre eine Lösung.

Uuuuund zum Schluss die Freak-Lösung: Wer probiert nen iFrame mit Data-URL zu erstellen und guckt, ob das funktioniert? :D

Edit: Es tut. https://jsbin.com/icidi3/ - muss man nur noch checken, ob die Scripts dann asynchron geladen werden.

Edit2: Siehe neue Revision: funktioniert auch mit document.write(). Ich bin zuversichtlich, dass das die Lösung des Problems ist :) Krieg ich jetzt ein Eis?
 
Zuletzt bearbeitet:
Es gibt vielleicht noch ne andere Lösung :think: Ich guck heut Abend mal in meinen Codearchiven :biggrin:
Ah, gefunden:
HTML:
<object data="googleadsense.php?size=728x90" type="text/html">Werbung</object>
Das war damals meine Lösung, um Werbung einzubinden. Ob es einen Unterschied zum iFrame macht, weiß ich nicht. Jedenfalls is <object> mit einem Non-Frameset-Doctype erlaubt.
 
wie wäre es hiermit:

HTML:
<body>
<div id="banner1" />
<div id="banner2" />
<script type="text/javascript">
$(window).load(function() {
  $('#banner1').html('<script .....></script>');
  $('#banner2').html('<script .....></script>');
});

da sollte es meines wissens keine Probleme geben.

oder eben per DOM-Ready die JavaScript-Tags async machen, dann blocken die nicht mehr das Laden.
 
wie wäre es hiermit:

[...]

da sollte es meines wissens keine Probleme geben.

oder eben per DOM-Ready die JavaScript-Tags async machen, dann blocken die nicht mehr das Laden.

Problem ist document.write(), was zu extremen Problemen führt, wenn es nach DOM-Ready ausgeführt wird (weil es einfach alles überschreibt...).
 
Ich bin ja immer noch für die iFrame-Lösung mit Data-URL. Ist relativ einfach umzusetzen, funktioniert in allen Browsern, die das data-Protokoll kennen und für den Rest liefert man einfach den normalen Code aus.