İyinet'e Hoşgeldiniz!

Türkiye'nin En Eski Webmaster Forum'una Hemen Kayıt Olun!

Kayıt Ol!

Server'ı çok kasıyor.

*siber*

0
İyinet Üyesi
Katılım
20 Temmuz 2005
Mesajlar
2,014
Reaction score
1
Konum
about:blank
Yaklaşık 5 bine yakın üyeme altdaki gördüğünüz gibi bir döngünün içinde hem mail hemde mesaj gönderiyorum. Bu döngü hem çok yavaş döndüğü gibi (10 saniyede 1 kere) hemde 100 kişiye mail attıkdan sonra server kullanılamaz hale geliyor. Bunu server ı kasmadan nasıl yapabilirim ? önerilerinizi bekliyorum.

PHP:
$tablo = mysql_query ("SELECT * FROM users where atilanmesaj<=3");
while ($oku = mysql_fetch_assoc($tablo)) {
if ($oku[cins] == 1 & $oku[durum] == 1) {

 $ad = htmlspecialchars($ad);
 $mail = htmlspecialchars($mail);
 $konu = htmlspecialchars($konu);
 $soru = htmlspecialchars($soru);
 $konu = "Mesaj";

 $headers .= "MIME-Version:1.0\n";
 $headers .= "Content-Type: text/html; charset=iso-8859-9\n";
 $headers .= "From: Domain.Com<[email protected]>\n";
 $headers .= "BCC: [email protected]\n";
 $headers .= "X-Mailer: [email protected]\n";
 $headers .= "X-Priority: 1\n";
						$mesaj = "<font color='red'>Merhaba <font color='blue'><b>$oku[adsoyad]</b>,\n";
						$mesaj .= "<br>";

 @mail($oku[email], $konu, $mesaj, $headers);



$veri = "INSERT INTO mesajlar VALUES ('$id','$oku[id]','$konu','$mesaj','$durum','$yer','$tarih','$zaman','$gonderen')"; 
$veri_gir = mysql_query ($veri); 
echo "Gönderildi $oku[login] <br>";
 

iyinet

Root
Admin
Hosting Firması
Katılım
2 Eylül 2002
Mesajlar
5,028
Reaction score
66
Konum
Sakarya
Bunu yaptigin makina sana ait dedicated bir makine olmali.
Dedicated degil ise bu tur sorunlar cikacaktir, isin kotusu hosting sirketi hesabini kapatabilir.

Dedicated oldugunu varsayarak...:

SELECT * FROM users where atilanmesaj<=3
Bu dongu her seferinde tum kullanicilari getiriyor, cunku kodlama icinde bu dongunun sonucunu degistirecek bir update islemi yapilmiyor.
Her mesaj yada email gonderildiginde atilanmesaj yada gonderildi alanlarini update etmen gerekiyor ki ayni kisiye tekrar tekrar mail gitmesin.

Mail gonderme islemini loop icinde yapiyorsan dakikada 30 uzerinde email gonderme!

Gerekli duzenlemeleri yaptiktan sonra bu scripti cron icine koy, her dakika calisacak sekilde ve her seferinde "LIMIT 25" ile sorguya sinirlama getir.
 

*siber*

0
İyinet Üyesi
Katılım
20 Temmuz 2005
Mesajlar
2,014
Reaction score
1
Konum
about:blank
mysql e hiç bir şekilde update yapmamam gerekiyor. Yaparsam zaten gönderdiğim mail in anlamı kalmaz. Bu işlemi yaptığım makina amd 512 ram var. Birde P4.2.8 2 gb ram i olan makinam var acaba bu makinada yapsam bu şekilde kasılma olurmu.
 

iyinet

Root
Admin
Hosting Firması
Katılım
2 Eylül 2002
Mesajlar
5,028
Reaction score
66
Konum
Sakarya
istersen 2 x 3Ghz Xeon 4gb ram olsun bu sekilde yine sorun olur.
Mysql e update yapmazsan ve dedigim sekilde batch (kumeler seklinde) islem yapmazsan email gondermede sorun yasarsin.
Gonderdigin mailin neden anlami kalmiyor onu anlamis degilim, ben sana bir flag update et diyorum, email gonderip gondermedigini anlaman icin.
 

*siber*

0
İyinet Üyesi
Katılım
20 Temmuz 2005
Mesajlar
2,014
Reaction score
1
Konum
about:blank
haklısınız ışık hızı ile gönderemiyicem bu mailleri :) Tavsiye ettiğiniz işlemi iki makinadan yapıcam artık.

İyi çalışmalar.
 

iyinet

Root
Admin
Hosting Firması
Katılım
2 Eylül 2002
Mesajlar
5,028
Reaction score
66
Konum
Sakarya
*siber*' Alıntı:
haklısınız ışık hızı ile gönderemiyicem bu mailleri :) Tavsiye ettiğiniz işlemi iki makinadan yapıcam artık.

