1

我们有三台运行 PHP 邮件应用程序的邮件服务器。我们有一个在单独的服务器上运行的 .NET 作业,它从 facebook 上传联系人照片,将它们存储在 NAS 上的临时位置,然后调用 PHP 邮件应用程序告诉它将图像从临时位置移动到联系人记录中。

这项工作没有代码更改,运行良好,我们只有一个邮件服务器,临时文件存储在本地。现在我们转移到负载平衡配置,将临时文件放在 NAS 盒子上,出现了奇怪的时间问题。

在我们的 .NET 应用程序中,下载照片后,在将请求发送到我们的邮件应用程序之前,我们获取一个FileInfo对象并检查文件是否存在,以确保确定。然后我们将请求发送到 PHP,它现在间歇性地抛出:failed to open stream: No such file or directory

但是,如果在检查fi.Exists.NET 之后,在将请求发送到 PHP 之前,我们输入了一个Thread.Sleep(n)错误减少。睡眠时间越长,PHP 说文件不存在的频率就越低。

所以该文件存在,但由于某种原因,如果我们在下载后过早访问它,PHP 会认为它不存在。

该代码包括检查文件是否已完全下载并且未标记为只读。

任何想法可能导致此问题?

public void Save(string tempPath, string username, string password, bool deleteSrc, string merakController = "", string fileNamePrefix = "")
    {
        FileInfo fi = new FileInfo(tempPath);
        if (fi.Exists)
        {
            Name = (fileNamePrefix ?? string.Empty) + fi.Name;
            FileSize = fi.Length;
            TimeStamp = fi.LastWriteTimeUtc;
            string path = fi.FullName;

            if (string.IsNullOrEmpty(Type))
                throw new Exception("Attachment Type not set");

            IceWarpGroupware_Http gwh = new IceWarpGroupware_Http(username, password);
            string parameters = string.Format("AttName={0}&AttType={1}&AttDesc={0}&AttSize={2}&AttTime={3}", Name, Type, FileSize, Time);

            fi.Refresh();
            if (fi.Length != FileSize)
                throw new Exception("It was still downloading?");//this has never been thrown, so thats not it
            if (fi.IsReadOnly)
                throw new Exception("read only"); //again, never hit, so thats not it

            //adding this line makes it work 100% of the time -- reducing the sleep time makes it start to throw "failed to open stream: No such file or directory" intermittently
            System.Threading.Thread.Sleep(15000);

            bool result = gwh.AddAttachment(m_oid, path, parameters, string.Empty, merakController);
            if (!result)
                throw new Exception("Unable to add attachment \"" + Name + "\"");

            try
            {
                if (deleteSrc)
                    fi.Delete();
            }
            catch { }
        }
        //else
        //  throw new Exception("Temp file not found");
    }
4

0 回答 0