我们有三台运行 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");
}