Php 多服务器文件存储和共享导致网站挂起-同一服务器上的其他网站保持可访问状态
我正在尝试制作一个系统,其中文件存储在主服务器上,如果用户选择,这些文件可以复制到备份服务器上,以防止硬盘崩溃时数据丢失,但这并没有按计划进行。当文件从主服务器复制到备份服务器时,整个网站将挂起。在所有传输完成之前,任何人都不能再访问该网站 奇怪的是,运行在同一台lighttpd服务器上的其他网站仍然可以访问,甚至phpmyadmin也继续使用卡车 步骤1: -首先,在mysql表“redundfilesjobs”中为需要比当前更多备份服务器的文件创建一个“作业”。 -然后,为该作业分配一个可用的备份服务器 步骤2: -用户一次批准所有分配了服务器的作业后,每个作业都会复制到“redundfiles”中,字段“processed”设置为0,然后立即调用“sendfilestoservers”函数 -SendFileToServers函数的构建使其既可以接受用于发送的预定义作业,也可以发送字段“processed”设置为0的所有文件 -在这种情况下,将使用需要处理的预定义作业ID调用它 sendfilestoserver($lastid) 职能:Php 多服务器文件存储和共享导致网站挂起-同一服务器上的其他网站保持可访问状态,php,mysql,Php,Mysql,我正在尝试制作一个系统,其中文件存储在主服务器上,如果用户选择,这些文件可以复制到备份服务器上,以防止硬盘崩溃时数据丢失,但这并没有按计划进行。当文件从主服务器复制到备份服务器时,整个网站将挂起。在所有传输完成之前,任何人都不能再访问该网站 奇怪的是,运行在同一台lighttpd服务器上的其他网站仍然可以访问,甚至phpmyadmin也继续使用卡车 步骤1: -首先,在mysql表“redundfilesjobs”中为需要比当前更多备份服务器的文件创建一个“作业”。 -然后,为该作业分配一个可用
<?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());
}
}
}
}
?>
我想我可能已经将问题追溯到我的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
由于某种奇怪的原因,以前的配置在文件\u get\u 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进程将挂起<然而,code>script.php?s=com
运行良好
同样有效的是,在第二台服务器上运行,然后以另一种方式运行
同样有效的是运行循环(script.php?s=ser&loop=50&show
)而不是滥发F5。这就是我觉得特别奇怪的地方。看起来liek这不是它有问题的请求数量。而且文件_get_contents()本身也不是这样(因为只要请求的文件不在同一台服务器上,即使是在发送F5垃圾邮件时,它也可以工作)
结论
在旧配置中,在包含文件_get_contents()的脚本上滥发F5并调用同一服务器上的文件,会导致php fpm进程挂起
我有点困惑于这个
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
<?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/>";
}
?>