Anderer IPS Variablentyp gebraucht...

Hallo,
Ich habe vergeblich versucht eine PHP-Variable des Typs ‚resource‘ in einer IPS-Variable zu speichern. Da gibts ja nur 4 Arten (string,float,boolean,integer). So das ich diese jederzeit wieder abfragen und als Typ ‚resource‘ weiterverarbeiten kann. Gibts da eine Möglichkeit?

LG, Hinti

Hallo Hinti,

Variablen vom Typ „resource“ sind normalerweise nur sehr kurze Zeit gültig nämlich solange wie das Skript läuft. Ich kann daher keine Sinn darin erkennen eine solche Variable dauerhaft abzuspeichern. Beim nächsten Durchlauf des Skripts wäre sie ohnehin nicht mehr gültig.

Aber Du kannst jede Variable von beliebigem Typ über die Funktion serialize() als String abspeichern und mit unserialize() wieder zurückholen.

Ob das auch mit „resource“ geht weiß ich allerdings nicht.

Gruß
HJH

Hallo,

Abgesehen davon, dass ich da keine direkte Lösung für hab: Was hast denn damit vor? Ne Datenbankverbindung offen halten? Da könntest höchstens dein komplettes Ergebnis in einem String abspeichern und per eval zurückholen, oder dein Query abspeichern und die Position darin und dann mit LIMIT da wieder anfangen. Finde ich aber alles recht eklig, da sich da ja zwischendurch was geändert haben kann.

danke erstmal, ich muss nochmal drüber nachdenken. ich melde mich dann nochmal dazu. soviel… ich möchte die datenbankverbindung offen halten und die resource-id speichern für den direkten zugriff, so dass ich dann nur noch mysql_query() aussprechen muss.

ansonsten muss ich nämlich jedesmal auf den mysql_pconnect befehl wiederholen, was zwar keine erneute verbindung erstellt, aber die parameter müssen auch immer angegeben werden (host,user,pw).

Schon mal über ein require_once(„db.php“); in den betroffenen Scripts nachgedacht? Bietet sich auch an, da drin eine Datenbankklasse zu schreiben.

gefällt mir nicht so gut weil ich dann jedesmal einen weiteren filezugriff habe. ich will ja nicht umsonst eine persistente datenbankverbindung, damit ich bessere performance habe, bei sehr vielen zugriffen.

also denke ich wäre mein idealfall eine statische bzw. globale im arbeitsspeicher geladene variable, sprich eine ips variable, die die geöffnete resource-id enthält. nur so ist es auch sinnvoll eine persistente verbindung zu nutzen.

so dann lediglich noch der aufruf im script:

mysql_db_query('hinti_data','select sum(...) from ...');

natürlich es geht eh, weil ich brauch alternativ ja nur zuvor wieder dies aufrufen:

$gewünschte_id = mysql_pconnect($host,$user,$pass);
mysql_db_query('hinti_data', 'select sum(...) from ...', $gewünschte_id);

…nochmals _pconnect gibt mir ja die bestehende Verbindungs-id ohne neu zu verbinden.
Aber erfordert dies halt in jedem script wo ich es brauche auch benutzername, passwort etc. Einfach mehr code halt.

Sicher gehts mit „require_once“, aber da schiess ich mir selber ins knie, weil ich dafür wieder bei jedem zyklischen scriptaufruf einen filezugriff auf der platte habe. Entspricht halt nicht meinen Wünschen und macht den Sinn von pconnect kaputt.

PS: Es liegt halt in meiner Natur dies zu optimieren :rolleyes:
deshalb muss ich jetzt mal HJH’s Tipp zu serialize auf die pelle rücken…

neee, serialize ist nicht was ich brauche. is ja gar ned schön für meine zwecke was die alles so macht. und obendrein nicht kompatibel mit resource typen.

Hallo Hinti,

klar kann man sowas realisieren. Das ist aber fuer PHP Anfaenger und auch Fortgeschrittene einer der schwierigsten umzusetzenden programmiertechnischen Muster. Mal in Kuerze:

