Bir mysql tetikleyici bir PHP komut dosyası çağırma

7 Cevap php

Bir rekor mysql db tabloya eklenen edilirken yine bir PHP sayfası / fonksiyonu çağırmak var. Biz orada kayıt ekleme procedure.Is üzerinde kontrole sahip değilsin geri bir PHP komut arayabilir tetikleyici olarak adlandırılan bir şey?

7 Cevap

Tetikleyici değil PHP biri (bu ikisi aynı makinede bile) üzerinde, SQL server üzerinde çalıştırılır.

Yani, bu oldukça mümkün değildir söyleyebilirim - en azından sadece.


Still, considering this entry from the MySQL FAQ on Triggers :

23.5.11: Can triggers call an external application through a UDF?

Yes. For example, a trigger could invoke the sys_exec() UDF available at MySQL Forge here: http://forge.mysql.com/projects/project.php?id=211

Yani, php çalıştırılabilir / komut dosyası başlatmak olacak bir UDF fonksiyonu vasıtasıyla, aslında, bir waty olabilir; o kadar kolay değil, ama mümkün görünüyor ;-)

Bir arkadaşım ve ben Bernardo Damele en sys_eval UDF aramak için nasıl anladım var, ama çözüm İsterdim gibi zarif değildir. İşte biz bunu yaptık:

  1. Biz Windows kullanıyorsanız bu yana, biz Roland Bouman's instructions kullanarak Windows için UDF kütüphane derlemek ve MySQL sunucusu bunları yüklemek zorunda kaldım.
  2. Biz sys_eval çağıran bir saklı yordam yarattı.
  3. Biz saklı yordamı çağıran bir tetikleyici oluşturulur.

Saklı yordam kodu:

DELIMITER $$
CREATE PROCEDURE udfwrapper_sp
(p1   DOUBLE,
 p2   DOUBLE,
 p3 BIGINT)
BEGIN
 DECLARE cmd CHAR(255);
 DECLARE result CHAR(255);
 SET cmd = CONCAT('C:/xampp/php/php.exe -f "C:/xampp/htdocs/phpFile.php" ', p1, ' ', p2, ' ', p3);
 SET result = sys_eval(cmd);
END$$;

Tetik kodu:

CREATE TRIGGER udfwrapper_trigger AFTER INSERT ON sometable
FOR EACH ROW
CALL udfwrapper_sp(NEW.Column1, NEW.Column2, NEW.Column3);

Ben saklı yordamı sahip hakkında heyecan değilim, ve ekstra yük oluşturur olmadığını bilmiyorum, ama çalışır. Her bir satır, tetik yangın sometable eklenir.

Bunu buldum:

http://forums.mysql.com/read.php?99,170973,257815#msg-257815

DELIMITER $$
CREATE TRIGGER tg1 AFTER INSERT ON `test`
FOR EACH ROW
BEGIN
\! echo "php /foo.php" >> /tmp/yourlog.txt
END $$
DELIMITER ;

Ben php komut dosyası sürekli db yoklamak zorunda istemiyordu uzun yoklama ile bir durumda bu kesin konuda düşünüyordum. Yoklama yerde yapılması gerekir, bellek muhtemelen iyi olurdu. Şekilde tetik memcache gibi bir şey içine bilgi koymak eğer öyleyse, o zaman php o kadar az yoğun genel olurdu olurdu yoklamak olabilir. Mysql memcache kullanmak için sadece bir yöntem gerekir. Belki belirli bir kullanıcı kimliği ile önceden tanımlanmış bir değişkene. Veri alındıktan sonra db tekrar ayarlar kadar php VAR sıfırlamak olabilir. Değil ama zamanlama sorunları konusunda emin. Belki seçilen önceki anahtarını saklamak için ikinci bir değişken.

Bu bir veritabanı tetikleyici bir very bad programming practice aramak PHP kodu düşünülmelidir. Eğer böyle "deli" hileler kullanarak çözmeye çalışıyoruz görevi açıklayacağım, biz tatmin edici bir çözüm sağlayabilir.

ADDED 19.03.2014:

Bazı akıl önce eklendi, ancak şimdi bunu yapmak için zaman bulduk gerekir. Önemli sözler için @ cmc teşekkürler. Yani, PHP uygulama için aşağıdaki karmaşıklığı ekleyin tetikler:

  • Johan diyor @ olarak uygulama (dış PHP komut muhtemelen SELinux'un kurulumu vb, izin kurulum aramaları) güvenlik sorunları belirli bir ölçüde ekler.

  • Uygulamanıza karmaşıklık ek bir düzeyi ekler (veritabanı şimdi, SQL ve PHP hem de bilmek SQL değil, sadece ihtiyaç nasıl çalıştığını anlamak için) ve aynı zamanda SQL sadece PHP hata ayıklama gerekir.

  • (Ben tetik somwewhere tüm insuccessful PHP yorumlayıcısı aramaları ve bunların gerekçeleri oturum olacak bazı ayıklama kodunu tutmak gerektiğini düşünüyorum) da diagnosied gereken uygulama (örneğin PHP yanlış yapılandırma), başarısızlık ek noktası ekler.

  • Performans analizi ek noktası ekler. Eğer Yani bu tetikleyici içeren her sorgu yavaş çalıştırır, tercüman başlatmak baytkoduna komut dosyası derlemek, vb yürütmek gerekiyor, çünkü her bir PHP çağrı, pahalıdır. İZAH size sorgu çünkü tetik rutin performansı yavaş olma konusunda bir şey söylemek olmaz Ve bazen sorgu performans sorunları izole etmek zor olacaktır. Ve ben tetikleyici zaman yavaş sorgu günlüğüne dökülüyor nasıl emin değilim.

  • Uygulama testleri için bazı sorunlar ekler. SQL oldukça kolay test edilebilir. Ama SQL + PHP tetikleyiciler test etmek için, bazı beceri uygulamak zorunda olacak.

Size böyle RabbitMQ gibi bazı mesajlaşma uygulanması daha iyi olacak gibi görünüyor. Benim deneyim kesmek mümkündür ama güvenilir olmadığını söylüyor.

Eğer MySQL işlem günlükleri varsa, bir günlük örneği oluşturulması amacıyla bir tetikleyici oluşturabilirsiniz. Bir cronjob bu günlüğünü izlemek ve bir php komut dosyası çağırmak verebilecek tetikleyici tarafından oluşturulan olaylara dayalı olabilir. Kesinlikle size sokulması üzerinde hiçbir kontrole sahip ise budur.