【问题标题】:Reading and writing global variables across scripts in PHP在 PHP 中跨脚本读写全局变量
【发布时间】:2010-11-28 23:43:19
【问题描述】:

PHP 是否有全局变量可以被一个正在运行的脚本修改并被另一个脚本读取?

【问题讨论】:

    标签: php scripting webserver global-variables data-transfer


    【解决方案1】:

    不,PHP 在设计上是一种“不共享”架构,这意味着在同时运行的进程之间或在一个接一个运行的请求之间不共享任何内容。有很多方法可以共享数据,但您必须明确地这样做。

    如果您只想在来自同一用户的 2 个请求之间共享,会话或 cookie 可能是要走的路。

    如果您想在多个用户之间共享,您可能需要某种共享持久性,无论是在缓存中的短期(例如 memcached)还是更健壮的数据库。

    无论哪种方式,数据实际上都是在每次请求时检索和重建的。它只是在会话的情况下为您自动处理。

    【讨论】:

      【解决方案2】:

      您实际上可以使用shared memoryAPC(使用共享内存本身)来执行此操作。

      【讨论】:

        【解决方案3】:

        你可以使用$_SESSION,即:

        script1.php

        <?php
        session_start();
        $_SESSION['myVar'] = "something";
        ?>
        

        script2.php

        <?php
        session_start();
        echo $_SESSION['myVar'];
        //something
        ?>
        

        【讨论】:

          【解决方案4】:

          脚本之间唯一可以访问的是超全局 $_SESSION 数组。这是因为您存储在数组中的任何内容都会发送到 cookie,然后可以由下一个 PHP 脚本获取。

          全局变量只是意味着可以在脚本中访问它们而不管范围;这并不意味着它们可以在脚本之间发送。

          因此,要么您必须使用 $_SESSION 数组来传输变量(这会在客户端计算机上存储一个 cookie,因此不要通过该数组发送任何敏感信息),或者您可以在要发送的脚本之间使用 POST 或 GET变量。

          【讨论】:

          • 会话数据本身并不存储在cookie中,而是存储在服务器上。只有会话 id 作为 cookie 标头发送给客户端。
          【解决方案5】:

          每个请求都由它自己的一个 php 实例处理。 php 中的全局变量只能从同一个 php 实例中访问。但是,您可以使用 memchached module 之类的东西在不同实例之间共享数据(这通常应该比将数据写入文件系统更快)。

          【讨论】:

            【解决方案6】:

            并非如此,但您可以使用 cookie 或会话在用户浏览体验期间维护数据,或者如果信息需要在此之后持久保存,您可以写入磁盘上的数据库或文件。

            【讨论】:

              【解决方案7】:

              在 PHP 中另一个常见的全局变量替换是共享使用像 MySQL 这样的数据库(虽然不是一个完美的数据库)

              【讨论】:

                【解决方案8】:

                全局变量在大多数编程中都不好。它们在 webapps 等多线程/多用户系统中尤其糟糕。避免。如果您必须使用全局变量(而不是全局常量),请将它们放入带有事务保护更新的数据库中。

                由于您谈论不同的脚本,听起来您真正想要的是一个更加面向应用程序的语言的 Web 应用程序框架 --- 类似于 Django (python) 或 Rails (ruby)。这些让您可以将您的代码更多地视为一个有凝聚力的程序,而不是许多处理 Web 请求的松散连接的脚本。

                【讨论】:

                  【解决方案9】:

                  我创建了一个小型库(~2 KB;varDx

                  它具有写入、读取、修改、检查和删除数据的功能。 它实现了序列化,因此支持所有数据类型。

                  你可以这样使用它:

                  <?php
                  require 'varDx.php';
                  $dx = new \varDx\cDX; //create an object
                  $dx->def('file.dat'); //define data file
                  
                  $val1 = "this is a string";
                  $dx->write('data1', $val1); //writes key to file
                  echo $dx->read('data1'); //returns key value from file
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-05-25
                    • 2016-03-03
                    • 2022-01-21
                    • 2016-09-23
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多