Php 多服务器文件存储和共享导致网站挂起-同一服务器上的其他网站保持可访问状态

Php 多服务器文件存储和共享导致网站挂起-同一服务器上的其他网站保持可访问状态,php,mysql,Php,Mysql,我正在尝试制作一个系统,其中文件存储在主服务器上,如果用户选择,这些文件可以复制到备份服务器上,以防止硬盘崩溃时数据丢失,但这并没有按计划进行。当文件从主服务器复制到备份服务器时,整个网站将挂起。在所有传输完成之前,任何人都不能再访问该网站 奇怪的是,运行在同一台lighttpd服务器上的其他网站仍然可以访问,甚至phpmyadmin也继续使用卡车 步骤1: -首先,在mysql表“redundfilesjobs”中为需要比当前更多备份服务器的文件创建一个“作业”。 -然后,为该作业分配一个可用

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

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

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

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

sendfilestoserver($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());
            }
        }
    }
    }
?>

我想我可能已经将问题追溯到我的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/>";
    }
?>