Stop concurrency in php

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Anorionil Black

Anorionil Black

11/08/2011 12:34:20
Quote Anchor link
Ik heb een vraag over PHP. Ik heb een php bestand dat door meerdere mensen min of meer tegelijkertijd kan worden aangeroepen.
Ik wil echter dat een gedeelte van de code maar door één persoon tegelijkertijd kan worden uitgevoerd.

Ik heb al een halve oplossing bedacht, maar ik denk dat die het probleem niet echt zal oplossen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
//check SQL variabele
while (variable ==1)
{

 wait(10);
 //check SQL variabele
}
//set variabele op 1
//doe hier de "belangrijke code"
//set variabele op 0

?>


maargoed bovenstaande code levert nog steeds dezelfde problemen op als twee personen op hetzelfde moment de SQL variabele checken en dan tegelijkertijd uit de while loop raken.

Zit er in PHP iets om dit op een natuurlijke manier af te dwingen?
Gewijzigd op 11/08/2011 12:34:55 door Anorionil Black
 
PHP hulp

PHP hulp

22/12/2024 08:57:24
 
Ozzie PHP

Ozzie PHP

11/08/2011 12:43:52
Quote Anchor link
Ik denk dat je een denkfout maakt. Een php-bestand weet niet door wie hij wordt aangeroepen en alles werkt gescheiden van elkaar. Telkens als een bestand wordt aangeroepen wordt alles opnieuw uitgevoerd. Je kunt dus niet in je php bestand zeggen "wacht even 10 seconden, want iemand anders is al met dit bestand bezig". Het enige wat je zou kunnen doen is een timestamp (tijd-stempel) in de database zetten en op basis daarvan controleren of een bepaalde actie wel of niet mag worden uitgevoerd.

Maar.... wat betreft jouw vraag. Waarom zou je dat willen?
 
Anorionil Black

Anorionil Black

11/08/2011 13:45:09
Quote Anchor link
Uhm ja maar in een groter systeem (bijvoorbeeld een spel) waarbij al die gegevens wel worden opgeslagen zou het wel mogelijk zijn. Maar het probleem zou er nog steeds zijn met een timestamp in de database aangezien je niet de check en de aanpassing in één query kan doen, of wel?
 
Ozzie PHP

Ozzie PHP

11/08/2011 14:04:50
Quote Anchor link
Ik weet niet wat je bedoelt en waar je naar toe wil.

Persoon 1 voert query A uit. Als dit gebeurd is, wordt er een tijdstempel in de database opgeslagen.

Persoon 2 wil query A ook uitvoeren. De tijdstempel wordt opgehaald. Is de huidige tijd 10 seconden later dat de tijdstempel dan mag query A worden uitgevoerd. Is dit niet het geval dan mag query A niet worden uitgevoerd.

Is dat wat je bedoelt?
 
Eric Wagener

Eric Wagener

11/08/2011 14:22:44
Quote Anchor link
Maar leg eens uit waarom je het eigenlijk wil? Ik ben nieuwsgierig geworden. Ik kan mij geen situatie bedenken die je zo zou willen oplossen.
Als het probleem in een query/update zit, kun je het waarschijnlijk ook daar oplossen.
 
Jelmer -

Jelmer -

11/08/2011 18:54:34
Quote Anchor link
Volgens mij kan je met transactions en InnoDB wel zoiets bereiken op database niveau. Dat zorgt er in ieder geval voor dat binnen die transactie de waarden in de database niet tussentijds veranderen. Ik weet niet of je ook een lock op een tabel kan verkrijgen zodat anderen niet tegelijkertijd kunnen lezen.
 
Kees Schepers

kees Schepers

11/08/2011 19:25:10
Quote Anchor link
Dat kan met Doctrine wel, alleen is misschien wat hoog gegrepen :)
 
Jelmer -

Jelmer -

11/08/2011 23:07:55
Quote Anchor link
Niet interessant dat Doctrine het kan, maar interessant hoe ze het doen! :D

… maar ik kan in hun dbal documentatie niets vinden over locks, alleen over transactions. En die beschermen je alleen tegen dubbel schrijven. Volgens mij heb je een table lock nodig als je ook het lezen tijdens je bewerkingen wilt blokkeren.
 
Anorionil Black

Anorionil Black

17/08/2011 18:18:55
Quote Anchor link
Hallo,

Bedankt voor alle reacties tot nu toe. Ik zal het probleem nog iets verder toelichten:

Het gaat om een spel dat o.a. door middel van PHP wordt gespeeld. Er zitten verschillende spelers in een potje. In principe komt elke speler om de beurt aan de beurt, maar in sommige gevallen kunnen verschillende mensen tegelijkertijd knoppen gebruiken. Zo'n knop stuurt een bericht naar een php script dat dan wordt uitgevoerd. In sommige gevallen mag het echter niet zo zijn dat het script dubbel wordt aangeroepen, oftewel, dat tijdens de uitvoer door een request van één persoon hij nog een keer begint uit te voeren voor een ander persoon.

Een Table Lock gaat het denk ik niet oplossen, omdat er verschillende potjes tegelijkertijd gespeeld kunnen worden, en ik kan niet voor elk potje een table aanmaken. Ik zou eerder een "Row Lock" willen hebben zeg maar.
Voor zover ik de uitleg bij Transactions begrijp, is dit ook niet de oplossing die ik zoek.

Zou het niet mogelijk zijn om ín de query een IF te zetten. Als het ware de query: "UPDATE * FROM blabla IF test=0 ELSE return null" ofzo? Of kan ik misschien achteraf checken of een bepaalde update ook heeft plaatsgevonden door een specefieke query?
 
Kees Schepers

kees Schepers

17/08/2011 19:07:56
Quote Anchor link
Jelmer rrrr op 11/08/2011 23:07:55:
Niet interessant dat Doctrine het kan, maar interessant hoe ze het doen! :D

… maar ik kan in hun dbal documentatie niets vinden over locks, alleen over transactions. En die beschermen je alleen tegen dubbel schrijven. Volgens mij heb je een table lock nodig als je ook het lezen tijdens je bewerkingen wilt blokkeren.


Het zit in hun ORM laag van versie 2.x. Bij het opvragen van een entity uit de EntityManager kun je een lock type constante meegeven :)


http://www.doctrine-project.org/docs/orm/2.0/en/reference/transactions-and-concurrency.html
Gewijzigd op 17/08/2011 19:09:00 door kees Schepers
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.