PHPメールアプリが実行されている3つのメールサーバーがあります。別のサーバーで.NETジョブを実行して、Facebookから連絡先の写真をアップロードし、NASの一時的な場所に保存してから、PHPメールアプリを呼び出して、一時的な場所から連絡先レコードに画像を移動するように指示します。
このジョブは、コードを変更せずに正常に機能し、メールサーバーは1つしかなく、一時ファイルはローカルに保存されていました。NASボックスに一時ファイルを配置した負荷分散構成に移行したので、タイミングの問題が発生します。
.NETアプリでは、写真をダウンロードした後、メールアプリにリクエストを送信する前に、FileInfo
オブジェクトを取得して、ファイルが存在するかどうかを確認します。次に、リクエストをPHPに送信します。これにより、次のメッセージが断続的にスローされます。failed to open stream: No such file or directory
ただし、.NETにチェックfi.Exists
インした後、リクエストを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");
}