1

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");
    }
4

0 に答える 0