可以在2个apache php实例之间传输会话

时间:2016-07-11 22:23:52

标签: php session

我有两个相同的虚拟机,包含在不同IP上运行的Ubuntu 16.04,Apache 2.4和PHP 7.0.4。

在两个虚拟机中,我都有一个脚本执行一些简单的会话过程。

<?php
session_start();
if (!isset($_SESSION['count'])) {
  $_SESSION['count'] = 0;
} else {
  $_SESSION['count']++;
}
echo $_SESSION['count'];
?>

第一个VM每分钟都会被一个客户端访问,并且相应的计数器会增加。另一个不是。我想以某种方式同步两台机器的状态。

当我将从/ var / lib / php / sessions生成的文件传输到另一台机器时,我注意到计数器再次从零开始。

我想通过从两台机器传输文件来实现的目标是什么?会话信息是否也保存在/ var / lib / php / sessions中包含的文件以外的文件中?

1 个答案:

答案 0 :(得分:0)

最大的问题是PHP / HTML它是无状态的,一个客户端的$ _​​SESSION值对另一个客户端会有所不同。实现此功能的唯一方法是将$ _SESSION值保存为有状态的数据库或文件。然后,向第一台机器添加一个简单的REST接口,允许第二台机器检索文件内容。下面的代码未经测试,但提出了一般的想法。

    //Machine 1
    <?php
    $secret_key = 'secret123'; //Same on both machines, make this a long string of random charecters

    session_start();
    if (!isset($_SESSION['count'])) {
        $_SESSION['count'] = 0;
    } else {
        $_SESSION['count']++;
    }

    //Write the count value to a file
    $countFile = fopen('count.txt','w');
    fwrite($countFile,$_SESSION['count']);
    fclose($countFile);



    //Handle requests from machine 2
    if(isset($_GET['request_count'])) {
        if($_GET['request_count'] == $secret_key) {
            echo file_get_contents('count.txt');
            exit;
        }
    }

    echo $_SESSION['count'];
    ?>

    //Machine 2
    <?php
    $secret_key = 'secret123';
    $machine_1_URL = 'localhost';

    //Init curl
    $ch = curl_init();
    curl_setopt_array($ch, array(
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_URL => $machine1URL . "/?request_count=" . $secret_key
    ));

    //Get the data from machine 1
    echo curl_exec($ch);

    //Alternatively you can set the value like this:
    $_SESSION['count'] = intval(curl_exec($ch));
    ?>

当您可以使用经过良好测试的已知方法而不是可能被PHP更新破坏的内容时,我不会介入在计算机之间传输会话文件的业务。