sorry daß ich schon wieder nerve. Allerdings nervt es auch, wenn ein offenbar von vielen anderen Usern (ok, bei der Konkurrenz) benutztes PHP-Script
- am DOS-Prompt anstandslos durchläuft
- im Makro das Projekt zum einfrieren bringt!!!
und das auch noch unter der sehr wohl reproduzierbaren Bedingung der Überschreitung einer gewissen Menge Codes (wobei selbst Kommentare in dieser Menge Code mitzählen)
Also nochmal:
- Teil des Scripts für sich läuft,
- anderer auch
- beide zusammen: Projekt friert ein / auch nach vielen Minuten keine Reaktion / nur mit Task-Manager zu killen
Der Gag dabei: Wenn ich einige Zeilen wieder rausnehme und zwar EGAL WELCHE (sogar: Kommentare) läuft es wieder. Hauptsache ich bleibe offenbar unter einer gewissen Quellcode-Größe!
Bevor einer sagt: "ach ja, bei der Konkurrenz ist ja alles anders, kann ja nicht gehen" usw.: Das Script holt lediglich einige Informationen per Internet von einem Webserver und speichert die in einer Stringvariablen zur weiteren Verwendung. Da dürften die Bedingungen ja wohl gleich sein! (und es funktioniert ja auch am Prompt gestartet ohne Probleme, ohne IPS installiert zu haben).
Funktionell werden übrigens PLZ-abhängige Wettervorhersage-Werte der nächsten 3 Tage geholt. Höchst interessant und offenbar lange stabil in breiter Anwendung gelöst... Wer mehr dazu wissen will, siehe ganz unten.
Nachfolgend nun das abgerüstete Code-Beispiel, bei dem bereits der Fehler auftritt:
Darin sind oben einige Zeilen gnadenlos auf simple Zuweisungen zusammengekürztes Hauptprogramm, darunter dann einige Functions, die im Beispiel noch nichtmal angesprochen werden. Alles als Makro "calcVorhersage" vom Typ "Knopf", als letzte Zeile im Hauptprogramm wird "abc" ausgegeben in ein Zeichen-Objekt "viewAusgabe"
Im angegebene Beispiel führt auf-den-Knopf-Klicken zum besagten Einfrieren. Simplizierte Sollfunktion war die besagte Ausgabe. Egal ob nun unten die letzten zwei Functions rausgenommen werden, oder anderer Code wie z.B. die beiden vorletzten Hauptprogramm-Zeilen
$data['VORHERSAGE'] = array();
$data['UPDATEINFO'] = array();
vor der finalen Output-Anweisung
$viewAusgaben="abc";
...und schon erscheint "abc" sauber in die Ausgabe!
Da es also egal ist, WELCHER Code rausgenommen wird, kann es am Code selbst ja wohl kaum liegen. Wie gesagt, der läuft ja auch auf gleichem PC mit gleichem PHP!
Ergo ist dann also entweder irgendwas mit dem Speichermodell ganz arg im Argen (siehe die anderen Laufzeitfehler!), oder irgendwas begrenzt prinzipbedingt die Quellcodegröße!
Wenn das nun nicht direkt so nachvollziehbar sein sollte: Ich habe schon eine ganze Reihe andere Objekte im Projekt! SPG-Datei ist 77188 Bytes lang. Vielleicht muß erst ein gewisser "Füllgrad" des Speichers erreicht sein, bevor der überläuft?
Code: Alles auswählen
<?
// --- EINSTELLUNGEN ---------
$PLZ = "Bern";
$PLZ = "76137";
$varname = "WETTER_www-wetter-net.Data";
ini_set( 'max_execution_time', 300);
//--- BEGIN --------
$t1 = time();
$baseurl = "http://www.wetter.net/cgi-bin/wetter-net/";
$data = array();
$data['VORHERSAGE'] = array();
$data['UPDATEINFO'] = array();
$viewAusgaben="abc";
// ---------------------------------------------------------------------------
function GetUrl( $baseurl, $script, &$plz, $param, $analyze_plz=false)
{
$s = file_get_contents( MkUrl($baseurl, $script, $plz, $param) );
if( empty($s))
{ IPS_LogMessage( "WETTER_www-wetter-net_GETDATA", "can't get url content"); die; }
// test for multiple plz
if( $analyze_plz && !preg_match("#k_ani([0-9]+)\.gif#U", $s) )
{
preg_match( '#wetter_stadt\.pl\?ID=([0-9]+)&ALIAS=(.*)"#U', $s, $m);
if( count($m)!=3)
{ IPS_LogMessage( "WETTER_www-wetter-net_GETDATA", "can't match PLZ"); die; }
$plz = "ID=".$m[1]."&ALIAS=".$m[2];
// now retry with fixed 'plz'
$s = file_get_contents( MkUrl($baseurl, $script, $plz, $param) );
if( empty($s))
{ IPS_LogMessage( "WETTER_www-wetter-net_GETDATA", "can't get url content"); die; }
}
return( $s );
}
// ---
function MkUrl( $baseurl, $script, $plz, $param)
{
$plz = str_replace( " ", "%20", $plz); // quote possible spaces for parameter ALIAS=
if( substr($plz,0,2) == "ID")
return($baseurl.$script."?".$plz."&"."PARA=".$param);
else
return($baseurl.$script."?"."NAME=".$plz."&"."PARA=".$param);
}
// ---
function aMerge( $a_main, $a_merge)
{
for( $i=1; $i<=3; $i++)
{
if( !array_key_exists( $i, $a_main)) $a_main[$i] = array();
$a_main[$i] = array_merge( $a_main[$i], $a_merge[$i]);
}
return( $a_main );
}
// ---
function ParseVZustand( $s)
{
$data = array();
$a = explode( "\n", $s);
$a = preg_grep( "#k_ani#", $a);
$tag = 1;
$part = 1;
foreach( $a as $line)
{
preg_match( "#k_ani([0-9]+)\.gif#U", $line, $m);
if(count($m)==2) $data[$tag]['Zustand'.$part] = $m[1];
preg_match( '#ALT="(.*)"#U', $line, $m);
if(count($m)==2) $data[$tag]['Zustand'.$part.'_Text'] = $m[1];
$part++;
if( $part > 3) { $tag++; $part = 1; }
if( $tag > 3) { break; }
}
return( $data);
}
// ---
function ParseVTemp( $s, $key)
{
$data = array();
$a = explode( "\n", $s);
$a = preg_grep( '#class="temp"#', $a);
$tag = 1;
foreach( $a as $line)
{
preg_match( "#>(-*[0-9]+)°#U", $line, $m);
if(count($m)==2) $data[$tag][$key] = $m[1];
$tag++;
if( $tag > 3) break;
}
return( $data);
}
// ---
function ParseVProzent( $s, $key)
{
$data = array();
$a = explode( "\n", $s);
$a = preg_grep( "#%#", $a);
$tag = 1;
$part = 1;
foreach( $a as $line)
{
preg_match( "#([0-9]+)%#U", $line, $m);
if(count($m)==2) $data[$tag][$key.$part] = $m[1];
$part++;
if( $part > 3) { $tag++; $part = 1; }
if( $tag > 3) { break; }
}
return( $data);
}
// ---
function ParseVWindrichtung( $s, $key, $key2)
{
$data = array();
$a = explode( "\n", $s);
$a = preg_grep( '#/images/symbole/w#', $a);
$tag = 1;
foreach( $a as $line)
{
preg_match( '#/images/symbole/w([0-9]+)\.gif.*TITLE="([NWSO\-]+)"#U', $line, $m);
if( count($m)==3)
{
$data[$tag][$key2] = $m[1];
$data[$tag][$key] = $m[2];
}
$tag++;
if( $tag > 3) break;
}
return( $data);
}
// ---
function ParseVWindgeschwindigkeit( $s, $key)
{
$data = array();
$a = explode( "\n", $s);
$a = preg_grep( '#>[0-9]+<br>km/h#', $a);
$tag = 1;
foreach( $a as $line)
{
preg_match( "#>([0-9]+)<#U", $line, $m);
if(count($m)==2) $data[$tag][$key] = $m[1];
$tag++;
if( $tag > 3) break;
}
return( $data);
}
?>
work:=Scriptoutput
wenn work<>"" dann
viewAusgaben:="Script-Output: "+work
endewenn
-------------------------------------
Das Originalscript ist in der z.Zt. aktuellsten Fassung hier zu finden. Hinweise / Links auf aktuellere Versionen stehen im 1. Artikel des dortigen Threads.
Als einzige Anpassung (der am DOS-Prompt laufenden Version) habe ich ab Zeile 89 die im dortigen System offenbar mögliche automatische Erkennung und ggf. Zuweisung der Ziel-Projektvariablen auskommentiert, sowie darunter eine skalare Variable per print_r zugewiesen (fehlt alles in der abgerüsteten Version, die schon den o.g. Fehler wirft, scheidet deshalb als Ursache aus!)
Code: Alles auswählen
.......
// --- SAVE INTO IPS-VARIABLE ----
#if( !IPS_VariableExists( $varname))
#{
# IPS_CreateVariable( $varname, "String");
#}
#SetValueString( $varname, wddx_serialize_value($data) );
$a=print_r($data)."END\n";
echo $a;
//echo "END\n";
return(true);
// ---------------------------------------------------------------------------
function GetUrl( $baseurl, $script, &$plz, $param, $analyze_plz=false)
{
.......
Gruß Gerd
Aber bitte erstmal wieder eine stabile Version hinbekommen, siehe meinen Thread von gestern bzw. das was der Familienvater so schrieb! Das ist erstmal sicher viel viel wichtiger, als das hier.
Auch zu dem Parallelverarbeitungs-Problem schweig ich erstmal noch, denn auch das braucht erstmal ein stabiles System!
Übrigens während des Verfassens dieses Textes ist wieder 2mal der LAufzeitfehler aufgetreten: TTimer bei Adresse 005A2BF2, lesen von Adresse einmal 64E9030C, einmal 5Be9030C. Alles bei nicht gestartetem Projekt, seit so 15-20min offenem Makro-Editor-Fenster mit o.g. Code