PHP arka plan / asenkron arkada yazma önbelleğe alma nasıl?

10 Cevap php

Ben çeşitli nedenlerle, bir veritabanına ~ 200 alanları kaydetmek gerekiyor, belirli bir PHP sayfası var. Bu 200 ayrı ekleme ve / veya güncelleme ifadelerdir. Şimdi yapmak için bariz şey dediğim gibi nedenlerden dolayı ben bunu yapamam girmeden rahatsız olmaz, bu sayıyı azaltmak ama.

Ben bu sorunu beklemiyordum. Seçer MySQL makul ölçülebilir görünüyor ama ekler / güncellemeler (doğal olarak kabul edilemez bu güncelleştirmeyi yapmak için yaklaşık 15-20 saniye sürer) değildir. (; OracleXE vs MySQL 5 yerel veritabanlarını çalıştıran her iki durumda) ben mutlu aynı zamanda ekler / güncellemeleri binlerce yapabilirsiniz Java / Oracle sistemlerini yazdık.

. Şimdi Java veya Net gibi bir şey ben oldukça kolay aşağıdakilerden birini yapabilirsiniz:

  1. Write the data to an in-memory write-behind cache (ie it would know how to persist to the database and could do so asynchronously);
  2. Write the data to an in-memory cache and use the PaaS (Persistence as a Service) model ie a listener to the cache would persist the fields; or
  3. Simply start a background process that could persist the data.

Minimal çözelti ayrı (yani bellek önbelleği güncellemek hemen sonra dönersiniz) gidin ve kendi zamanında veritabanı upate olacak ben sadece güncelleyebilirsiniz bir önbellek, sahip olmaktır. (Bir genel paylaşılan önbellek diğer yollarla itiraz rağmen) bu ya bir küresel önbellek ya da bir oturum önbellek olabilir.

Bu tür sorunları için başka çözümler?

10 Cevap

Sen nispeten hızlı bir şekilde 200 ekler yapmak gerekir, ancak bu faktörlerin çok bağlıdır. Eğer bir işlem motoru kullanarak ve kendi işlem her birini yapıyorsanız, yok - yol çok fazla I / O oluşturur

Olmayan bir işlem motoru kullanıyorsanız, biraz yanıltıcıdır. Tek bir çok sıralı insert kullanarak MySQL yıkama politikası her satır sonra değişiklikleri floş gerekir anlamına gelir daha iyi olması muhtemeldir.

Gerçekten üretim spec geliştirme kutusunda bu yeniden ve oluyor tam olarak neden analiz edebilmek istiyorum. Bu durdurmak zor olmamalı.

Eğer uygun veritabanı sunucu ölçeklendirme hangi durumda - Tabii ki başka bir olasılık da ekler çünkü aşırı büyüklükte tablolar veya dizin çok sayıda yavaş olmasıdır. Kimin indeksler RAM sığmayan (ya da RAM doğru bu indeksleri önbelleğe alma için kullanılacak yapılandırılmış değildir) bir tabloya satır çok takma genellikle oldukça kötü kokulu olur.

ANCAK kolayca anda algoritması tutarak, yerine onu ayarlama bir yolu varken uygulama komplike bir yol aramaya kalkmayın.

(Yerine :) ayarlama mysql) kullanmak olabilir bir daha çözüm asenkron şekilde veritabanı sunucusu için veri yazma için PHP için bazı JMS sunucusu ve STOMP connection driver kullanmaktır. ActiveMQ yerleşik STOMP protokolü desteği. Ve herhangi bir JMS compilant sunucu (OpenMQ, JBossMQ vb) için STOMP vekil olan StompConnect proje var.

mysql_query (') ... (...), (...), (, tableName VALUES (...) INSERT INTO')

Above given query statement is better. But we have another solution to improve the performance of insert statement.Follow the following steps.. 1. You just create a csv(comma separeted delimeter file)or simple txt file and write all the data that you want to insert using file writting machanism (like FileOutputStream class in java). 2. use this command

