Intereting Posts
изменить формат даты, используя php Создать пользователя с подготовленным заявлением MySQLi как извлекать данные из необработанного html-файла Настройка DomainKeys / DKIM в PHP-SMTP-клиенте Невозможность обновления Laravel 5.1 до 5.2 (это противоречит вашим требованиям или минимальной стабильности) PHP: Что делает pcntl_fork ()? «Количество столбцов не соответствует количеству значений в строке 1» Статические свойства PHP, Наследование и ключевое слово self Нулевой коалесцирующий оператор C # (?) В PHP? Ошибка сайта: доступ к php-проекту PHP-гнездовая переменная в эхо-строке, которая содержит тег HTML в конце Может ли PHP «писать» или «копировать» на удаленном удаленном ресурсе, но не «отключать» или «переименовывать» («Доступ запрещен») Преобразование объекта объекта PHP Symfony2 для использования в Javascript Как создать переменную в PHP сегодняшней даты формата MM / DD / YYYY? Как сделать даты синтаксиса strtotime в формате австралийского (т.е. Великобритании): dd / mm / yyyy?

Проблемы с синхронизацией сети, вызывающие PHP, «не удалось открыть поток: нет такого файла или каталога»

У нас есть три почтовых сервера с работающими на них почтовыми приложениями PHP. У нас есть работа .NET, работающая на отдельном сервере, который загружает фотографии контактов из facebook, сохраняет их во временном местоположении на NAS, а затем вызывает приложение PHP mail, чтобы сообщить ему, чтобы переместить изображение из временного местоположения в запись контакта.

Это задание, без изменений кода, отлично работало, у нас был только один почтовый сервер, причем временные файлы хранятся локально на нем. Теперь, когда мы перешли к конфигурации с балансировкой нагрузки, с временными файлами в ящике 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"); }