Windows üzerinde PHP çatallamak

3 Cevap php

Biz (aslında pek çok sorunun kaynağı, ama göç şu anda bir seçenek değildir) bir Windows sunucu üzerinde PHP yayınlanıyor. Bir kullanıcı tarafından başlatılan eylem gibi bir e-posta kapalı gönderme veya emin bazı yapma gibi kullanıcı da başarılı olmadığını bilmek gerekir ya da başarısız değil ve hangi zaman alacak bir kaç şey, tekmelemek için gereken bir kaç nokta vardır Üçüncü taraf hesaplar güncellenir. Ben sadece pcntl_fork() ile çatal olsaydı, bu çok basit olurdu, ama PCNTL işlevleri Windows mevcut değildir.

Ben alabilirim yakın bu tür bir şey yapmak gibi görünüyor:

exec( 'php-cgi.exe somescript.php' );

Ancak, bu çok daha karmaşık olacaktır. Ben başlaması gereken eylemler zaten çalışan sürecinde mevcut olacak bağlamda bir çok güveniyor; Yukarıdaki örnek kullanmak için, ben gerekli verileri anlamaya ve bir şekilde yeni komut bunu temin etmek gerekir. Ben çatal olsaydı, sadece, ana süreç erken dönmek icar bir kaç daha fazla şeyler üzerinde çalışmak için çocuk bırakarak meselesi olurdu.

Windows üzerinde derlenmiş çeşitli PCNTL işlevleri almak kendi çalışmaları hakkında konuşurken birkaç kişi bulduk, ama hiçbiri kullanılabilir bir şey (kırık bağlantılar, vb) var gibiydi.

this question benim gibi hemen hemen aynı adı olmasına rağmen, bu sorun çatala gerek daha infaz zaman aşımı oldu gibi görünüyor. Yani, php-cgi çağrı ile başa çıkmak için sadece biraz refactor benim en iyi seçenek olduğunu, ya da diğer seçenekler vardır?

Düzenleme: exec() bu çağrı dönene kadar bekler gibi, en azından bana bunu diğer bazı yönünü bulmaktan olmadan, bunun için çalışmaz gibi görünüyor. Ben tür exec( 'start php-cgi.exe somescript.php' ); gibi START diye düşündüm, ancak diğer komut bitene kadar o hala bekler.

3 Cevap

nasıl installing psexec ve kullanımı hakkında -d (beklemek yok) option

exec('psexec -d php-cgi.exe somescript.php');

PSExec alın ve komutu çalıştırın:

exec("psexec -d php-cgi.exe myfile.php");

(Örn. e-posta gönderme) kod çalıştırmak için bir daemon / arka plan işlemi oluşturabilir ve istek sadece kuyruğa öğeler eklemek gerekir, deamon ağır kaldırma yapalım.

Örneğin, dosya send_emails.bat,

cls
C:\PHP533\php.exe D:\web\server.php
exit

açık pencereler görev zamanlayıcı, ve yukarıda send_emails.bat her 30 dakikada bir çalışacak var. Yalnızca bir örnek bir zamanda çalışır veya katları her görevi çalıştırmak, ya da iki kez, her e-posta göndermek olabilir emin olun. Ben bir şey (bellek sorunları, veritabanı kullanılamaz, vb) geçici olarak keser durumda 30 dakika, oldukça sadece durur bir hiç bitmeyen bir süreç olan daha her 30 dakikada bir yeniden başlayacaktır söylüyorlar. Aşağıdaki bir iskelet daemon değil ... tam veya ben sadece bir örnek üzerinden yazıyorum test:

<?php
set_time_limit(60*30); // don't run
$keepgoing = true;
$timeout = time()+ 60*29; // 29 minutes

while(time() < $timeout)
{
    // grab emails from database
    $result = $db->query('select subject, body, to_email FROM email_queue');
    if($result->num_rows == 0)
    {
        sleep(10); // so we are not taxing the database 
    }
    else
    {
        while($row = $result->fetch_assoc())
        {
        // send email
        }
    }
}
exit;
?>

Son olarak sadece bir veritabanında kuyruğuna öğe eklemek ve cini ağır kaldırma halledeyim isteği gerekir.

$db->query('insert into email_queue(to,subject,body) values ('customer@email.com','important email','<b>html body!</b>');