İstemci tarafı ile sunucu tarafı programlama arasındaki fark nedir?


498

Bu kodu var:

<script type="text/javascript">
    var foo = 'bar';
    <?php
        file_put_contents('foo.txt', ' + foo + ');
    ?>

    var baz = <?php echo 42; ?>;
    alert(baz);
</script>

Bu neden metin dosyasına "bar" yazmıyor, "42" uyarısı veriyor?


Not: Bu sorunun daha önceki düzeltmeleri sunucudaki PHP ve istemcideki JavaScript ile ilgili idi. Sorunun ve çözümlerin temel doğası, biri istemcide diğeri sunucuda çalışırken (aynı dil olsalar bile) herhangi bir dil çifti için aynıdır. Belirli diller hakkında konuşurken cevaplar gördüğünüzde lütfen bunu dikkate alın.

Yanıtlar:


460

Kodunuz, sunucu tarafı ve istemci tarafı olmak üzere tamamen ayrı iki kısma ayrılmıştır .

                    |
               ---------->
              HTTP request
                    |
+--------------+    |    +--------------+
|              |    |    |              |
|    browser   |    |    |  web  server |
| (JavaScript) |    |    |  (PHP etc.)  |
|              |    |    |              |
+--------------+    |    +--------------+
                    |
  client side       |      server side
                    |
               <----------
          HTML, CSS, JavaScript
                    |

İki taraf HTTP istekleri ve yanıtları aracılığıyla iletişim kurar. PHP sunucuda yürütülür ve HTML'nin yorumlandığı ve JavaScript'in yürütüldüğü istemciye yanıt olarak gönderilen bazı HTML ve belki de JavaScript kodu verir. PHP yanıt vermeyi tamamladığında, komut dosyası sona erer ve yeni bir HTTP isteği gelene kadar sunucuda hiçbir şey olmaz.

Örnek kod şu şekilde çalışır:

<script type="text/javascript">
    var foo = 'bar';
    <?php
        file_put_contents('foo.txt', ' + foo + ');
    ?>

    var baz = <?php echo 42; ?>;
    alert(baz);
</script>

Adım 1, PHP <?php ?>etiketler arasındaki tüm kodu yürütür . Sonuç şudur:

<script type="text/javascript">
    var foo = 'bar';

    var baz = 42;
    alert(baz);
</script>

file_put_contentsÇağrı şey yol açmamıştır, sadece bir dosya içine "+ foo +" yazdı. <?php echo 42; ?>Çağrı bu kod eskiden noktada artık çıkışı "42", sonuçlandı.

Sonuçta ortaya çıkan bu HTML / JavaScript kodu artık istemciye gönderilir ve burada değerlendirilir. alertEderken çağrı işleri foodeğişken yerde kullanılmaz.

İstemci JavaScript'ten herhangi birini yürütmeye başlamadan önce tüm PHP kodu sunucuda yürütülür. Yanıtta JavaScript'in etkileşimde bulunabileceği PHP kodu kalmadı.

Bazı PHP kodlarını aramak için, istemcinin sunucuya yeni bir HTTP isteği göndermesi gerekir. Bu, üç olası yöntemden birini kullanarak gerçekleşebilir:

  1. Tarayıcının yeni bir sayfa yüklemesine neden olan bir bağlantı.
  2. Verileri sunucuya gönderen ve yeni bir sayfa yükleyen bir form gönderme.
  3. Bir AJAX bir JavaScript tekniği olduğu istek, (1. ve 2. olacak gibi), ancak mevcut sayfadan ayrılmadan sunucuya düzenli HTTP isteği göndermek için.

İşte bu yöntemi daha ayrıntılı olarak açıklayan bir soru

Ayrıca tarayıcının yeni bir sayfa açmasını sağlamak için window.location1. veya 2. olasılıkları taklit eden bir form kullanarak veya göndererek JavaScript'i kullanabilirsiniz .


1
Ayrıca ikinci sayfayı kullanarak window.openiframe kullanabilir veya iframe kullanarak sayfa yükleyebilirsiniz.
jcubic

İletişim yöntemleri listesine WebSockets eklemeye değebilir.
Quentin

Diyelim ki açılır değerler jquery üzerinden güncellenir. Kullanıcı adım 2 yaptığında "Gönder" düğmesi aracılığıyla sunucuya veri gönderir ve yeni bir sayfa yükleyen bir form gönderme, jquery güncellenen değerleri php bir denetleyiciye geçirilebileceğini? Yoksa jquery ile dom eklendi beri php görünür olmaz mı? @deceze
FabricioG

