Groups | Search | Server Info | Login | Register


Groups > dk.edb.internet.webdesign.serverside.php > #7201

Re: .net til php

From "Dennis Munding" <nospa@mplease.dk>
Subject Re: .net til php
Newsgroups dk.edb.internet.webdesign.serverside.php
References <5d2b35ac$0$705$14726298@news.sunsite.dk> <qipnvq$1qig$1@gioia.aioe.org>
Date 2019-10-04 15:40 +0000
Message-ID <5d976806$0$705$14726298@news.sunsite.dk> (permalink)
Organization SunSITE.dk - Supporting Open source

Show all headers | View raw


Arne Vajhøj wrote:

> On 7/14/2019 10:01 AM, Dennis Munding wrote:
> > Har fået flg. forespørgsel:
> > 
> > "I .net hedder de application.
> > 
> > Application ("test") = "blabla"
> > 
> > Du gemmer blabla i test når siden starter.
> > 
> > Alle steder, alle brugere kan så tilgå den application
> > 
> > Findes den i PHP ?"
> > 
> > Jeg foreslog at bruge enten globals eller super globals, men spørger
> > påstår, at det ikke virker...
> > 
> > Har php virkelig ikke noget tilsvarende?
> 
> Du har allerede fået flere svar, men lad mig alligevel prøve
> at forklare lidt. Det bliver en lidt lang post men der er mange
> aspekter af spørgsmålet.
> 
> Først begreber:
> 
> session = container (dictionary/map/associativt array med
> keys og values) med en instans per user session
> (identificeret ved session id)
> 
> application = container (dictionary/map/associativt array med
> keys og values) med en enkelt instans for hele applikationen
> 
> Får både session og application gælder det at de er ret simple
> for en enkelt server, men at det bliver kompliceret med et
> cluster hvor man vil dele dem mellem serverne.
> 
> De er begge ret bredt supporteret under disse navne.
> 
> ASP classic demo:
> 
> <%
> if IsEmpty(Session("V")) then
>     Session("V") = 1
> Else
>     Session("V") = Session("V") + 1
> End If
> if IsEmpty(Application("V")) then
>     Application("V") = 1
> Else
>     Application("V") = Application("V") + 1
> End If
> %>
> Session = <%=Session("V")%>
> <br>
> Application = <%=Application("V")%>
> 
> ASP.NET demo:
> 
> <%@ Page Language="C#" Inherits="Test.Test" %>
> Session = <asp:label id="sessionV" runat="server"/>
> <br>
> Application = <asp:label id="applicationV" runat="server"/>
> 
> og code behind:
> 
> using System;
> using System.Web.UI;
> using System.Web.UI.WebControls;
> 
> namespace Test
> {
>     public partial class Test : Page
>     {
>         protected Label sessionV;
>         protected Label applicationV;
>         public void Page_Load(Object src, EventArgs e)
>         {
>             if(Session["V"] == null)
>             {
>                 Session["V"] = 1;
>             }
>             else
>             {
>                 Session["V"] = (int)Session["V"] + 1;
>             }
>             if(Application["V"] == null)
>             {
>                 Application["V"] = 1;
>             }
>             else
>             {
>                 Application["V"] = (int)Application["V"] + 1;
>             }
>             sessionV.Text = Session["V"].ToString();
>             applicationV.Text = Application["V"].ToString();
>         }
>     }
> }
> 
> JSP demo (både uden og med EL):
> 
> <%
> if(session.getAttribute("V") == null) {
>     session.setAttribute("V", 1);
> } else {
>     session.setAttribute("V", (Integer)session.getAttribute("V") + 1);
> }
> if(application.getAttribute("V") == null) {
>     application.setAttribute("V", 1);
> } else {
>    application.setAttribute("V",
> (Integer)application.getAttribute("V") + 1); }
> %>
> Session = <%=session.getAttribute("V")%>
> <br>
> Application = <%=application.getAttribute("V")%>
> <br>
> Session = ${sessionScope['V']}
> <br>
> Application = ${applicationScope['V']}
> 
> JSF facelet demo:
> 
> <html xmlns="http://www.w3.org/1999/xhtml"
>       xmlns:h="http://java.sun.com/jsf/html"
>       xmlns:f="http://java.sun.com/jsf/core">
> <h:head>
> <f:event type="preRenderView" listener="#{testBean.check}"/>
> </h:head>
> <h:body>
> <f:view>
> Session: <h:outputText value="#{sessionScope['V']}"/>
> <br/>
> Application: <h:outputText value="#{applicationScope['V']}"/>
> </f:view>
> </h:body>
> </html>
> 
> og backing bean:
> 
> package test;
> 
> import java.util.Map;
> 
> import javax.faces.bean.ManagedBean;
> import javax.faces.bean.RequestScoped;
> import javax.faces.context.FacesContext;
> import javax.faces.event.ComponentSystemEvent;
> 
> @ManagedBean
> @RequestScoped
> public class TestBean {
>     public void check(ComponentSystemEvent event){
>        Map<String, Object> session =
> FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
> ;         if(!session.containsKey("V")) {
> session.put("V", 1);         } else {
>             session.put("V", (Integer)session.get("V") + 1);
>         }
>        Map<String, Object> application =
> FacesContext.getCurrentInstance().getExternalContext().getApplicationM
> ap();         if(!application.containsKey("V")) {
> application.put("V", 1);         } else {
>             application.put("V", (Integer)application.get("V") + 1);
>         }
>     }
> }
> 
> Disse eksempler er faktisk ret ens i måden de håndterer session og
> application på.
> 
> PHP er lidt anderledes. IIS/ASP.NET og servlet container er begge
> processer hvor det er nemt at implmentere noget fælles hukommelse.
> PHP har flere forskellige execution modeller. De fleste af disse
> (bl.a. CGI, FastCGI, mod_php med prefork, worker og event) har
> flere procsser kørende. Kun få af dem (ISAPI og mod_php med winnt)
> er enkelt process.
> 
> Som alle ved så understøtter PHP sessioner. Det gør de ved
> at serialisere/deserialisere til/fra fil (som default - det
> er muligt at hooke sin egen handler ind).
> 
> Så session er nemt:
> 
> <?php
> session_start();
> if(!isset($_SESSION['V'])) {
>     $_SESSION['V'] = 1;
> } else {
>     $_SESSION['V'] = $_SESSION['V'] + 1;
> }
> ?>
> Session = <?php echo $_SESSION['V']; ?>
> 
> 
> Men PHP har ikke et tilsvarende $_APPLICATION objekt.
> 
> Og en implementation af $_APPLICATION ligesom $_SESSION
> (default) ville performe meget dårligt - det ville
> de facto serialisere alle requests som brugte det.
> 
> Der er mindst 3 måder at arbejde sig omkring problemet på:
> A) bruge serialisering og fil men minimere låsningstiden
>    på den fil - d.v.s. ikke fra request start til request
>    slut men fra brug start til brug slut og gerne
>    flere filer for forskellige formål
> B) traditionel database (MySQL, PostgreSQL etc.)
> C) en distribueret cache (memcached, Redis etc.)
> 
> Det er mit klare indtryk at de store PHP løsninger
> foretrækker #C og jeg vil derfor formode at det er
> en god løsning.
> 
> memcached var dominerende på området, men idag har
> Redis taget over.
> 
> Implementereting med memcached:
> 
> <?php
> session_start();
> 
> if(!isset($_SESSION['V'])) {
>     $_SESSION['V'] = 1;
> } else {
>     $_SESSION['V'] = $_SESSION['V'] + 1;
> }
> 
> $memcache = new Memcache();
> $memcache->connect('localhost', 11211) or die ("Could not connect to
> memcached"); if(!$memcache->get('V')) {
>     $memcache->set('V', 1);
> } else {
>     $memcache->set('V', $memcache->get('V') + 1);
> }
> 
> ?>
> Session = <?php echo $_SESSION['V']; ?>
> <br>
> Application = <?php echo $memcache->get('V'); ?>
> <?php
> $memcache->close();
> ?>
> 
> Implementering med Redis:
> 
> <?php
> session_start();
> 
> if(!isset($_SESSION['V'])) {
>     $_SESSION['V'] = 1;
> } else {
>     $_SESSION['V'] = $_SESSION['V'] + 1;
> }
> 
> $redis = new Redis();
> $redis->connect('localhost', 6379);
> if(!$redis->get('V')) {
>     $redis->set('V', 1);
> } else {
>     $redis->set('V', $redis->get('V') + 1);
> }
> 
> ?>
> Session = <?php echo $_SESSION['V']; ?>
> <br>
> Application = <?php echo $redis->get('V'); ?>
> <?php
> $redis->close();
> ?>
> 
> Vigtig note: al koden ovenfor virker til at illustrere session og
> application begreberne, men intet af koden er korrekte tællere
> p.g.a. samtidighedsproblemer.
> 
> Men det er et generelt problem og ikke specielt for PHP
> løsningerne.
> 
> Slut på skriv.
> 
> Arne