İyi çalışmalar.

Anlamamakta israr ediyorsun.
istersen 10 makina ile yap, bu sekilde yaptikca sorun yasarsin.
Kodunda sorun var, bu sekilde olmaz.
 

*siber*

0
İyinet Üyesi
Katılım
20 Temmuz 2005
Mesajlar
2,014
Reaction score
1
Konum
about:blank
iyinet' Alıntı:
Anlamamakta israr ediyorsun.
istersen 10 makina ile yap, bu sekilde yaptikca sorun yasarsin.
Kodunda sorun var, bu sekilde olmaz.


Ben o şekilde devam edicem demiyorum. update ve limit kullanıcam... ama tek db üzerinden yaparsam olmuyor işte onuda ben anlatamıyorum bir db ile mail gönderip atilanmesaj i update yapıcam, ikinci db ile de SELECT yapıcam. Eğer ben atılan mesajları gerçek db üzerinden update yaparsam. Herkesin mesaj sayısını yükseltmiş olurum ki o zamanda benim asıl mesaj atmak istediğim atilanmesaj<=3 ün hiç bir anlamı kalmaz.

PHP:
$tablo = mysql_query ("SELECT * FROM users where atilanmesaj<=3 ORDER BY id DESC LIMIT 0,50");


PHP:
$tablo = "UPDATE users SET atilanmesaj = '4' WHERE login = '$oku[login]' ";
$sorgu = mysql_query($tablo);

uygunmudur ?
 

zbahadir

0
İyinet Üyesi
Katılım
19 Mart 2006
Mesajlar
2,416
Reaction score
0
Konum
Trabzon
Benzer bir kod bende de var, kodu iyi yapamadığım için tek site olmasına rağmen p4 3GHz makineyi inanılmaz kasıyor.
 

iyinet

Root
Admin
Hosting Firması
Katılım
2 Eylül 2002
Mesajlar
5,028
Reaction score
66
Konum
Sakarya
*siber*' Alıntı:
Ben o şekilde devam edicem demiyorum. update ve limit kullanıcam... ama tek db üzerinden yaparsam olmuyor işte onuda ben anlatamıyorum bir db ile mail gönderip atilanmesaj i update yapıcam, ikinci db ile de SELECT yapıcam. Eğer ben atılan mesajları gerçek db üzerinden update yaparsam. Herkesin mesaj sayısını yükseltmiş olurum ki o zamanda benim asıl mesaj atmak istediğim atilanmesaj<=3 ün hiç bir anlamı kalmaz.

PHP:
$tablo = mysql_query ("SELECT * FROM users where atilanmesaj<=3 ORDER BY id DESC LIMIT 0,50");


PHP:
$tablo = "UPDATE users SET atilanmesaj = '4' WHERE login = '$oku[login]' ";
$sorgu = mysql_query($tablo);

uygunmudur ?

O zaman sana farkli bir yontem anlatayim.

1. Tum kullanici bilgilerini yeni bir tabloya at
CREATE TABLE users2email SELECT * FROM users;

2. atilan mesaj sayisini resetle
UPDATE users2email set atilanmesaj=0;

3. Script icindeki sorgunu asagidaki sekilde degistir (order by i cikarttim yavaslatir):
$tablo = mysql_query ("SELECT * FROM users2email where atilanmesaj=0 LIMIT 0,25");

4. Maili bu sekilde gonder:
$gonder = @mail($oku, $konu, $mesaj, $headers);[/B]

5. Mailin gonderim durumunu kontrol et
[B]if(true === $gonder) {[/B]
[B]echo "Gönderildi $oku[login] <br>\n"; [/B]
[B]$tablo = "UPDATE users2email SET atilanmesaj = 1 WHERE login = '$oku[login]' "; [/B]
[B]$sorgu = mysql_query($tablo); [/B]
[B]} else {[/B]
[B]echo "Gönderilemedi! $oku[login] <br>\n"; [/B]
[B]} [/B]

6. Bu kodu browserdan calistirma!, shell den calistir! Cron icine koy.
 

Caesar

