PHP 是否具有可以由一个正在运行的脚本修改并由另一个脚本读取的全局变量?
9 回答
不,按照设计 PHP 是一种“无共享”架构,这意味着在同时运行的进程之间或在一个接一个运行的请求之间没有共享任何内容。有很多方法可以共享数据,但您必须明确地这样做。
如果您只想在来自同一用户的 2 个请求之间共享,则会话或 cookie 可能是要走的路。
如果您想在多个用户之间共享,您可能需要某种共享持久性,或者在缓存中短期(例如 memcached)或者像数据库一样更健壮。
无论哪种方式,数据实际上都是在每次请求时被检索和重建的。它只是在会话的情况下为您自动处理。
您实际上可以使用shared memory或APC(它本身使用共享内存)来做到这一点。
您可以使用$_SESSION,即:
脚本1.php
<?php
session_start();
$_SESSION['myVar'] = "something";
?>
脚本2.php
<?php
session_start();
echo $_SESSION['myVar'];
//something
?>
唯一可以在脚本之间访问的是超全局 $_SESSION 数组。这是因为您存储在数组中的任何内容都会发送到 cookie,然后可以由下一个 PHP 脚本获取。
全局变量只是意味着可以在脚本中访问它们而不管范围如何;这并不意味着它们可以在脚本之间发送。
因此,要么您必须使用 $_SESSION 数组传输变量(这将 cookie 存储在客户端计算机上,因此不要通过该数组发送任何敏感信息),或者您可以在脚本之间使用 POST 或 GET 来发送变量。
每个请求都由它自己的一个 php 实例处理。php 中的全局变量只能从同一个 php 实例中访问。但是,您可以使用memchached 模块之类的东西在不同实例之间共享数据(这通常应该比将数据写入文件系统更快)。
PHP 中全局变量的另一种常见替代方法是共享使用像 MySQL 这样的数据库(尽管不是一个完美的数据库)
不是这样,但您可以使用 cookie 或会话在用户浏览体验期间维护数据,或者如果信息需要在此之外持续存在,您可以写入磁盘上的数据库或文件。
全局变量在大多数编程中都不好。它们在 webapps 等多线程/多用户系统中尤其糟糕。避免。如果您必须使用全局变量(而不是全局常量),请将它们放入带有事务保护更新的数据库中。
不过,由于您谈论的是不同的脚本,听起来您真正想要的是一个更加面向应用程序的语言的 Web 应用程序框架——比如 Django (python) 或 Rails (ruby)。这些让您将您的代码更多地视为一个有凝聚力的程序,而不是许多处理 Web 请求的松散连接的脚本。
我制作了一个小型库(~2 KB;<100 行),它允许您这样做: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