php如何做到多php 每次请求变量加一能够共享某个变量的值

问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
我项目中有一个关于获取当前文章的相似文章的功能,这个功能我的实现方法是获取到所有的文章标题数组,然后存放到一个php文件中,每次获取相似文章的时候就载入这个标题数组文件,将内容赋值到某个变量中(假设该变量取名 $a),然后循环比较,这样就有个问题,每次请求都会有个 $a 生成,而我的这个 $a 目前的值有300多K,想请问各位大神如何实现这个变量值共享,而不是每个请求都生成这样一个变量。
补充一下,就像单例类那样,始终保持只有一个类的实例化,变量能做成这样吗?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你可以看下织梦CMS的likearticle相关文章是怎么做的.
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
这个在操作系统层面上就没有办法做到的,每次http请求都会创建一个进程,进程之间的数据是不共享的。进程中创建出来的子线程是共享主进程的数据。所以,如果要共享变量,要用第三方存储。比如Redis、mysql...等等。
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?php在本函数里定义的变量如何在另一个函数里使用它的值_百度知道
php在本函数里定义的变量如何在另一个函数里使用它的值
这两个函数在同一个页面
1、用return函数来返回你所需的变量。例子:
function my(){
$from_sql=mysql_request($result);
return $from_
//把$from_sql变量返回给函数
}2、就是从外部定义好变量,然后在函数内调用全局变量。例子:
$from_sql=mysql_request($result);
function my(){
global $from_
//一下可以直接调用$from_sql变量了
}3、要调用的函数是一个类里面的一个方法。例子
class myclass{
public $from_
$from_sql=mysql_request($result);
如果要调用$from_sql变量的话就可以这样调用。如下:
$my=new myclass();
$get_from_sql=$my-&from_
采纳率:64%
来自团队:
你可以在函数外部就声明了这个变量,然后再各自函数内部用global关键字就可以调用了,希望帮到您
这个变量是我在本函数中查询数据库得到的值,我在本函数下面的另一个函数里面想使用这个变量的值,能写几行代码说一下吗?
我写了那么久的PHP代码,我没遇见过从一个函数调用另一个函数中的变量的情况。对于你的情况我只能说出三种方法提供给你参考。1、用return函数来返回你所需的变量。例子:
function my(){
$from_sql=mysql_request($result);
return $from_
//把$from_sql变量返回给函数
}2、就是从外部定义好变量,然后在函数内调用全局变量。例子:
$from_sql=mysql_request($result);
function my(){
global $from_
//一下可以直接调用$from_sql变量了
}3、要调用的函数是一个类里面的一个方法。例子
class myclass{
public $from_
$from_sql=mysql_request($result);
如果要调用$from_sql变量的话就可以这样调用。如下:
$my=new myclass();
$get_from_sql=$my-&from_
本回答被提问者采纳
为您推荐:
其他类似问题
您可能关注的内容
php的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
请问下PHP单例的生命周期是怎么样的呢?比如我在第一个请求中取得一个单例,然后对其中变量$a进行赋值。这样在第二个请求的时候,是否可以取得这个$a变量?关于这方面的知识,有经验的亲们,有什么优秀的博文或者书籍推荐学习的吗,多谢了?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
不可能,php是单进程单线程的
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
答案是不会,因为脚本结束的时候所有变量都已经释放了.
我觉得你需要了解下php的生命周期
1. PHP是随着WEB服务器(apache)的启动而运行的;
2. PHP通过mod_php5.so()模块和服务器(apache)相连
3. PHP总共有三个模块:内核、Zend引擎、以及扩展层;
4. PHP内核用来处理请求、文件流、错误处理等相关操作;
5. Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;
6. 扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们需要MySQL扩展来连接MySQL数据库;
7. 当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;
8. 最后,ZE将程序运行结果返回给PHP内核,它再将结果传送给SAPI层,最终输出到浏览器上。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
PHP的单例是单次请求的,请求结束会释放内存,单例也就不存在了。PHP种使用单例的意义在于在创建某耗费资源的实例(创建数据库连接之类的)时,单次请求只创建一次节省资源。像Java那种可以常驻内存的实例,单例可以一直存在,直到web容器关闭。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
要通过扩展实现。
参考数据库持久连接的实现。
该答案已被忽略,原因:
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。解析在PHP中使用全局变量的几种方法
字体:[ ] 类型:转载 时间:
本篇文章是对在PHP中使用全局变量的几种方法进行了详细的分析介绍,需要的朋友参考下
简介即使开发一个新的大型PHP程序,你也不可避免的要使用到全局数据,因为有些数据是需要用到你的代码的不同部分的。一些常见的全局数据有:程序设定类、数据库连接类、用户资料等等。有很多方法能够使这些数据成为全局数据,其中最常用的就是使用“global”关键字申明,稍后在文章中我们会具体的讲解到。使用“global”关键字来申明全局数据的唯一缺点就是它事实上是一种非常差的编程方式,而且经常在其后导致程序中出现更大的问题,因为全局数据把你代码中原本单独的代码段都联系在一起了,这样的后果就是如果你改变其中的某一部分代码,可能就会导致其他部分出错。所以如果你的代码中有很多全局的变量,那么你的整个程序必然是难以维护的。本文将展示如何通过不同的技术或者设计模式来防止这种全局变量问题。当然,首先让我们看看如何使用“global”关键字来进行全局数据以及它是如何工作的。使用全局变量和“global”关键字PHP默认定义了一些“超级全局(Superglobals)”变量,这些变量自动全局化,而且能够在程序的任何地方中调用,比如$_GET和$_REQUEST等等。它们通常都来自数据或者其他外部数据,使用这些变量通常是不会产生问题的,因为他们基本上是不可写的。但是你可以使用你自己的全局变量。使用关键字“global”你就可以把全局数据导入到一个函数的局部范围内。如果你不明白“变量使用范围”,请你自己参考PHP手册上的相关说明。下面是一个使用“global”关键字的演示例子: 代码如下:&?php$my_var = 'Hello World';test_global();function test_global() {&&& // Now in local scope&&& // the $my_var variable doesn't exist&&& // Produces error: "Undefined variable: my_var"&&& echo $my_&&& // Now let's important the variable&&& global $my_&&& // Works:&&& echo $my_}?&正如你在上面的例子中看到的一样,“global”关键字是用来导入全局变量的。看起来它工作的很好,而且很简单,那么为什么我们还要担心使用“global”关键字来定义全局数据呢?下面是三个很好的理由:
1、代码重用几乎是不可能的。如果一个函数依赖于全局变量,那么想在不同的环境中使用这个函数几乎是不可能的。另外一个问题就是你不能提取出这个函数,然后在其他的代码中使用。
2、调试并解决问题是非常困难的。跟踪一个全局变量比跟踪一个非全局变量困难的多。一个全局变量可能会在一些不明显的包含文件中被重新定义,即使你有一个非常好的程序编辑器(或者IDE)来帮助你,你也得花了几个小时才能发现这个问题所在。
3、理解这些代码将是非常难的事情。你很难弄清楚一个全局变量是从哪里来得,它是用来做什么的。在开发的过程中,你可能会知道知道每一个全局变量,但大概一年之后,你可能会忘记其中至少一般的全局变量,这个时候你会为自己使用那么多全局变量而懊悔不已。那么如果我们不使用全局变量,我们该使用什么呢?下面让我们看看一些解决方案。使用函数参数停止使用全局变量的一种方法就是简单的把变量作为函数的参数传递过去,如同下面所示: 代码如下: &?php$var = 'Hello World';test ($var);function test($var) {&&& echo $}?&如果你仅仅只需要传递一个全局变量,那么这是一种非常优秀甚至可以说是杰出的解决方案,但是如果你要传递很多个值,那该怎么办呢?比如说,假如我们要使用一个数据库类,一个程序设置类和一个用户类。在我们代码中,这三个类在所有组件中都要用到,所以必须传递给每一个组件。如果我们使用函数参数的方法,我们不得不这样: 代码如下:&& &?php$db = new DBC$settings = new Settings_XML;$user = new Utest($db, $settings, $user);function test(&$db, &$settings, &$user) {&&& // Do something}?&显然,这是不值得的,而且一旦我们有新的对象需要加入,我们不得不为每一个函数增加多一个函数参数。因此我们需要用采用另外一种方式来解决。使用单件(Singletons)解决函数参数问题的一种方法就是采用单件(Singletons)来代替函数参数。单件是一类特殊的对象,它们只能实例化一次,而且含有一个静态方法来返回对象的接口。下面的例子演示了如何构建一个简单的单件: 代码如下: &?php// Get instance of DBConnection$db =& DBConnection::getInstance();// Set user property on object$db-&user = 'sa';// Set second variable (which points to the same instance)$second =& DBConnection::getInstance();// Should print 'sa'echo $second-&Class DBConnection {&&& var $&&& function &getInstance() {&&&&&&& static $&&&&&&& if (is_object($me) == true) {&&&&&&&&&&& return $&&&&&&& }&&&&&&& $me = new DBC&&&&&&& return $&&& }&&& function connect() {&&&&&&& // TODO&&& }&&& function query() {&&&&&&& // TODO&&& }}?&上面例子中最重要的部分是函数getInstance()。这个函数通过使用一个静态变量$me来返回这个类的实例,从而确保了只有一个DBConnection类的实例。使用单件的好处就是我们不需要明确的传递一个对象,而是简单的使用getInstance()方法来获取到这个对象,就好像下面这样: 代码如下:&?phpfunction test() {&&& $db = DBConnection::getInstance();&&& // Do something with the object}?&然而使用单件也存在一系列的不足。首先,如果我们如何在一个类需要全局化多个对象呢?因为我们使用单件,所以这个不可能的(正如它的名字是单件一样)。另外一个问题,单件不能使用个体测试来测试的,而且这也是完全不可能的,除非你引入所有的堆栈,而这显然是你不想看到的。这也是为什么单件不是我们理想中的解决方法的主要原因。注册模式让一些对象能够被我们代码中所有的组件使用到(译者注:全局化对象或者数据)的最好的方法就是使用一个中央容器对象,用它来包含我们所有的对象。通常这种容器对象被人们称为一个注册器。它非常的灵活而且也非常的简单。一个简单的注册器对象就如下所示: 代码如下:&?phpClass Registry {&&& var $_objects = array();&&& function set($name, &$object) {&&&&&&& $this-&_objects[$name] =& $&&& }&&& function &get($name) {&&&&&&& return $this-&_objects[$name];&&& }}?&使用注册器对象的第一步就是使用方法set()来注册一个对象: 代码如下:&?php$db = new DBC$settings = new Settings_XML;$user = new U// Register objects$registry =& new R$registry-&set ('db', $db);$registry-&set ('settings', $settings);$registry-&set ('user', $user);?&现在我们的寄存器对象容纳了我们所有的对象,我们指需要把这个注册器对象传递给一个函数(而不是分别传递三个对象)。看下面的例子: 代码如下:&?phpfunction test(&$registry) {&&& $db =& $registry-&get('db');&&& $settings =& $registry-&get('settings');&&& $user =& $registry-&get('user');&&& // Do something with the objects}?&注册器相比其他的方法来说,它的一个很大的改进就是当我们需要在我们的代码中新增加一个对象的时候,我们不再需要改变所有的东西(译者注:指程序中所有用到全局对象的代码),我们只需要在注册器里面新注册一个对象,然后它(译者注:新注册的对象)就立即可以在所有的组件中调用。为了更加容易的使用注册器,我们把它的调用改成单件模式(译者注:不使用前面提到的函数传递)。因为在我们的程序中只需要使用一个注册器,所以单件模式使非常适合这种任务的。在注册器类里面增加一个新的方法,如下所示: 代码如下:&?function &getInstance() {&&& static $&&& if (is_object($me) == true) {&&&&&&& return $&&& }&&& $me = new R&&& return $}?&这样它就可以作为一个单件来使用,比如: 代码如下:&?php$db = new DBC$settings = new Settings_XML;$user = new U// Register objects$registry =& Registry::getInstance();$registry-&set ('db', $db);$registry-&set ('settings', $settings);$registry-&set ('user', $user);function test() {&&& $registry =& Registry::getInstance();&&& $db =& $registry-&get('db');&&& $settings =& $registry-&get('settings');&&& $user =& $registry-&get('user');&&& // Do something with the objects}?&正如你看到的,我们不需要把私有的东西都传递到一个函数,也不需要使用“global”关键字。所以注册器模式是这个问题的理想解决方案,而且它非常的灵活。请求封装器虽然我们的注册器已经使“global”关键字完全多余了,在我们的代码中还是存在一种类型的全局变量:超级全局变量,比如变量$_POST,$_GET。虽然这些变量都非常标准,而且在你使用中也不会出什么问题,但是在某些情况下,你可能同样需要使用注册器来封装它们。一个简单的解决方法就是写一个类来提供获取这些变量的接口。这通常被称为“请求封装器”,下面是一个简单的例子: 代码如下:&?phpClass Request {&&& var $_request = array();&&& function Request() {&&&&&&& // Get request variables&&&&&&& $this-&_request = $_REQUEST;&&& }&&& function get($name) {&&&&&&& return $this-&_request[$name];&&& }}?&上面的例子是一个简单的演示,当然在请求封装器(request wrapper)里面你还可以做很多其他的事情(比如:自动过滤数据,提供默认值等等)。下面的代码演示了如何调用一个请求封装器: 代码如下:&?php$request = new R// Register object$registry =& Registry::getInstance();$registry-&set ('request', &$request);test();function test() {&&& $registry =& Registry::getInstance();&&& $request =& $registry-&get ('request');&&& // Print the 'name' querystring, normally it'd be $_GET['name']&&& echo htmlentities($request-&get('name'));}?&正如你看到的,现在我们不再依靠任何全局变量了,而且我们完全让这些函数远离了全局变量。结论在本文中,我们演示了如何从根本上移除代码中的全局变量,而相应的用合适的函数和变量来替代。注册模式是我最喜欢的设计模式之一,因为它是非常的灵活,而且它能够防止你的代码变得一塌糊涂。另外,我推荐使用函数参数而不是单件模式来传递注册器对象。虽然使用单件更加轻松,但是它可能会在以后出现一些问题,而且使用函数参数来传递也更加容易被人理解。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 php 多用户共享变量 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信