Несколько записей заданий в одном файле [дубликат]

$name = $_POST['name'];
$email = $_POST['email'];
$reciver = '/* Reciver Email address */';
if (filter_var($reciver, FILTER_VALIDATE_EMAIL)) {
    $subject = $name;
    // To send HTML mail, the Content-type header must be set.
    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers .= 'From:' . $email. "\r\n"; // Sender's Email
    //$headers .= 'Cc:' . $email. "\r\n"; // Carbon copy to Sender
    $template = '<div style="padding:50px; color:white;">Hello ,<br/>'
        . '<br/><br/>'
        . 'Name:' .$name.'<br/>'
        . 'Email:' .$email.'<br/>'
        . '<br/>'
        . '</div>';
    $sendmessage = "<div style=\"background-color:#7E7E7E; color:white;\">" . $template . "</div>";
    // Message lines should not exceed 70 characters (PHP rule), so wrap it.
    $sendmessage = wordwrap($sendmessage, 70);
    // Send mail by PHP Mail Function.
    mail($reciver, $subject, $sendmessage, $headers);
    echo "Your Query has been received, We will contact you soon.";
} else {
    echo "<span>* invalid email *</span>";
}
-1
задан Deduplicator 24 February 2016 в 18:56
поделиться

2 ответа

Добавление поддержки CLR к вашему C ++-приложению только для того, чтобы получить класс Mutex чрезмерно. Существует несколько вариантов синхронизации вашего доступа к файлам между двумя приложениями.

Вариант 1: Mutex

Если вам нужно записать файл из нескольких процессов, использование мьютекса - это хороший способ сделать это. Используйте функции mutex в Win32 API. (Класс .Net Mutex - это всего лишь оболочка вокруг этих функций.)

HANDLE mutex = CreateMutex(NULL, false, "MyMutex");

DWORD waitResult = WaitForSingleObject(mutex, INFINITE);
if (waitResult == WAIT_OBJECT_0)
{
    // TODO: Write the file
    WriteFile(...);

    ReleaseMutex(mutex);
}

Как уже отмечалось в другом ответе, вам нужно будет открыть файл с общим доступом, чтобы обе ваши приложения могли открывать это сразу. Однако этого может быть недостаточно: если оба ваших приложения пытаются записать в одну и ту же область файла, вам все равно нужно будет убедиться, что одновременно записывается только одно приложение. Представьте, что если оба приложения смотрят на размер файла, то оба попытаются одновременно записать на это смещение байта: даже если оба пытались просто добавить к концу файла, они оказались сбиты друг с другом.

Вариант 2: Открыть только как добавление

Если вы чисто записываете в конец файла и никогда не пытаетесь ничего прочитать или писать где-нибудь, кроме самого конца файла , то есть специальный режим, который вы можете использовать, что позволит вам не использовать мьютекс. Если вы откроете файл с dwDesiredAccess, установленным на FILE_APPEND_DATA | SYNCHRONIZE, и больше ничего (не включите FILE_WRITE_DATA), тогда ОС позаботится о том, чтобы все данные, которые были записаны в файл в конце, и два приложения, записывающие данные, не перезаписывают друг друга. Это поведение задокументировано на MSDN :

Если установлены только флаги FILE_APPEND_DATA и SYNCHRONIZE, вызывающий может писать только в конец файла и любую информацию о смещении о записи в файл игнорируется.

Опция 3: LockFile

Еще один путь, который вы можете предпринять, - использовать LockFile. С помощью LockFile (или LockFileEx ) вы можете открыть оба файла для обоих приложений и заблокировать каждый файл раздела файла, который он хочет записать, , Это дает вам более гранулярность, чем мьютекс, позволяя одновременно выполнять неперекрывающиеся записи. (Использование LockFile для всего файла даст вам тот же базовый эффект, что и мьютекс, с дополнительным преимуществом, которое предотвратит использование другими приложениями файла при этом.) Есть хороший пример того, как использовать LockFile на блоге Раймонда Чена .

3
ответ дан David Yaw 21 August 2018 в 21:40
поделиться

На самом деле вам не нужно использовать отдельный мьютекс вообще, вы можете просто использовать сам файл. Когда файл открывается с вызовом API CreateFile (см. https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx?f=255& ; MSPPError = -2147217396 ), вызов принимает параметр dwShareMode, который указывает, какой параллельный доступ разрешен другими процессами. Значение 0 будет препятствовать открытию файла другими процессами.

Практически все API-интерфейсы открывают карту файла CreateFile под капотом, поэтому clr может делать правильные действия для вас, когда вы открываете файл для записи уже.

В среде выполнения C также есть _fsopen, который позволяет вам открыть файл aa с помощью флагов обмена.

Я бы рекомендовал вам проверить, что такое режим совместного использования по умолчанию, когда вы открываете файл с C #. Если это не препятствует одновременному открытию для записи по умолчанию, используйте _fsopen из C (или, возможно, имеется соответствующая функция C #).

1
ответ дан Sami Sallinen 21 August 2018 в 21:40
поделиться