2014-10-06 80 views
1

我已经编程了近3个月,而且我刚学过php,而且我有一个问题:PHP有内存吗? 我的意思是,如果我使用表单创建一个新变量,当我刷新互联网页面时,该变量是否仍然存在?php是否有内存?

+8

只有当你给它一个:http://php.net/manual/en/book.session.php – Mark 2014-10-06 19:01:46

回答

1

您可以通过会话

//set session 
session_start(); 
$_SESSION["test"] = "data33"; 

然后做到这一点,

//return session 
session_start(); 
echo $_SESSION["test"]; 

或 “mateop” Saied如何操作:您可以使用Cookie来存储数据更长的时间:)

http://www.w3schools.com/php/php_cookies.asp

+1

有一点了解更多信息将是有益的。否则,这是一个更好的评论。 – showdev 2014-10-06 19:03:06

+0

哦,非常感谢! – Omeyr 2014-10-06 19:07:42

0

不,每个脚本的执行都是独立于以前的。在执行过程之间存储变量的唯一方法是使用会话,cookie或某种形式的数据库。是(和否)。

2

是(和否)。

万维网基本上是一个REST implementation。这意味着服务器不会保持活动状态来记住请求之间的状态(它是无状态)。

而且这与PHP的运行方式相匹配。一个PHP脚本只运行一会儿。浏览器请求一个URL,PHP脚本启动,生成输出并终止。任何在内存中的变量都会被遗忘。

因此,如果您需要记住某些内容,则必须将其发送回浏览器,并且浏览器必须将其重新发回给您,以便下一次请求。

您可以通过几种方法来实现。

  1. 链接。如果你在PHP中输出一个内部链接,你可以在那里添加变量(例如'name'),所以你的url变成example.com/page.php?name=bob。这不是非常方便,因为网址中有很多垃圾。此外,具有特定值的网址存储在浏览器的历史记录中,因此用户可以轻易地和无意中浏览到具有过时值的网址。

  2. 饼干。众所周知,并且比链接中的变量更容易,更方便用户使用。您可以在服务器上用PHP设置一个cookie,并将其与客户端(浏览器)的响应一起发送。浏览器将发送每个新请求的Cookie。所以你可以将变量存储在那里,它将被保存。您可以使用setcookie函数在PHP中设置cookie,并且您可以使用$_COOKIE读取cookie。

现在,Cookie有其限制。它们不能很大。此外,该变量可能包含您不希望发送到浏览器的信息,因为它是机密信息。

为了解决这个问题,你只需要在cookie中发送一个唯一的代码,通过它你可以识别出下一个请求属于同一个会话。使用这个会话ID,您可以找到单独存储在服务器上的变量。

现在,您可以自己实施这些会话,基本上如我所述。只需生成一个唯一的ID,并将所需的所有信息存储在文件或数据库中,并链接到该ID。该ID被发送到浏览器并使用cookie返回。

但幸运的是,PHP可以帮助你做到这一点,它有几个函数可以让你开始一个会话并记住某些变量,直到下一个请求。

它以函数session_start()开头。有了这个功能,你开始一个会话。 PHP将检查cookie是否包含会话ID,并将前一个请求的变量加载到超全局$_SESSION中。如果没有会话存在,则会生成一个新的唯一会话ID并将其添加到cookie中,并且$_SESSION被初始化为空数组。

所以在这之后,你可以使用超全局存储中值:

<?php 
session_start(); 
if (!array_key_exists('start', $_SESSION)) 
    $_SESSION['start'] = time(); // Save the start time of the session 

echo 'This session started at ' . date($_SESSION['start']) 
    . '. And now it is ' . date(time()) . '.'; 

如果您通过浏览器打开上面的脚本,并刷新页面,你会看到刷新之间的时间变化,而原始的开始时间被保存并一遍又一遍地显示。因此,虽然PHP不记得正常变量,但您可以使用会话来保留特定值。

这些功能的详细说明可以在PHP: Sessions中找到。

+1

REST基本上是一个HTTP实现,反之亦然! :)但是,在这里你的有用答案+1!你钉了下来 – hek2mgl 2014-10-06 22:09:42

+0

谢谢!我的意思是说,万维网是一个REST实现。 HTTP是通信协议,虽然HTTP 1.1和REST一起开发,但HTTP与该评论无关。 – GolezTrol 2014-10-07 07:27:44

0

HTTP是一种无状态协议,它意味着在页面刷新后服务器甚至不记得请求来自哪里。 -

http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol

为了解决这个问题,我们有会话 - http://php.net/manual/en/book.session.php(此链接了所有的细节)

你需要在这些基础工作,您的问题将得到解答。按照这篇文章中的链接开始。

参考代码如下: -

<?php 
    session_start(); 
    if(isset($_SESSION['var'])) 
     echo $_SESSION['var']; 
    else 
     $_SESSION["var"] = "hello"; 
?> 
+0

*“为了解决这个问题,我们有会话,cookie或一些数据库方法,”*会议是一个概念。 Cookie是您存储会话ID的地方(即使您使用PHP的会话功能)。数据库用于会话信息的服务器端存储(可以是文件或实际数据库)。无论如何,这里没有'或'。它们交织在一起。 – GolezTrol 2014-10-06 19:52:49

+0

而'is_set'应该是'isset'。 – GolezTrol 2014-10-06 19:53:29

+0

进行了必要的更改。感谢您的审查。欣赏它。 – divyenduz 2014-10-06 19:55:48