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