0
İyinet Üyesi
Katılım
5 Haziran 2006
Mesajlar
1,894
Reaction score
7
en mantıklısını ogrenmek istiyorsan smtp ayarlarından maximum gonderebileceğin kullanıcıları 100 olarak belirle;
sadece 1 kere
PHP:
mail();
fonksiyonunu kullanarak 100 kişiye mail atmiş olabilirsin
mail1,mail2,mail3...mail100 şeklinde

limit 0,100 dersin bu 100 degeri
bir array içine yazdirirsin
daha sonra gidecek adrese 100 unu birden yaip tek mail fonksiyonu ile karbon kopya halinde 100 kişiye gondermiş olursun.
 

*siber*

0
İyinet Üyesi
Katılım
20 Temmuz 2005
Mesajlar
2,014
Reaction score
1
Konum
about:blank
Gösterdiğin yol için teşekkür ederim ama, ben şu kodlar ile devam etsem sanırım daha iyi olur. Çünkü bu kafayla dediklerini uygulamak daha zor olur benim için. Benim tek sorunum kaldı oda

PHP:
$tablo=mysql_query("select * from users where atilanmesaj<= '3' ORDER BY id DESC LIMIT 0,5");
while ($oku=mysql_fetch_assoc($tablo)) {
if ($oku[cins] == 1 & $oku[durum] == 1) {
$tablo = "UPDATE users SET atilanmesaj = '4' WHERE login = '$oku[login]' ";
$sorgu = mysql_query($tablo);
}
}

bu şekilde 5 veri alması gerekirken sadece 1 veri alıp sonra
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/site/public_html/site.php on line 22

while ($oku=mysql_fetch_assoc($tablo)) { şu satırda hata vermesi.
 

iyinet

Root
Admin
Hosting Firması
Katılım
2 Eylül 2002
Mesajlar
5,028
Reaction score
66
Konum
Sakarya
*siber*' Alıntı:
Gösterdiğin yol için teşekkür ederim ama. Ben şu kodlar ile devam etsem sanırım daha iyi olur. Çünkü bu kafayla dediklerini uygulamak daha zor olur benim için. Benim tek sorunum kaldı oda

PHP:
$tablo=mysql_query("select * from users where atilanmesaj<= '3' ORDER BY id DESC LIMIT 0,5");
while ($oku=mysql_fetch_assoc($tablo)) {
if ($oku[cins] == 1 & $oku[durum] == 1) {
$tablo = "UPDATE users SET atilanmesaj = '4' WHERE login = '$oku[login]' ";
$sorgu = mysql_query($tablo);
}
}

bu şekilde 5 veri alması gerekirken sadece 1 veri alıp sonra
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/site/public_html/site.php on line 22

while ($oku=mysql_fetch_assoc($tablo)) { şu satırda hata vermesi.

Cunku tablo degiskenini dongu icinde tekrar kullaniyorsun.
Su sekilde dene:
PHP:
$tablo=mysql_query("select * from users where atilanmesaj<= '3' ORDER BY id DESC LIMIT 0,5");
while ($oku=mysql_fetch_assoc($tablo)) {
if ($oku[cins] == 1 & $oku[durum] == 1) {
$tablo2 = "UPDATE users SET atilanmesaj = '4' WHERE login = '$oku[login]' ";
$sorgu = mysql_query($tablo2);
}
}
 

*siber*

0
İyinet Üyesi
Katılım
20 Temmuz 2005
Mesajlar
2,014
Reaction score
1
Konum
about:blank
Tüm sorunlar tamam. Fakat şuan tek sorunum

PHP:
$tablo=mysql_query("select * from users where atilanmesaj<= '2' ORDER BY id DESC LIMIT 0,25");

ORDER BY id DESC LIMIT in dengesiz veri çekmesi. gördüğünüz gibi 25 veri al diyorum ama ya 5 yada 6 tane veri alıyor. Bunun nedeni aldığı 25 satırın içinde atilanmesaj i sadece 2 nin üstünde olanları almasımıdır ? Eğer sorun bu ise atilanmesaj 2 olanları almamasını nasıl sağlarım. Yani aldığı 25 veridninde 2 mesaj üstünde olmasını nasıl yapabilirim ?

Not: Kafam çok karışık derdimi tam anlatamamış olabilirim.
 

Türkiye’nin ilk webmaster forum sitesi iyinet.com'da forum üyeleri tarafından yapılan tüm paylaşımlardan; Türk Ceza Kanunu’nun 20. Maddesinin, 5651 Sayılı Kanununun 4. maddesinin 2. fıkrasına göre, paylaşım yapan üyeler sorumludur.

Backlink ve Tanıtım Yazısı için iletişime geçmek için Skype Adresimiz: .cid.1580508955483fe5

Üst