gpt4 book ai didi

php - 多服务器文件存储和共享导致网站挂起 - 同一服务器上的其他网站仍然可以访问

转载 作者:行者123 更新时间:2023-11-29 09:04:03 24 4
gpt4 key购买 nike

我正在尝试创建一个系统,其中文件存储在主服务器上,如果用户选择,可以将这些文件复制到备份服务器上,以防止硬盘崩溃时数据丢失,但这并没有按计划进行。当文件从主服务器复制到备份服务器时,整个网站会挂起。在所有传输完成之前,任何人都无法再访问该网站。

奇怪的是,在同一个 lighttpd 服务器上运行的其他网站仍然可以访问,甚至 phpmyadmin 也继续运行。

第 1 步:-首先,在 mysql 表“redundfilesjobs”中为需要比当前更多备份服务器的文件创建一个“作业”。-然后,将可用的备份服务器分配给该作业

第 2 步:- 用户批准一次分配了服务器的所有作业后,每个作业都会被复制到“redundfiles”,其中“processed”字段设置为 0,之后立即调用“sendfilestoservers”函数- 构建了 sendfilestoservers 函数,因此它可以接受预定义的发送作业,也可以发送“已处理”字段设置为 0 的所有文件- 在这种情况下,它会使用需要处理的预定义作业 ID 进行调用

sendfilestoservers($lastid);

功能:

<?php
function sendfilestoservers($specificjob){

if($specificjob != ''){ $result = mysql_query("SELECT * FROM redundfiles WHERE processed=0 and id=$specificjob"); }
else{ $result = mysql_query("SELECT * FROM redundfiles WHERE processed=0"); }

while($row = mysql_fetch_array($result))
{
$fileid=$row['fileID'];
$result2 = mysql_query("SELECT files.name, files.subfolder, mainservers.path, mainservers.ftpaddress FROM files LEFT JOIN mainservers ON files.serverID = mainservers.id WHERE files.id=$fileid");
while($row2 = mysql_fetch_array($result2))
{
$serverid = $row['serverID'];
$result3 = mysql_query("SELECT * FROM redundservers WHERE id=$serverid");
while($row3 = mysql_fetch_array($result3))
{
file_get_contents($row3['sendfileaddress'].'?f='.$row2['name']."&fo=$row2[subfolder]&ftpaddress=$row2[ftpaddress]&mspath=$row2[path]");

$sql = "UPDATE redundfiles SET processed=1 WHERE id='".$row['id']."'";
mysql_query($sql) or die(mysql_error());
}
}
}
}
?>

//正如你所看到的,它调用指定的备份服务器的地址(例如: http://user:pass@serverX.XXX.XX/get.php )来接收文件,并发送指令:文件名、它在主服务器上的文件夹、ftp 地址主服务器,以及主服务器上存储所有文件的路径(在各自的子文件夹内)//备份服务器现在将处理所有这些 GET 值,并最终使用 linux 的 wget 通过 FTP 从主服务器检索文件

备份服务器X上的配置

<?php
$filename = $_GET['f']; //Filename
$subfolder = $_GET['fo']; //Folder file is stored in
$mainserverID = $_GET['ms']; //Main server the file resides on
$mainserverpath = $_GET['mspath']; //Path on the main server where all the files are stored
$mainserverftpaddress = $_GET['ftpaddress']; //Main server's FTP address or IP, as it may differ from the web address.
$dlto = "/var/www/serverX.XXX.XXX/"; //This backup server's main path. This needs to be changed on every backup server.
$dltodir = "files"; //Folder files are stored in (follows $dlto)
$serverID = $_GET['s']; //Backup-servers ID as it's stored in the main servers database, some other scripts use this.

function execOutput($command) {
$output = array($command);
exec($command.' 2>&1', $output);
return implode("\n", $output);
}
?>

备份服务器 X 上的“get.php”脚本

<?php
include("config.php");

if (file_exists($dltodir.'/'.$subfolder.'/'.$filename))
{
}
else
{
exec('mkdir '.$dlto.$dltodir.'/'.$subfolder);
exec('chmod 777 '.$dlto.$dltodir.'/'.$subfolder);
exec('wget ftp://user:pass@'.$mainserverftpaddress.'/'.$mainserverpath.'/'.$subfolder.'/'.$filename.' -P '.$dlto.$dltodir.'/'.$subfolder);

}
?>

//然后我们返回步骤 2 获取下一个批准的文件。

第一步(在“redundfilesjobs”中创建作业并将作业复制到“redundfiles”)进展很快,我没有注意到它们导致挂起。但由于某种原因,实际发送(或者更确切地说,让备份服务器检索它)只会使网站卡住。

我希望我提供了每个人所需的所有信息,以了解系统应该如何工作。谁能告诉我为什么整个网站挂起并且在复制所有文件之前每个人都无法访问?

最佳答案

我想我可能已经将问题追溯到我的 php-fpm 配置。虽然我还不是100%确定,但它现在似乎正在发挥作用。如果有人遇到类似问题,值得一试;

我有:

pm = dynamic
pm.max_children = 2
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 1

我改为;

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

由于某些奇怪的原因,之前的配置在 file_get_contents() 方面存在问题。我使用以下脚本来测试它;

<?php
//phpinfo();
if(isset($_GET["loop"])) $loop = $_GET["loop"];
if(isset($_GET["show"])) $show = true;

if(isset($_GET["s"]))
{
if($_GET["s"] == "ser") $address = "http://www.this-server.com/some_file.php";
elseif($_GET["s"] == "com") $address = "http://www.external-server.com/some_file.php";
}else die("s not set");

if(!isset($loop)||!is_numeric($loop))
echo file_get_contents($address);
else
{
$count = 1;
$success = 0;
while(($count-1) < $loop)
{
$got = file_get_contents($address);
if(!is_bool($got) && $got !== false)
{
if(isset($show)) echo $count." : ".$got."<br/>";
$success++;
}
$count++;
}
echo "We had $success successful file_get_contents.<br/>";
}
?>

如果我访问 script.php?s=serv 并多次发送 F5 垃圾邮件,则属于当前网站的 php-fpm 进程将挂起。不过,script.php?s=com 工作得很好。

同样有效的方法是在第二台服务器上进行相反的操作。

工作正常的是运行循环(script.php?s=ser&loop=50&show)而不是垃圾邮件F5。这就是我觉得特别奇怪的地方。似乎这不是它遇到问题的请求数量。并且 file_get_contents() 本身也不是(因为只要请求的文件不在同一服务器上,即使在发送垃圾邮件 F5 时它也可以工作)。

结论;

使用旧配置,在包含 file_get_contents() 的脚本上通过 F5 发送垃圾邮件并调用同一服务器上的文件,会导致 php-fpm 进程挂起。

我对此感到有点困惑......

关于php - 多服务器文件存储和共享导致网站挂起 - 同一服务器上的其他网站仍然可以访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7621625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com