MySQL bir işlem bitene kadar bekleyen içine PHP zorlamak için bir yolu var mı?

3 Cevap php

Ben PDO ve MySQL iç işleyişini% 100 değilim itiraf edeceğiz, bu yüzden benim soru daha anlaşılır kılmak için bir örnek vereceğim.

Ben PHP ve veritabanları öğrenmek için eğlenceli bir yol olduğunu düşünüyorum, çünkü ben, oldukça ham tarayıcı tabanlı strateji oyunu yapıyorum. Ben oldukça beklenmedik hata rastladım ben bug-test savaş komut oldu. Ben böyle bir şey arıyor, bir script her dakika aramak için Cron Jobs kullanın:

$ Sql ​​= "gelişi = 0 activearmy DAN army_id SELECT;";

foreach($dbh->query($sql) as $row)
	{

		battleEngine($row["army_id"]);

	}

Temel hesaplamalar (ordusunu savunan vs ordusu saldırıyor) yapılır, veritabanında altı tablo güncellenir. Ben yüz sorun ben aynı dakika içinde aynı hedefe çeşitli saldırılar, bu saldırıların her şimdi ve sonra bir tane eski veritabanı bilgi almak yaparken (bir ekstrem durumda, saldırı # 10 # 5. saldırı olarak aynı tablo getirilen) olduğunu .

Ben komut veritabanı daha hızlıdır çünkü bu olur tahmin ediyorum? Ilgili tüm bilgilerin bir sonraki $ satır ile işlevini yinelenen önce yerinde kadar beklemek PHP zorlamak için bir yolu var mı?

EDIT: Emil is probably correct. I can't make sure though as it seems impossible for my PDO to stay open long enough for me to pass several statements between beginTransaction() and commit(). However, a dirty read seems odd since I'm using InnoDB with "REPEATABLE READ". Some Googling suggest that REPEATABLE READ will make dirty reads impossible. After contemplating how to kill myself for a while, I opted for a hack instead. For now, I put an UPDATE for a special value on top of my script, and another at the end of the big batch (about six UPDATE statements) at the bottom. Before running the function, I've put up a while()-loop which checks if that special value is set to 0. If it's not, it sleeps for 0.01 seconds and try again. Looking at the output, the while loop repeats an average of two times, suggesting it might actually be working? It hasn't failed yet, but it might be because it's not peak hour. I'll try again at regular intervals tomorrow. I know no-one cares about all this, but I felt I should make this update just in case. =P

3 Cevap

PHP sadece tamamen bekleseydim, sen kadar istifleme cron işleri yüksek bir sayı almak istiyorum.

Ne really istediğinizden emin komut yalnızca bir örneği her an çalışır hale getirmek, anachron gibi bir şey kullanmaktır. Ayrıca aşağıdaki gibi bir şey yapabilirsiniz:

<?php

  if (file_exists('/tmp/myscriptlock')) exit();
  touch('/tmp/myscriptlock');

  // do your stuff

  unlink('/tmp/myscriptlock');

Ne görüyorsanız, bir "kirli okuma" denir. InnoDB kullanmak ve serileştirilebilir için isolation level set. Ardından işlem blokları tüm sorguları sarın:

$dbh->beginTransaction();
// run queries
$dbh->commit();

Benim ilk düşünce basit mysql yazma kilitleri, ama ben yeterince sorunu anlamıyorum. Her durumda, bu yardımcı olabilir: http://www.perplexedlabs.com/2008/02/06/mutex-with-php-and-mysql/