LOAD DATA INFILE 'data.txt' INTO TABLE table2 FIELDS TERMINATED BY '\t';

Bu komutla ilgili açık değilse 3 sonra aşağıda verilen linki takip

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

Eğer ekler yaparken veritabanı için istatistiklere bakmak. Ben guessing Güncelleştirmelerinizin bir tablo kilitler ve bunun tüm tabloları sıraya ve bu gecikme yaşarsınız ki. Eğer bir tablo üzerinde daha endeksleri, yavaş tüm UPDATE ve INSERT ifadeleri olsun çünkü içine bakmak için başka bir şey dizin oluşturma / güncellenmesi.

Başka bir şey seni UPDATE.I üzerinde tüm tabloyu kilitleyen ki MYISAM (tablo motor) yerine INNODB kullanmanızı öneririz kullanmak düşünüyorum. INNODB SELECT-sorgularını yavaştır, ancak daha hızlı üzerinde sadece satır kilitler çünkü INSERT ve UPDATE bunun üzerinde çalışıyor ve değil Tüm tablo.

Tablo INSERT-SADECE (hayır silme ve değişken uzunlukta sütun üzerinde güncelleme) ise, o ekler kilit olmaz veya MyISAM kullanırken blok okur unutmayın.

Bu veya insert performansını artırmak değil, ama eşzamanlı insert yaşıyorsanız / okuma sorunları yardımcı olabilir.

Ben bu kullanarak ve sadece 'optimize tablo', ardından günlük eski kayıtları tasfiye ediyorum.

Eğer yerel önbelleği (umarım memcached) güncellemek ve ardından beanstalkd ile yazma istekleri zorlayabilir.

Ben SQL ekler ile bir sorun olduğundan şüpheleniyorsanız olur - gerçekten bu uzun sürmez. Hazırlanan sorgular yardım eder misiniz? MySQL sunucu keyspace adanmış biraz daha fazla bellek ihtiyacı var mı? Biraz fazla soru sordum gerek.

Nasıl ekler yapıyorsun, sen kayıt başına bir ekleme yapıyor

mysql_query('INSERT INTO tableName VALUES(...)');
mysql_query('INSERT INTO tableName VALUES(...)');
mysql_query('INSERT INTO tableName VALUES(...)');
mysql_query('INSERT INTO tableName VALUES(...)');
mysql_query('INSERT INTO tableName VALUES(...)');

ya da tek bir sorgu kullanıyorsanız

mysql_query('INSERT INTO tableName VALUES(...),(...),(...),(...)');

Iki seçenekten daha sonra büyük ölçüde daha hızlı ve deneyimlerinden ilk seçenek böylece ikinci ve geçmeden önce bitirmek için ilk sorgu için beklemeniz gerekir çok uzun PHP gibi almaya neden olacaktır.

Bu göz önünde bulundurun:

mysql_query('start transaction');
mysql_query('INSERT INTO tableName VALUES(...)');
mysql_query('INSERT INTO tableName VALUES(...)');
mysql_query('INSERT INTO tableName VALUES(...)');
mysql_query('INSERT INTO tableName VALUES(...)');
mysql_query('INSERT INTO tableName VALUES(...)'); 
mysql_query('commit;')

Asenkron veritabanı manipülasyonlar yapmak için PHP ile CURL kullanabilirsiniz.

Olası bir çözüm ayrı bir konu içerisine her sorgu çatal ama, PHP desteği konuları etmediğinden. Biz PCNTL işlevlerini kullanabilirsiniz ama bana bunları kullanmak için biraz zor bulunuyor. Ben çatal oluşturmak ve asenkron işlemleri gerçekleştirmek için bu başka bir çözüm kullanmayı tercih.

Bu başvurun

http://gonzalo123.wordpress.com/2010/10/11/speed-up-php-scripts-with-asynchronous-database-queries/