du findest hier ein OOP Muster, welches erstmal ueberhaupt die Grundlage bildet. Möchte man nun eine Datenbank-Verbindung haben, ruft man eine Funktion auf, welche dafür sorgt, dass die schon bestehende Verbindung zurückgegeben wird. Gibt es noch keine, wird zuvor eine neue erzeugt und intern gemerkt. Mit PHP kannst Du dafuer eine Statische Klassen-Variable verwenden.

ABER: Dazu muesste das PHP als Modul immer laufen, und das ist bei IPS nicht der Fall. Es wird nur zur Laufzeit geladen und ausgefuehrt, soweit ich das weiss. Meines Wissens ist das derzeit nur mit dem Apache moeglich.

Hallo Torro, ich werde deine links genauestens studieren. PS: Ich habe selber schon sehr viel recherchiert und weiß über die schwierigkeiten und besonderheiten schon etwas bescheid. Fakt ist jedenfalls mal folgendes. Nämlich das man mit dem Befehle mysql_pconnect tatsächlich eine persistente verbindung aufbauen kann. das sehe ich daran, weil die verbindung, im Admintool erkenntlich, erhalten bleibt. Folglich muss ich absolut nur die bestehende Verbindungsresource abfragen. Wie gesagt es geht auch jetzt schon. Denn lt. meinen Tests wird bei neuerlichem Aufruf in einem neuen script durch mysql_pconnect keine weitere Verbindung erstellt und kann sofort loslegen. Auch im Admin ersichtlich. Andernfalls werden die Anzahl der Verbindungen nämlich hochgezählt.

Also, ich habe auch schon an statische Variablen gedacht. In „C“ hätte ich halt eine solche globale statische Variable definiert und die bliebe immer im Speicher und abrufbar. PHP ist da aber anders und wollte mir deshalb mit den Variablen von IPS helfen.

Deshalb mach ich genau das… die resourec-struktur studieren bzw. mit statischen definitionen spielen, mal sehen ob es sich auszahlt…

ich glaube bei pconnect, brauchst dir gar nix merken

einfach noch mal ein pconnect machen, das prüft dann ob schon ne verbindung offen ist und verwendet dann diese bereit geöffnete verbindung

Ist keine offen (oder braucht es aus anderen gründen eine), dann macht es eine weitere auf, und diese kann dann in anderen durchläufen und co wiederverwendet werden.

Hallo Sn00py,
Ja, Und das habe ich auch oben auch schon ein paar mal erwähnt, das ich diese Alternative habe. Aber der nachteil liegt wie schon gesagt darin, das man in jedem benötigten script die benu, passw und host braucht, was mir nicht so gefällt. (ps. require_once wurde mir auch schon nahegelegt - siehe oben), auch das nehme ich im notfall her, weil mir ein filezugriff immer noch lieber ist als eine db-verbindung aufbauen! (ansichtssache, ich weiß :rolleyes:)

und weils wieder angesprochen wurde, hier nochmal der vorteil wenns eine globale/statische oder IPS Variable gäbe die die Resource-Id speichern könnte: In jedem script nur noch ein einziges kommando nötig ist… mysql_db_query unter angabe der resource als bereits geöffnete id.

Pack doch Deine dbcon.php in ne RAM-Disk. Obwohl der eine Lesezugriff nun auch nicht so wild ist bei den ganzen Festplattenzugriffen, die MySQL so nebenbei macht. Kannst ja mal nen Benchmark machen, wie viel Performance Du verlierst zwischen require und direktem pconnect. Ergebnisse würden mich da auch interessieren, wobei meine 5 Jahre alte Hardware (Pentium M 1,73GHz, 1GB RAM, 100GB 4200Upm HDD) trotz VM-Betrieb bei durchschnittlichen 2 Querys pro Sekunde immernoch genug Reserven hat.

Nicht zu vergessen: Optimierungsguides zur Konfiguration der MySQL-Datenbank durcharbeiten.