我有两个相同的虚拟机,包含在不同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中包含的文件以外的文件中?
答案 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更新破坏的内容时,我不会介入在计算机之间传输会话文件的业务。