开发者

Static variables across sessions

In ASP.NET if I declare a variable (or object) static (or if I make a singleton) I can have it persist across multiple se开发者_开发技巧ssions of multiple users (it it registered in a server scope) so that I don't have to initialize it at every request.

Is there such a feature in PHP? Thanks


You can set up APC and use the apc_store and apc_fetch functions.

http://us.php.net/manual/en/book.apc.php


You can do that with a PHP extension (written in C).

But if you want to write it in PHP, no. The best alternative is to write the variable to a file (file_put_contents()) at the end of each request, and open it at the start of each request (file_get_contents()).

That alternative isn't going to work for high volume sites because the processes will be doing read/write at the same time and the world will go all BLAAA-WOOO-EEE-WOHHH-BOOOM.


That doesn´t exist in PHP, however, you can serialize the data and put it either in a file on your hard drive or in /dev/shm/. You can also use memcache.

If you put your data in /dev/shm/ or use memcache the data will disappear on reboot.


Sadly, no. PHP's static keyword is limited to the current script instance only.

To persist data across script instances for the same session, you would use the session handling features.

To persist data across sessions, you would have to use something like memcache, however that requires additional set-up work on server side.


Symfony and other frameworks uses "PHPFastCache" who supports a wide range of drivers for caching data including APC, SQLite, MongoDB or simply your file system.

You can donwnload it at https://github.com/PHPSocialNetwork/phpfastcache

Here is an example with file caching :

use Phpfastcache\Helper\Psr16Adapter;

$defaultDriver = 'Files';
$Psr16Adapter = new Psr16Adapter($defaultDriver);

// Setter action
if(!$Psr16Adapter->has('test-key')) {
    $data = 'lorem ipsum';
    $Psr16Adapter->set('test-key', 'lorem ipsum', 300); // kept in cache for 300 seconds (5 minutes)
}

// Getter action
else {
    $data = $Psr16Adapter->get('test-key');
}


You can use the Session Storage for this purpose, if you use the same sessionId for all sessions.

session_id('xyz');
session_start();
for ($i=0; $i < 100000; $i++) {
    $_SESSION['counter'] = isset($_SESSION['counter']) ? $_SESSION['counter'] + 1 : 0;
}
echo "<br>session_id(): ".session_id() . "<br>counter: ".$_SESSION["counter"];

Try this script with 2 browsers and you will see that this method shares the data across both browsers - and is very, very fast.


you could store serialized copies of an object inside session

class test{
  private static $instance;
  public property;
  private __construct(){}
  public getInstace(){
    if(!self::$instance){
      self::$instance = new test;
    }
    return self::$instance;
  }
}

$p = test->getInstance();
$p->property = "Howdy";
$_SESSION["p"] = $p;

next page

$p = $_SESSION["p"];
echo $p->property; // "Howdy"
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