@Fabricio Verilerden bir HTTP isteği oluşturulur <form>ve sunucuya gönderilir. Formları, farklı veriler içermeleri için Javascript kullanarak değiştirebilirsiniz. Evet, form gönderilirken formun düzgün bir parçasıysa, bu veriler ortaya çıkan HTTP isteğinin bir parçası olacaktır; orijinal HTML'de olması veya daha sonra Javascript yoluyla eklenmesi önemli değildir.
deceze

163

PHP kodunun neden JavaScript kodunda çalışmadığını belirlemek için , istemci tarafı ve sunucu tarafı dillerinin ne olduğunu ve nasıl çalıştıklarını anlamamız gerekir .

Sunucu tarafı diller (PHP vb.) : Veritabanlarından kayıtları alır, durum bilgisi olmayan HTTP bağlantısı üzerinden durumu korur ve güvenlik gerektiren birçok şey yaparlar. Sunucuda bulunurlar, bu programların hiçbir zaman kaynak kodları kullanıcıya maruz kalmaz.

Wikipedia_http: //en.wikipedia.org/wiki/Dosya: Scheme_dynamic_page_en.svg görüntü attr

Böylece sunucu tarafı dillerinin HTTP isteklerini işlediğini ve işlediğini kolayca görebilirsiniz ve @deceze'in dediği gibi PHP sunucuda yürütülür ve bazı HTML ve istemciye yanıt olarak gönderilen JavaScript kodunu çıkarır ; HTML yorumlanır ve JavaScript yürütülür.

Öte yandan, İstemci Tarafı Diller (JavaScript gibi) tarayıcıda bulunur ve tarayıcıda çalışır. İstemci tarafı komut dosyası oluşturma, genellikle web'de, istemci tarafı yerine sunucu tarafı yerine kullanıcının web tarayıcısı tarafından yürütülen bilgisayar programı sınıfını belirtir .

JavaScript kullanıcı tarafından görülebilir ve kolayca değiştirilebilir, bu nedenle güvenlik öğeleri için JavaScript'e güvenmemeliyiz.

Bu nedenle sunucuda bir HTTP isteği yaptığınızda, sunucu yürütülmesi gereken herhangi bir görev olup olmadığını görmek için önce PHP dosyasını dikkatlice okur ve istemci tarafına bir yanıt gönderir. Yine @deceze'in dediği gibi, * PHP yanıt vermeyi bitirdikten sonra komut dosyası sona erer ve yeni bir HTTP isteği gelene kadar sunucuda hiçbir şey olmaz . *

Grafiksel gösterim

Görüntü kaynağı

Şimdi PHP'yi aramam gerekirse ne yapabilirim? Bunu nasıl yapmanız gerektiğine bağlıdır: sayfayı yeniden yükleyerek veya AJAX çağrısı kullanarak.

  1. Bunu sayfayı yeniden yükleyip bir HTTP isteği göndererek yapabilirsiniz
  2. JavaScript ile AJAX çağrısı yapabilirsiniz - bu sayfanın yeniden yüklenmesi gerekmez

İyi okuma:

  1. Wikipedia: Sunucu tarafı komut dosyası oluşturma
  2. Wikipedia: İstemci tarafı komut dosyası oluşturma
  3. Madara Uchiha: İstemci tarafı ve sunucu tarafı programlama arasındaki fark

30

Javascript'iniz sunucuda değil istemcide yürütülür. Bu foosunucu tarafında değerlendirilmediğinden değeri sunucudaki bir dosyaya yazılamaz.

Bu işlemi düşünmenin en iyi yolu, dinamik olarak bir metin dosyası oluşturuyormuşsunuzdur. Oluşturduğunuz metin, tarayıcı tarafından yorumlandıktan sonra yürütülebilir kod haline gelir. <?phpSunucuda yalnızca etiketler arasına koyduğunuz değer değerlendirilir.

Bu arada, HTML veya Javascript'e rastgele PHP mantığı parçaları yerleştirmeyi alışkanlık haline getirmek ciddi şekilde kıvrımlı koda yol açabilir. Acı veren deneyimlerden söz ediyorum.


3
Buradaki cevabınız, / tercümandan bahsedildiği için dikkat çekicidir. Bununla birlikte, javascript bir sunucu ortamında derlenebilir ve çalıştırılabilir ve bir sunucu tarafından da birbirine eklenebilir.
Brett Caswell

3

Web uygulamasında her görev bir istek ve yanıt biçiminde yürütülür.

İstemci tarafı programlama Java komut dosyası ve çerçeveleri ile html kodu ile, kütüphaneler internet explorer, Mozilla, krom tarayıcılar yürütür. Java senaryosunda sunucu tarafı programlama sunucuları Tomcat'te çalıştırılır, web-mantık, j boss, WebSphere severs

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.