Class weghalen
Ik heb nu een script dat continu looped(een gameserver controller). Dit heeft plugins in de vorm van classes. Dus bijvoorbeeld class "player_plugin". Nu wil ik de optie maken om alle plugins opnieuw in te laden(als er bijvoorbeeld een bestand verandert is). De manier waarop ik dit wil doen is alle bestanden gewoon opnieuw includen. Maar nu geeft ie dan aan dat de class player_plugin all bestaat. Hoe fix ik dit?
Ocharme voor die server..
Ik raad je toch echt aan om een andere scripting taal daarvoor te gaan gebruiken. php is hier helemaal niet voor geschikt.
Wat misschien wel zou lukken (als je tenminste Runkit geïnstalleerd hebt) is om de plugins in sandboxes te laden, en als je de plugin wilt herladen, dump je gewoon de huidige sandbox voor die plugin en initialiseer je een nieuwe. Bijkomend voordeel is dat plugins met fatal errors je script niet meer zouden moeten ombrengen.
@Hipska: Het loopt gewoon goed hoor ^^
@Jelmer: Ik wist helemaal niet dat je met php meerdere threads kon maken, zal er eens naar kijken. Brengt dat net als bij C# problemen mee met data uitwisselen tussen verschillende threads?
Hier is trouwens het script: http://quicktm.svn.sourceforge.net/viewvc/quicktm/
In quick.php worden de plugins ingeladen.
Gewijzigd op 01/01/1970 01:00:00 door Deze site laat je geen account deleten
Maar dat laatste is op zich ook niet zo'n ramp. Je kan je plugins afdwingen alleen bekende datatypen terug te laten geven, en je bent ervan verzekerd dat een plugin niet een object via een reference alsnog ergens kan aanpassen terwijl dat helemaal niet meer zou mogen.
edit: maar ik zit nu te speculeren, je zou het een keer moeten uitproberen.
edit2: je zou ook runkit kunnen nabootsen door een apart PHP proces te starten dat de plugin laadt, en dat via een socket-verbinding en een eigen kleine API verbinden met je hoofdproces. Als de plugin dan crasht of herladen moet worden, verlies je alleen de verbinding en kan je hem weer opnieuw starten. Het is waarschijnlijk wel redelijk inefficiënt, maar afhankelijk van wat voor taken je plugins doen is het wel iets wat op veel meer standaard PHP installaties zou werken.
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
Jelmer schreef op 13.08.2009 15:13:
Geen idee hoe ze dat probleem hebben opgelost. Ik denk zelf dat ze het via serialize() doen, en zo een kopie van de data in de ene thread naar de andere thread sturen. Probleem is dat je op die manier wel alleen maar "simpele" datatypen kan kopiëren, instanties van classes die gedefinieerd zijn in de sandbox maar niet in je eigen code levert __PHP_Incomplete objecten op.
Maar dat laatste is op zich ook niet zo'n ramp. Je kan je plugins afdwingen alleen bekende datatypen terug te laten geven, en je bent ervan verzekerd dat een plugin niet een object via een reference alsnog ergens kan aanpassen terwijl dat helemaal niet meer zou mogen.
edit: maar ik zit nu te speculeren, je zou het een keer moeten uitproberen.
edit2: je zou ook runkit kunnen nabootsen door een apart PHP proces te starten dat de plugin laadt, en dat via een socket-verbinding en een eigen kleine API verbinden met je hoofdproces. Als de plugin dan crasht of herladen moet worden, verlies je alleen de verbinding en kan je hem weer opnieuw starten. Het is waarschijnlijk wel redelijk inefficiënt, maar afhankelijk van wat voor taken je plugins doen is het wel iets wat op veel meer standaard PHP installaties zou werken.
Maar dat laatste is op zich ook niet zo'n ramp. Je kan je plugins afdwingen alleen bekende datatypen terug te laten geven, en je bent ervan verzekerd dat een plugin niet een object via een reference alsnog ergens kan aanpassen terwijl dat helemaal niet meer zou mogen.
edit: maar ik zit nu te speculeren, je zou het een keer moeten uitproberen.
edit2: je zou ook runkit kunnen nabootsen door een apart PHP proces te starten dat de plugin laadt, en dat via een socket-verbinding en een eigen kleine API verbinden met je hoofdproces. Als de plugin dan crasht of herladen moet worden, verlies je alleen de verbinding en kan je hem weer opnieuw starten. Het is waarschijnlijk wel redelijk inefficiënt, maar afhankelijk van wat voor taken je plugins doen is het wel iets wat op veel meer standaard PHP installaties zou werken.
Je zegt: "geen idee hoe ze dat hebben opgelost" als je het over het script heb wat ik net liet zien: dat is juist het script waarover dit topic gaat, dat kan nu niet alle plugins opnieuw inladen. En in een apart proces runnen gaat helaas niet, de plugins moeten contact houden met de hoofdclass, en bijna alles draait op plugins dus dit zal wel erg inefficient zijn voor dit script.
teuneboon schreef op 13.08.2009 14:34:
Maar over processorbelasting op de server zullen we maar zwijgen zeker? Evenals over het geheugenverbruik..@Hipska: Het loopt gewoon goed hoor ^^
Hipska schreef op 13.08.2009 18:24:
teuneboon schreef op 13.08.2009 14:34:
Maar over processorbelasting op de server zullen we maar zwijgen zeker? Evenals over het geheugenverbruik..@Hipska: Het loopt gewoon goed hoor ^^
Processorbelasting: 0.5%
Geheugengebruik: 60mb
In welke (cross-platform) taal stel jij het dan voor?
Gewijzigd op 01/01/1970 01:00:00 door Deze site laat je geen account deleten
C++ ofzo?
Die 0.5% is wanneer je PHP scriptje draait onder belasting?