PHP kritik bölümünde nasıl korunuruz?

3 Cevap php

Ben bu konu hakkında bazı arama yaptım ama değerli hiçbir şey bulunamadı.

Ben PHP varsayılan oturum işleyicisi kullanmak istemiyorsanız, istek düzeyinde hiçbir oturum kilit yoktur. Yani, kendim kritik bölüm korumak zorundayız.

Java'da, biz synchronized . In C#, we have lock var.

PHP, nasıl bunu yapmak için?

3 Cevap

PHP betikleri çok dişli olmadığından, ben kritik bölümleri alakalı inanmıyorum. Ben birden çok örneği paralel olarak çalıştırılır çünkü bir yarış durumu olduğunu kabul ediyorsunuz, ama bir kritik bölüm sorununuzu çözmez.

Eğer bir dosya tabanlı oturum işleyicisi kullanarak ediyorsanız, temel bir flock() deneyebilirsiniz. Bir veritabanı kullanıyorsanız, kilitleme mekanizması motor kendi (tercihen, satır düzeyinde) kullanarak deneyebilirsiniz. Memcached kullanıyorsanız, bir dağıtılmış kilit sisteminin uygulanması deneyebilirsiniz.

Siz de geniş bir kilit uygulamak istemez. Mümkün olduğunca granül şey (belki de, oturum kimliği bağlı) isteyeceksiniz. Tüm oturum davranışlarını getirilmeye çalışırsanız, büyük bir darboğaz tanıtacağız.

Veritabanı dünyasında (ve başka yerlerde), iyimser "kilitler" genellikle tüm ihtiyacınız vardır. Onlar artırılır basit bir sayaç içerir. Sayısı "off" (çarpışma) kayıt güncellenmemiş ve yeniden almak ve uygun olarak farklılıkları uygulayabilirsiniz ise. Bu denemeniz ile birlikte bir UPDATE table WHERE count = lastcount türü bir şey var. Bu genellikle hile yok.

Tabii ki, bu hedefe ulaşmak için dosya kilitleme, SYSV semafor (idareli) ve diğer çeşitli yöntemler kullanabilirsiniz. Sadece bu bir yarış durumu gibi geliyor, ama konuları ile ilgisi yoktur, hatırlamıyorum.

semaphores Bunun için kullanın.

Çoğu kez PHP bir iplik modeli (bellek paylaşım yok) yoktur, çünkü kritik bölüm ile uğraşmak zorunda değilsiniz. Ben bile semephores sizin için uygun olduğunu düşünmüyorum. PHP kullanan bir "Share-nothing Architecture" PHP yaratıcısı Rasmus Lerdorf ve slaytlar üzerinde görebilirsiniz. Eğer slaytta gördüğünüz gibi Bu demektir ki,

Shared data is pushed down to the data-store layer

With just a simple PHP script running on top of apache you don't even have to deal with critical sections. you have to interact with data via your database. You could also use files and lock them, but I would go with database instead of files.

Bu soru biraz cevaplar umuyoruz.