PHP: pcntl_fork () gerçekten ne yapar?

4 Cevap php

PHP's pcntl_fork function is supposed to fork a process just as the standard fork function in C.
But I was wondering if this function really forks the process or if it emulates that behavior in a different way.
If it really forks the process then it's clear which process that is: one of Apache's child processes.
That's OK as long as Apache is using the prefork MPM (i.e. one process per request).
But what does happen if Apache is using the worker MPM??
When the worker MPM is being used, every Apache child process contains many threads, each one handling a different HTTP request. So if you would fork the process under that situation I can't even think what would happend to all those threads and requests being served.
So if pcntl_fork() really forks the process then I think it's not a good idea to use this function if you set Apache to use the worker MPM.

Uzmanlar ne diyor? Ben de akıl muyum, yoksa sadece saçma konuşuyorum?

4 Cevap

O anki süreç, C işlevi çatal yapar aynı şekilde çatallar: bunu düşünüyorum gibi pcntl_fork muhtemelen çalışır:

The pcntl_fork() function creates a child process that differs from the parent process only in its PID and PPID.
Please see your system's fork(2) man page for specific details as to how fork works on your system.


But, quoting the
Introduction of the Process Control section of the manual :

Process Control support in PHP implements the Unix style of process creation, program execution, signal handling and process termination.
Process Control should not be enabled within a web server environment and unexpected results may happen if any Process Control functions are used within a web server environment.

Yani, aslında Apache yoluyla yürütülen bir PHP komut dosyası bu fonksiyonu kullanmak gerekir: PHP komut komut satırından çalıştırıldığında yalnızca kullanılmalıdır.


And, before starting to use that function, don't forget that :

Note: This extension is not available on Windows platforms.

It is not possible to use the function pcntl_fork when PHP is used as Apache module. You can only use pcntl_fork in CGI mode or from command-line.
Using this function will result in:

Ölümcül hata: tanımlanmamış işlev çağrısı: pcntl_fork ()

PHP (Ben de PHP kılavuzunda belirtilen yerde olduğunu düşünüyorum) ÅŸan değil, çünkü, ilk etapta işçi MPM için yapılandırılmış bir Apache yüklemesinde bir modül olarak PHP çalıştırmak için iyi bir fikir değil.

Evet, süreci çatal gerekir. PHP manual bile ayrıntılı talimatlar için man fork(2) okumak gerektiğini belirtiyor, bu yüzden muhtemelen C çatal işlevi etrafında sarıcı bulunuyor.

Update: Here's the relevant page in the PHP manual for worker MPM: http://php.net/install.unix.apache2.php

Not: Apache bir okuyuculu sürümünü oluşturmak için, hedef sistem konuları desteklemesi gerekir. Bu durumda, PHP de deneysel Zend Thread Safety (ZTS) ile inşa edilmelidir. Bu yapılandırma kapsamında, bütün eklentiler mevcut olacak. Önerilen ayar varsayılan prefork-Modülü ile Apache inşa etmektir.

I also found this page with some further instructions: http://www.stevekallestad.com/blog/apache_worker_mpm_with_php.html

Ben sadece garip bir durum çatal bir çocuk süreç sonrasında, ana ortaklığın, çocuğa standart çıkışı (tarayıcı) vermek olduğunu, pcntl_fork üzerinden apache kullanmaya çalıştık. Yani, görüntü, tarayıcı ana süreçten çıkış alırsınız cann't alabilirsiniz.