Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από cpulse » 22 Μαρ 2008 19:42

Αυτό το κλείδωμα το προορίζεις για κάποιο είδος forum; Αν ναί, έχω δει μια πολύ ωραία ειδοποίηση από το SMF το οποίο αντί να χρησιμοποιεί locks κάνει κάτι αλλό ποιο απλό και πρακτικό. Ας πούμε οτι γράφεις μια απάντηση σε ένα thread αλλά έχει προλάβει κάποιος πριν από σένα να απαντήσει. Εσύ πατάς το submit και η απάντηση σου αντί να γραφτεί στην βάση σου βγαίνει μια σελίδα με όλα τα controls της απάντησης με το κείμενο σου και σου λέει σε ένα boxάκι οτι κατά την διάρκεια της απάντησης σου κάποιος άλλος χρήστης έγραψε την τάδε απάντηση. Μετά εσύ πρέπει να ξαναπατήσεις το submit για να ολοκληρωθεί η απάντηση σου. Έτσι σου δίνεται η ευκαιρία να διορθώσεις το κείμενο της απάντησης.

Αν επιμένεις σε αυτό το lock πάντως.. η δικιά μου λογική είναι πολύ κοντά σε αυτή του Σκεφτόμυλου, απλά εγώ νιώθω μια παραπανήσια ανασφάλεια και θα χρησιμοποιούσα file locks γιατί έτσι έχεις ένα thread safe μηχανισμό για κλειδώματα. Τα αρχεία που θα κλείδωναν δεν θα ήχαν καμία άλλη χρήση πέρα του εικονικού κλειδώματος.

Κώδικας: Επιλογή όλων

$maximum_attempts = 20; // προσπάθειες για κλείδωμα
$sleepmsecs = 250; // msec καθυστέρησης σε κάθε προσπάθεια για κλείδωμα

$attempt = 1;
$fp = fopen('/path/to/lock_file.txt', 'r');
$locked = FALSE;
while &#40;$attempt <= $maximum_attempts&#41; &#123;
  $attempt++;
  if &#40;flock&#40;$fp, LOCK_EX&#41;&#41; &#123;
    $locked = TRUE;
    break;
  &#125;
  usleep&#40;$sleepmsecs * 1000&#41;;
&#125;

if &#40;!$locked&#41;
  die&#40;'Lock time out'&#41;;
Ο παραπάνω κώδικας χρησιμοποιεί την εντολή usleep η οποία στα Windows λειτουργεί μόνο με την PHP 5 και πάνω.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από cpulse » 22 Μαρ 2008 20:05

Συνεχίζω λίγο την προηγούμενη απάντηση για να μην παρεξηγηθεί..

Τα file locks χρειάζονται μόνο για την λειτουργεία της εγγραφής στην βάση. Επίσης υπάρχει και τρόπος να κλειδώσεις τους πίνακες στην MySQL 5 με την SQL εντολή LOCK TABLE και να ξεκλειδώσεις με UNLOCK TABLE. Αλλά νομίζω δεν υπάρχει λόγος να μπείς σε τέτοια διαδικασία. Ο ψευδοκώδικας με την λογική που προτείνω είναι αυτός

- Απόκτηση file lock, αν δεν επιτύχει σημαίνει οτι ο server είναι υπερφορτωμένος.
- Εγγραφή στην βάση με την λογική του Σκεφτόμυλου
- Απελευθέρωση file locks με

Κώδικας: Επιλογή όλων

flock&#40;$fp, LOCK_UN&#41;;
fclose&#40;$fp&#41;;
Αυτό το τελευταίο βήμα και να μην το κάνεις θα γίνει αυτόματα από την PHP κατά την ολοκλήρωση της εκτέλεσης του script.

parido
Δημοσιεύσεις: 12
Εγγραφή: 07 Ιαν 2008 11:49
Τοποθεσία: athina

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από parido » 22 Μαρ 2008 22:06

εχεις δικιο για τουσ browser. Ο explorer εχει σκαλωμα με το onClick στα link, σαν να μην υπάρχει.

parido
Δημοσιεύσεις: 12
Εγγραφή: 07 Ιαν 2008 11:49
Τοποθεσία: athina

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από parido » 22 Μαρ 2008 22:10

Eνδιαφερον αυτα που μασ ειπεσ cpulse!!! Όχι δεν ειναι για φορουμ. Μια σχετικα απλη εφαρμογη διαχείρισης εγγραφών(πελατων) απο βαση

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από skeftomilos » 23 Μαρ 2008 00:03

cpulse έγραψε:Αυτό το κλείδωμα το προορίζεις για κάποιο είδος forum; Αν ναί, έχω δει μια πολύ ωραία ειδοποίηση από το SMF το οποίο αντί να χρησιμοποιεί locks κάνει κάτι αλλό ποιο απλό και πρακτικό. Ας πούμε οτι γράφεις μια απάντηση σε ένα thread αλλά έχει προλάβει κάποιος πριν από σένα να απαντήσει. Εσύ πατάς το submit και η απάντηση σου αντί να γραφτεί στην βάση σου βγαίνει μια σελίδα με όλα τα controls της απάντησης με το κείμενο σου και σου λέει σε ένα boxάκι οτι κατά την διάρκεια της απάντησης σου κάποιος άλλος χρήστης έγραψε την τάδε απάντηση. Μετά εσύ πρέπει να ξαναπατήσεις το submit για να ολοκληρωθεί η απάντηση σου. Έτσι σου δίνεται η ευκαιρία να διορθώσεις το κείμενο της απάντησης.
Αυτό το έχει και το Freestuff εδώ και μερικό καιρό. Είναι ο έλεγχος concurrency που λέγαμε προηγουμένως (optimistic concurrency για την ακρίβεια). Στην περίπτωση μίας εγγραφής με π.χ. τριάντα πεδία δεν είναι τόσο ικανοποιητικό απλά να ενημερώσουμε το χρήστη ότι κάποια πεδία μπορεί να έχουν αλλάξει τιμή. Ο χρήστης θα θέλει να ξέρει ποια πεδία άλλαξαν, και ποια είναι η νέα τους τιμή. Η απλούστερη αντιμετώπιση αυτού του προβλήματος είναι να προτείνουμε στο χρήστη να κάνει refresh για να δει τα τρέχοντα στοιχεία, και έπειτα να κρίνει για το αν θα επαναλάβει τις δικές του διορθώσεις.

Άβαταρ μέλους
gaucho
Honorary Member
Δημοσιεύσεις: 2408
Εγγραφή: 22 Δεκ 2002 13:18

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από gaucho » 23 Μαρ 2008 19:34

H λύση είναι transactions και τύπος table innodb

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Πωσ να κλειδωσω μια εγγραφη οταν την επεξεργαζεται αλλοσ

Δημοσίευση από cherouvim » 23 Μαρ 2008 20:07

gaucho έγραψε:H λύση είναι transactions και τύπος table innodb
Αυτό σίγουρα είναι λύση, αλλά όχι στο πρόβλημα που περιέγραψε ο φίλος μας.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης