V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
blue7wings
V2EX  ›  PHP

在 PHP 中,一个页面如何获取另一个页面声明的变量?

  •  
  •   blue7wings · 2014-11-16 20:39:11 +08:00 · 11902 次点击
    这是一个创建于 3697 天前的主题,其中的信息可能已经有所发展或是发生改变。
    例如,我在A页面声明了变量$a,从A页面跳转到B页面,那么B页面如何获取到这个变量?我一般都是带参数传递过去,或者写入session在B页面再获取,能不能写入内存?然后B页面再从内存中获取并销毁这个变量呢?
    PHP小白,求大大们帮帮解答,O(∩_∩)O谢谢。。。
    27 条回复    2014-11-29 22:02:40 +08:00
    loveyu
        1
    loveyu  
       2014-11-16 20:44:54 +08:00 via Android
    貌似没办法,存在session或缓存中
    mahone3297
        2
    mahone3297  
       2014-11-16 20:55:26 +08:00
    写入redis内存中。。。
    orvice
        3
    orvice  
       2014-11-16 20:59:52 +08:00
    $a 放到同一个文件,然后AB都去include?
    regmach
        4
    regmach  
       2014-11-16 21:03:36 +08:00
    session,plz
    zhs227
        5
    zhs227  
       2014-11-16 21:03:57 +08:00
    PHP变量作用域是页面,这个事情被喷了不知道多久。需要自己做序列化与反序列化。一般常用的是session, db, 也可以用文件,简单点一两个参数的可以用url?param1=v1&param2=v2这种GET方式传递。
    regmach
        6
    regmach  
       2014-11-16 21:28:31 +08:00
    看了ls的描述
    我突然觉得自己似乎没理解lz的用意....
    qushiba
        7
    qushiba  
       2014-11-16 21:34:26 +08:00
    从页面参数传过去,或者就session。。。。。可蛋疼了
    xoxo
        8
    xoxo  
       2014-11-16 21:35:26 +08:00
    @zhs227 变量生命期是请求...
    feiyuanqiu
        9
    feiyuanqiu  
       2014-11-16 21:36:27 +08:00
    内存的话我记得有个扩展shmop可以干这事,但是都用到内存了其实用缓存还要简单些
    zhs227
        10
    zhs227  
       2014-11-16 21:42:46 +08:00
    @xoxo 对,是请求。我表达不够准确
    cougar
        11
    cougar  
       2014-11-16 21:48:13 +08:00
    什么场景非要这么干
    cover
        12
    cover  
       2014-11-16 21:49:23 +08:00 via Android
    跳转的get里面写入参数 redis的作用域就变成全局了。。。不现实 还是写入url的get请求靠谱
    t6attack
        13
    t6attack  
       2014-11-16 21:55:58 +08:00
    @zhs227 这样也有好处。单个页面的崩溃,不会影响系统整体的稳定。避免了内存泄漏等问题。
    lincanbin
        14
    lincanbin  
       2014-11-16 21:57:54 +08:00
    一般是是URL中夹带参数跳转,变量的生命周期是请求其实是个很好的特性,避免了不会用变量的人把Web服务搞挂。
    txlty
        15
    txlty  
       2014-11-16 22:03:33 +08:00
    写入文件。或者写入内存,可以用第三方软件实现(memcache、redis)
    写入内存有更简单的方式:用apc扩展。
    http://pecl.php.net/package/apc
    http://php.net/manual/zh/book.apc.php
    txlty
        16
    txlty  
       2014-11-16 22:16:19 +08:00
    楼主先搞明白,你想要的是作用于单次会话的变量?还是服务器全局缓存?
    如果是单次会话,那么session就是储存在内存里的。
    itfanr
        17
    itfanr  
       2014-11-16 22:35:41 +08:00
    如果是java 貌似可以弄个变量 作用域是一次请求
    xin1090
        18
    xin1090  
       2014-11-16 23:09:12 +08:00
    我貌似用get比较多,需要安全一些的会弄成post。 反正都是隐藏的。
    regmach
        19
    regmach  
       2014-11-16 23:18:11 +08:00
    针对用户就session或者get/post
    针对全局就写入内存或者数据库
    0_0 我应该没有乱说吧?
    breestealth
        20
    breestealth  
       2014-11-16 23:22:59 +08:00
    就是一个全局变量的问题。写入 Session、Cookie、Memcache、Redis、DB 甚至某个文件都能解决。根据需要选择最简单的。
    kchum
        21
    kchum  
       2014-11-17 00:35:37 +08:00 via iPhone
    Get
    最简单了
    watsy0007
        22
    watsy0007  
       2014-11-17 00:39:51 +08:00
    数据量比较小,访问量小就上session.
    不然就考虑外部缓存,redis
    Yuansir
        23
    Yuansir  
       2014-11-17 09:31:05 +08:00
    共享内存 shm_*
    skyworker
        24
    skyworker  
       2014-11-17 10:15:59 +08:00   ❤️ 3
    @zhs227 RT

    PHP和Python/Ruby的运行机制有一个本质区别:PHP是每次HTTP请求过来以后,初始化全部资源(例如创建数据库链接、加载系统类库,创建缓存等等),处理完毕,释放全部资源,这不像Python/Ruby之类带有GC的脚本语言,Python/Ruby是初次启动的时候初始化资源,随后的请求就不必再次初始化资源了。

    这种机制的差异带来的区别就是:

    1、PHP极难出现严重的内存泄露问题,随便你代码写的多烂,反正每个请求一执行完毕,所有资源统统释放光。而Python/Ruby则需要依赖GC来回收内存,因此稍有不慎,还是会出现GC无法释放的内存泄露问题。

    2、PHP每次请求都要初始化资源,这个开销非常大。所以尽管PHP解析器本身的运行速度是极快的,但是一旦使用复杂的PHP框架,那么由于需要每次请求的时候初始化整个框架,性能的下降非常厉害,你用一个很复杂的PHP框架的结果就是整体性能被Ruby远远甩开。这也是为什么PHP社区这么多年来,并不怎么倾向于使用框架的原因之一。

    3、由于PHP这种每请求初始化资源的机制,也造成了PHP添加跨请求的高级特性相当困难,这是PHP本身一个很大的限制,但是反过来说,正是这种限制使得PHP始终保持在一个比较简单的web语言上面,而正是这一点才是PHP得以成为互联网第一Web编程语言的原因,因此也未必就不好。
    boynanboy
        25
    boynanboy  
       2014-11-17 16:15:28 +08:00
    session 缓存 文件 通过url传递
    xwsoul
        26
    xwsoul  
       2014-11-18 21:56:26 +08:00
    原因, 思路和方案LS各位已经答的很好了...
    PHP基本变量使用的思路就是一个请求内处理完成...
    基本上比较耗时的操作可能回丢队列或者深度依赖缓存系统...
    bystand3r
        27
    bystand3r  
       2014-11-29 22:02:40 +08:00
    看你的业务需求,这个变量到底涉不涉及隐私或安全特性,如果没有,那么get必然是最靠谱的方法。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1012 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:05 · PVG 04:05 · LAX 12:05 · JFK 15:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.