Senaryo:
Her satırda dize (ortalama cümle değeri) olan bir dosyanız var. Sake argümanları için bu dosyanın boyutu 1Mb (binlerce satır) diyelim.
Dosyayı okuyan, belgedeki bazı dizeleri değiştiren bir komut dosyanız var (yalnızca ekleme değil aynı zamanda bazı satırları kaldırma ve değiştirme) ve ardından tüm verilerin üzerine yeni veriler yazıyor.
Sorular:
'Sunucu' PHP, OS veya httpd vb. Bu tür sorunları durdurmak için halihazırda sistemlere sahip mi?
Varsa, lütfen nasıl çalıştığını açıklayın ve ilgili belgelere örnekler veya bağlantılar verin.
Değilse, bir yazma işlemi tamamlanana kadar bir dosyayı kilitlemek ve diğer tüm okuma ve / veya yazma işlemlerini önceki komut dosyasının yazmayı bitirmesine kadar başarısız hale getirmek gibi etkinleştirebileceğim veya ayarlayabileceğim şeyler var mı?
Varsayımlarım ve Diğer Bilgilerim:
Söz konusu sunucu PHP ve Apache veya Lighttpd çalıştırıyor.
Komut dosyası bir kullanıcı tarafından çağrılırsa ve dosyaya yazmanın yarısındaysa ve başka bir kullanıcı dosyayı tam olarak o anda okursa. Belgeyi okuyan kullanıcı henüz yazılmadığı için belgenin tamamını alamaz. (Bu varsayım yanlışsa lütfen beni düzeltin)
Ben sadece bir metin dosyasına yazma ve okuma PHP ile ilgileniyorum, ve özellikle, fonksiyonlar "fopen" / "fwrite" ve özellikle "file_put_contents". Ben "file_put_contents" belgelerine baktım ama ayrıntı düzeyini veya "LOCK_EX" bayrağının ne veya ne olduğunu iyi bir açıklama bulamadık.
Senaryo, dosyanın büyük boyutu ve verilerin düzenleme şekli nedeniyle bu sorunların oluşma olasılığının daha yüksek olduğunu düşündüğüm en kötü durum senaryosunun bir örneğidir. Bu konular hakkında daha fazla bilgi edinmek istiyorum ve "mysql kullan" veya "bunu neden yapıyorsunuz" gibi cevaplar veya yorumlara ihtiyaç duymuyorum veya buna ihtiyacım yok çünkü bunu yapmıyorum, sadece dosya okuma / yazma hakkında bilgi edinmek istiyorum PHP ile ve doğru yerlere / belgelere bakmak gibi görünmüyor ve evet ben PHP bu şekilde dosyaları ile çalışmak için mükemmel bir dil olmadığını anlıyorum.
file_put_contents()
sadece fopen()/fwrite()
dans için bir sarıcı , LOCKEX
aradığınız gibi yapar flock($handle, LOCKEX)
.