Nasıl betik dilleri yuvalarını kullanabilirim?

4 Cevap php

Python, Perl ve PHP, tüm destek TCP stream sockets. Ama tam olarak nasıl ben sadece FTP erişimi değil makineye root erişimi var varsayarak, bir web sunucusu (Apache) tarafından çalıştırılan bir komut dosyası yuva kullanabilirim?

  1. Bir istemci belirli bir bağlantı noktasına bağlveığında, nasıl komut dosyası çağrılan olsun demek?

  2. Komut bağlantı süresi için "çalışan" Kalmak mı? (Saat olabilir)

  3. Yani script birden fazla "örneklerini" aynı vea çalışıyor olacak?

  4. O zaman nasıl bir yöntem çağrıları başka komut bir örneğinden yapılabilir?

4 Cevap

Betik dilleri Soketleri derlenen dillere tam olarak aynı şekilde kullanmaktadır.

1) komut dosyası genellikle açılır ve soket kullanır. Bu "çalışma" ya da soket tarafından "çağrılan" değil, ancak doğrudan kitaplıkları (genellikle işletim sistemi için doğal C API içine çağırarak) yoluyla kontrol eder.

2) Evet.

3) Şart değil. En modern betik langauges bir "script" uygulamasında çoklu prizler işleyebilir.

4) N ​​/ A 3'e bakın)


Söz ve yorumlarda değiştirmek yanıt düzenleyin:

Bu barındırılan bir sunucu bağlamında bu çalıştırmak için çalışıyoruz artık açıktır. Eğer Apache içinde komut dosyası veya benzer bir sunucu kullanıyorsanız, tipik olarak, işler biraz farklı çalışır. Bir yuva açtı ve Apache tarafından yapılmaktadır, ve işlemek için komut için ilgili verileri (POST / GET sonuçlar, vb) geçen, komut yürütür. Vb, CGI komut dosyası ile uğraşırken Yuva genellikle oyuna gelmez

Bununla birlikte, bu tipik olarak mod_cgi ile aynı kavramlar kullanılarak olur. Bu oldukça fazla komut çalışan bir yürütülebilir dosya kadar sunucu söz konusu olduğunda, ve yürütülebilir çıktı istemciye döndürülen olur ne başka bir şey olduğu anlamına gelir. Bu durumda, (izinleri ve sunucuda doğru kütüphaneleri olması koşuluyla), python komut aslında tamamen Apache bağlamı dışında kendi soket çalışır ayrı bir komut dosyası açabilirsiniz.

Ancak, doğrudan CGI komut dosyası içinde tam bir soket uygulamasını çalıştırmak için (genellikle) iyi bir fikir değil. Bu sonuçları istemciye döndürür önce CGI yürütülebilir tamamlanmasına çalıştırmak için beklemek olacaktır. Apache orada oturup bu tamamlamak için bekleyen biraz "askıda" olacak. Eğer tam bir sunucu başlatıyor ediyorsanız (onlar olma eğilimindedir uzun süren bir süreç, özellikle eğer), Apache komut dosyası kilitli olduğunu düşünüyorum, ve muhtemelen iptal, potansiyel süreci (yapılandırma belirli öldürme, ancak çoğu hosting şirketleri yapacak ) paylaşılan bir sistemde CPU devralarak komut önlemek için.

Eğer komut dosyası içinde yeni bir komut dosyası çalıştırmak ve ardından (CGI yürütülebilir kapatılıyor) dönmek Ancak, diğer komut bir sunucu olarak çalışan, çalışan bırakılabilir. Bu (subprocess kütüphanesini kullanarak, piton örnek) gibi bir şey olurdu:

newProccess = Popen("python MyScript", shell=True)

Yukarıdaki tüm gerçekten olsa, sunucu yapılandırmasına biraz bağlı olduğunu unutmayın. Birçok hosting şirketleri özellikle bu önlenmesi için kendi scripting uygulamalarında soket veya kabuk kütüphanelerin bazılarını yok, bu yüzden sık sık ek olarak C. yürütülebilir hale dönmek zorunda, bu en hosting firmaları için hizmet açısından karşı genellikle - kendini kontrol etmek olurdu.

Bir önceki cevap belirttiği gibi, betik dilleri derlenmiş programları tam olarak aynı şekilde bu konuda faaliyet var. Onlar (potansiyel olarak) farklılık nerede kullanmak API olduğunu. Işletim sistemi (Windows veya Unix tabanlı) bir API (örneğin, BSD sockets) derlenmiş programlar (genellikle) doğrudan arayacak sunuyor. PHP veya Python gibi yorumlanır diller gibi Python'un socket API yatan API bazı bölümlerini basitleştirmek olabilecek gibi farklı bir API sunabilir.

Bu API'ler herhangi gelen bir TCP bağlantısının fiili işleme yapılandırılmış edilebileceği pek çok yolu vardır. Bu tür yaklaşımların bir büyük ve detaylı bir bakış c10k web sayfasında mevcuttur: http://www.kegel.com/c10k.html - özellikle, ilgili bölüm IO strategies. Kısacası, sizin soruya cevap seçimi programcı kadar ve çıkan program yük altında nasıl etkileyebilir.

Özel sorulara odaklanmak:

  1. Birçok sunucu programları başladı before bağlantısı ve gelen bağlantıları dinlemek için çalışıyor. Bir özel durum bir superserver olduğunu inetd: bu bağlantıları dinler ve sonra (bir yapılandırma dosyasında belirtilen) başlar programlara bu bağlantıları ellerini.
  2. Tipik olarak, evet, komut bağlantı süresi için çalışan kalır. Ancak, büyük sistem mimarisi bağlı olarak, komut makul kullanım ve daha sonra çıkış için başka bir programa kapalı bağlantıyı geçebileceği.
  3. Bu c10k sayfada numaralandırılmış olarak tekrar, bir seçimdir.
  4. Bu başka bir seçimdir; işletim sistemleri programlara Interprocess Communication (IPC) mekanizmaları sunuyoruz.

Eğer inetd ya da "servis tek bir istemci" Belirli bir dinleme bağlantı noktası için bir program çağırmak için yapılandırılmış benzer bir meta-sunucu kullanırsanız, ben size soruyoruz ne mantıklı tek yolu, uzak istemci için "tek istemci servicer" programın stdin / stdout yönlendirme.

Bu durumda eğer:

1) inetd çalıştırır

2) evet

3) evet

4) named pipes bir olasılık vardır

When a client connects to a specific port, how does the script file get invoked?

Komut dosyası zaten herhangi bir istemciden herhangi CONNECT almak için çağrılması gereken. Bunu zaman aşımı onu öldürmek için değil (Infinie döngü) ve kurulum Apache sonsuza kadar orada asılı olması komut gerekir. Temelde, PHP sunucu uygulamaları yazma için iyi bir seçim değildir. Neden bu ihtiyacı var?