2011-08-12 25 views
6

Temel olarak, PHP'nin bir "web sunucusu" dan nasıl çağrılabileceğini anlamaya çalışıyorum.Sanal/özel "web sunucusu" dan PHP'yi çağırın.

Belgeleri okudum, ancak çok yardımcı olmadı.

Bildiğim kadarıyla söyleyebilirim, PHP çağırmak için üç yol vardır: komut satırında (örn: php -f "/path/to/script.php") üzerinden

  • FastCGI yoluyla CGI aracılığıyla
  • (??)/(???) bir web sunucusu (ör: Apache) üzerinden
  • modül

Yani CGI ile başlayalım. Belki sadece körüm, ancak spec, web sunucusunun, CGI'yi uygulayan veriye veriyi (header & geri aramalar) nasıl geçtiğini söylemez. Durum FastCGI ile daha da kötü.

İleriye kadar, sunucuya özgü modüllerimiz var; bu, tüm potansiyellerin hiçbir yerde bitmediği için ne arayacağımı bile bilmiyorum.

+1

Kodu okumanızı düşündünüz mü? Sorunuzdaki tüm bu şeyler açık kaynak. –

+0

@Dan Şu an bunu yapmak için * deniyorum *. Ancak birkaç nedenden dolayı zorluyor: ** (1) ** Tüm kodu bulamıyorum ** (2) ** kod c/C++ 'dir (3) ** kod çok eski ve/veya dağınık. – Christian

+0

@Dan kim diyor ?? İsterseniz (veya planladığım FPC) Assembler veya ADA'da yapabilirim. – Christian

cevap

7

CGI betiği çağırmak oldukça basittir. PHP birkaç özellikleri vardır, ancak temelde sadece o çağrı kurulumu PHP CGI ortam değişkenleri listesi lazım:

setenv GATEWAY_INTERFACE="CGI/1.1" 
setenv SCRIPT_FILENAME=/path/to/script.php 
setenv QUERY_STRING="id=123&name=title&parm=333" 
setenv REQUEST_METHOD="GET" 
... 

exec /usr/bin/php-cgi 

Çoğu klişe vardır. SCRIPT_FILENAME, gerçek php dosya adını, exec parametresi olarak değil, PHP yorumlayıcısına nasıl iletirsiniz. PHP için önemli olan, standart olmayan REDIRECT_STATUS=200 değişkenidir.

Bir GET isteği için yalnızca ortam değişkenlerine gereksinim duyarsınız. Bir POST isteği için, HTTP istek gövdesini yürütülen php-cgi binary'sine stdin olarak pipetleyebilirsiniz. Geri verilen stdout, tamamlanmamış bir HTTP üstbilgisinden, \ r \ n \ r \ n ve sayfa gövdesinden oluşan CGI yanıtıdır.

(Sadece bellekten. Belki birkaç tane daha yakalama var.)

+0

OH. Bu her şeyi açıklıyor. – Christian

+0

Sorunla karşı karşıya geldikten sonra, PATH_INFO ve SCRIPT_PATH değişkenlerini açıkça doldurmanız gerekiyor. Ayrıntılar için lütfen [sorum] (http://stackoverflow.com/questions/18962960) adresini kontrol edin. – Andrey

1

FastCGI o kadar akıllıca kullanıldığı beri, bu (örneğin, daha sonra Ruby düşebilir) size dil bağımsızlığını verecekti ve lotsofexamples ile well documented var muhtemelen en iyi seçenektir.

Gerçekten isterseniz, kendi Server API yazabilirsiniz, ancak FastCGI uygulamaktan daha zor ve çeşitli dezavantajları vardır.

Düzgün CGI ile uğraşmazdım, FastCGI bir nedenden dolayı var.

+0

Tamam, web sunucusu PHP ile PHP'yi nasıl çalıştırabilir? yerel (geridöngü) bağlantı? – Christian

+0

@Christian farklı bir ana bilgisayarda (isteğe bağlı bir TCP/IP bağlantısı) veya bir unix borusunun diğer ucunda olabilir. Bağlantımdaki özellikleri oku, oldukça açık bir şekilde yazılmış. –

+0

Birkaç saat uyuduktan sonra iyi bir görünüm vereceğim. Saat 2:30 'da:/ – Christian

İlgili konular