php işlem bölme ve çocuk süreç kimliği almak

3 Cevap php

Objective: My script will download a remote file upon form submission, since the file might be big, I would like to fork off a process and let the user go on with his/her life.

Bir komut örneği:

wget-q - limit-rate = 1k - çalışır = 10 "http://helios.gsfc.nasa.gov/image_euv_press.jpg"-O / web / varlık / content / image / image_euv_press.jpg

Yöntem çalıştı:

  1. PCNTL çatallaşma,

        $pid = pcntl_fork();
    
    
    
    if ( $pid == -1 ) {
        exit;
    } else if ( $pid ) {
        //We are the parent process, the pid is child pid right?
    
    
        return $pid;
    } else {
        // We are the child process
    
    
        exec($command.' > /dev/null');
        // > /dev/null &
    
    
        posix_kill(getmypid(),9);
        return;
    }
    

Ben PID olsun ama o riski ben nginx kullanıyorum çünkü çatallı süreç zombi haline gelir ve bu var -> php-fpm (test edilmiş ve geçersiz php-fpm süreçlerin bir sürü birkaç kez çalıştıran üzerine, teyit), ben olurdu Sadece zombi ortadan kaldırmak için sunucuyu yeniden başlatmanız, bu tükenme saldırıyı PID beni bırakacaktı? (Ben tahmin ediyorum)

  1. Arka plan işlemi:

            exec($command . ' > /dev/null &');//background process
        $proc = passthru ("ps aux | grep '$command'");//search for the command
        echo var_dump($proc);
        $pid = (int)(next(explode(' ',$proc)));//parse the pid (not implemented)
    

Question: the background process method works but it's not clean, is there a better way to fork off a process to download and get that wget command PID so I can kill it later?.

Ben $ yankılanan denedim! sadece PID ama exec ('echo $!') bir şey çıkmıyorsa almak için exec yaptıktan sonra, ben her exec farklı bir "boşluk" olduğunu çünkü düşünüyorum

I '> / dev / null 2> / dev / null &' eklendi Benim terminalde komutun sonuna gibi bir şey dönecekti: [3] 30751, ama php exec yoluyla, bu PID döndü yakalamak için hiçbir yolu yoktur.

Teşekkür ederim.

3 Cevap

Aşağıdaki komutu deneyin:

exec("ps -C $command -o pid=", $pids);

Ama bu hedefler için varolduğu, Zend Server Job Queue kullanmanızı öneririz.

Değil doğrudan bir yanıt olsa da, aşağıdaki bağlantı bunu halletmek yardımcı olabilir:

PHP'nin pctl işlevlerine bir alternatif olarak, kullanabilirsiniz Gearman,

Gearman iyi işi yapmak için uygun diğer makina veya işlemlere çalışmalarını çiftliğine genel bir uygulama çerçeve sağlar. Bu denge işleme yüklemek için, paralel işi yapmak için, ve diller arasındaki işlevleri çağırmak için izin verir. Bu yüksek kullanılabilirlik web sitelerinden veritabanı çoğaltma olaylarının ulaşım, çeşitli uygulamalarda kullanılabilir.

Eklemeyi deneyin "echo $!" başlatılan arka plan işlemi olarak aynı yürütme akışı.

I.e. something like this: shell_exec("$command & echo $!");