PHP Multi Process Asenkron Dosya Çalıştırma

Şimdi bildiğiniz gibi PHP’de kodların hepsi execute olduktan sonra sayfada gösterilir. Yani hepsi bitmeden işlem sonuçlanmaz. Bazı durumlar vardır ki, bunun böyle olmasını istemezsiniz. Örnek vermek gerekirse, bir e-posta bülten listeniz olsun. Ve bir konu paylaştıktan sonra atıyorum 5000 kişilik listeye e-posta göndereceksiniz.

Eğer bunu postu paylaşır paylaşmaz yaparsanız mailler gönderilene kadar sayfada bir bekleme süresi olacak. Ancak bizim istediğimiz, bunu arkaplan’da çalıştırarak göndermek. Aslında bunun için çok basit bir şey yazacağız. Öncelikle mailleri gönderecek php dosyasını oluşturalım. Örneğin send-email.php olsun.

<?php

sleep(5); // 5 sn sonra çalış

$postId = $argv[1];
// .. mail gönderme işlemleri vs.

?>

Şimdi postu yayınladıktan sonra şu kodu çalıştırmamız yeterli olacak;

exec('php -f send-email.php -- "5" > /dev/null 2>&1 &');

Burada tabi doğru dosya yolunu vermek önemli. Bu şekilde kodumuz çalıştığında send-email.php’deki 5 saniye bekleme kısmı mevcut sayfaya yansımayacaktır. Biz konumuzu oluşturmuş ve beklemeden işlem yapmaya devam ederken arkaplanda mailler gitmeye devam edecektir. Ayrıca dikkat ettiyseniz send-email.php’ye parametre gönderdik exec() komutu içinde. Gelen parametreleri $argv değişkeninde tutuluyor. 0 indexli olan değer dosyanın adı o yüzden 1’den başlayarak kullanın.

Birden fazla parametre göndermek isterseniz;

exec('php -f send-email.php -- "5" "tayfun erbilen" "deneme" > /dev/null 2>&1 &');

şeklinde gönderebilirsiniz. send-email.php’de $argv[1] $argv[2] $argv[3] şeklinde değerlere ulaşabilirsiniz.

Not: exec() fonksiyonu genelde hostinglerde güvenlikten dolayı kapalı oluyor. Bu yüzden kendi sunucunuzu kullanmaya çalışın, zaten hosting nedir allah aşkına? Boşverin onları 🙂

Kolay gelsin.

Yazar: Tayfun Erbilen

2009'dan beri web işleriyle uğraşan, aynı zamanda amatör müziklede ilgilenen sıradan birisi..

“PHP Multi Process Asenkron Dosya Çalıştırma” için 13 yorum

  1. Merhaba Tayfun abi,
    Projelerimde kullanabileceğim güzel bir bilgi verdiniz çok teşekkür ederim.
    Birşey merak ettim “zaten hosting nedir allah aşkına? ” dediniz ya bunun bir sebebi varmı? örneğin ben müşterilerim için reseller aldım onu kullanıyorum. Dezavantajı varmı merak ettim siz böyle deyince 🙂

    1. Ya kurumsal siteler vs. için reseller alıp kendin yönetirsen sunucunu sorun olmaz. Ama kendi projelerin vs. için cloud server alıp istediğin gibi optimize edip istediğin eklentileri vs. yükleyip kişiselleştirebilirsin. Öbür türlü bir şey için hosting aldığın yere başvuracaksında onlar yapacakta biraz saçmalık yani 🙂

  2. exec fonksiyonu dediğin gibi hosting firmaları kapatıyor. Alternatif olarak bekleme süresi olmasın diye arkaplanda ajax ile dosyaya istekte atılabilir. Ben bu şekilde kullanıyorum ama hangisi performanslıdır tabi ölçmek lazım

    1. Yok vehbi, ajax isteğini atsan bile sleep(25); yazdığında 25 saniye bekliyorsun çünkü ajax’ta tek thread’de çalışıyor. Aslında bu herhalde multi processing’e giriyor. Bekleme yapmadan birden fazla işlem yapmanı sağlıyor. Yani bunu ajax ile yapman mümkün görünmüyor.

  3. Merhaba, Yukarida yazdiginiz kodun multi threading ile uzaktan yakindan alakasi yok exec yeni bir process acar thread degil. Threading destegi icin lutfen Thread clasini ve unix pthreadlarini inceleyin.
    Yukaridaki kodun yaptigi sey bir process swapn edip girilen shell komutunu calistirmak. Shell komutu da calistiktan sonra en sonda & icerdigi icin background moduna geciyor. Thread ve process cok cok farkli seyler tekrar ediyorum ve yukaridaki kodun optimizasyonu icin cpu cekirdek sayisi vs de goz onune alinmali.

    1. teşekkür ederim, bende bu konuda bir yanlışlık olduğunun farkındaydım stackoverflow’da bazıları multi threading ararken bu şekilde cevaplar verdiği için bende de kafa karışıklığı oldu ^^

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.