Hej Arne!Kom helt væk fra denne tråd - beklager det sene svar meget.

Tusind tak for det meget fyldestgørende svar, som viste sig at være
brugbart for ham, der spurgte mig. :-)

Omend noget af det, er sort snak for mig. :-D



-- 
Med venlig hilsen

Dennis Munding

Back to dk.edb.internet.webdesign.serverside.php | Previous | NextPrevious in thread | Find similar


Thread

.net til php "Dennis Munding" <nospa@mplease.dk> - 2019-07-14 14:01 +0000
  Re: .net til php Bertel Lund Hansen <gadekryds@lundhansen.dk> - 2019-07-14 19:44 +0200
    Re: .net til php "Dennis Munding" <nospa@mplease.dk> - 2019-07-14 18:47 +0000
  Re: .net til php Martin Larsen <martin+spamfree+larsen@bigfoot.com> - 2019-07-19 10:35 +0200
    Re: .net til php Martin Larsen <martin+spamfree+larsen@bigfoot.com> - 2019-07-19 10:36 +0200
    Re: .net til php Bertel Lund Hansen <gadekryds@lundhansen.dk> - 2019-07-19 11:11 +0200
    Re: .net til php Krabsen <usenet@krabsen.dk> - 2019-07-19 11:53 +0200
      Re: .net til php Bertel Lund Hansen <gadekryds@lundhansen.dk> - 2019-07-19 13:58 +0200
      Re: .net til php "Dennis Munding" <nospa@mplease.dk> - 2019-07-19 16:34 +0000
        Re: .net til php "Dennis Munding" <nospa@mplease.dk> - 2019-07-19 16:42 +0000
          Re: .net til php Martin Larsen <martin+spamfree+larsen@bigfoot.com> - 2019-07-20 13:55 +0200
            Re: .net til php "Dennis Munding" <nospa@mplease.dk> - 2019-07-20 16:32 +0000
  Re: .net til php Arne Vajhøj <arne@vajhoej.dk> - 2019-08-11 14:49 -0400
    Re: .net til php "Dennis Munding" <nospa@mplease.dk> - 2019-10-04 15:40 +0000

csiph-web