7
votes

Comment écrire dans le fichier dans la grande application PHP (plusieurs questions)

Quelle est la meilleure façon d'écrire dans des fichiers dans une grande application PHP. Disons qu'il y a beaucoup d'écritures nécessaires par seconde. Comment est la meilleure façon d'y aller.

Puis-je simplement ouvrir le fichier et ajouter les données. Ou devrais-je ouvrir, verrouiller, écrire et déverrouiller.

Que se passera-t-il du fichier et d'autres données doivent être écrits. Cette activité sera-t-elle perdue ou sera-t-elle sauvée. et si cela sera sauvegardé, la demande est arrêtée.

Si vous avez été, merci de lire!


0 commentaires

7 Réponses :


4
votes

Si la concurrence est un problème, vous devez vraiment utiliser des bases de données.


2 commentaires

J'écris à un fichier journal. L'écriture dans la base de données si elle est déjà importante, donc pour le fichier journal, je voudrais simplement écrire dans le fichier.


Les fichiers sont censés être simultanés aussi.



0
votes

Utilisez FLOCK ()

Voir ce Question


0 commentaires

-3
votes

Si vous avez juste besoin d'ajouter des données, PHP devrait être correct avec cela, car le système de fichiers devrait prendre soin de simultanément append.


3 commentaires

Les systèmes de fichiers Linux standard font certainement pas "prennent soin de soin" d'appendre simultanément. Pour un exemple simple de la raison de la raison, imaginez ceci: deux processus ouvrent le même fichier dans des millisecondes les uns des autres et annoncez un concert de données à 100 meumètres par seconde - signifiant une durée d'écriture de 10 secondes pour chaque processus. Comment le système de fichiers serait-il garantit que les écritures ne se chevauchent pas? Est-il censé tamponner les données du deuxième processus jusqu'à ce que le premier processus se termine?


Eh bien, puisque vous utilisez un exemple absurde absurde, je vais simplement dire ceci: PHP est incapable d'appuyer de 100 meules par seconde, ni cela ne peut traiter ces données. Bien que vous puissiez être correct sur les situations hypothétiques comme celle-ci, la réalité est une chose différente et comme une personne décrite ci-dessus, Ajout simplement fonctionne. mangez ça.


Publié un exemple simple et réel montrant plusieurs ajouts simultanés sur l'autre. Stackoverflow.com/questions/2358818/...



6
votes

Je dispose d'une application multi-filtrée hautes performances, où toutes les threads écrit (ajoute) au fichier journal unique. Jusqu'à présent n'a pas remarqué aucun problème avec cela, chaque fil écrit plusieurs fois par seconde et rien ne se perd. Je pense que simplement ajouter un fichier énorme ne devrait pas être un problème. Mais si vous souhaitez modifier le contenu déjà existant, en particulier avec la concurrence - j'irais avec le verrouillage, sinon gros mess peut se produire ...


2 commentaires

+1. Je reçois des entrées qui se chevauchent dans mon journal d'accès Apache tous les jours, donc à une charge élevée, certaines pertes se produisent définitivement. Mais pour un fichier journal, les quelques rangées qui se font mal ont vraiment d'importance, et ils ne valent certainement pas la tête de verrouillage du fichier.


@Laimoncijus, voulez-vous dire qu'append atomique?



9
votes

Voici un exemple simple qui met en évidence le danger des wites simultanés:

<?php
for($i = 0; $i < 100; $i++) {
 $pid = pcntl_fork();
 //only spawn more children if we're not a child ourselves
 if(!$pid)
  break;
}

$fh = fopen('test.txt', 'a');

//The following is a simple attempt to get multiple threads to start at the same time.
$until = round(ceil(time() / 10.0) * 10);
echo "Sleeping until $until\n";
time_sleep_until($until);

$myPid = posix_getpid();
//create a line starting with pid, followed by 10,000 copies of
//a "random" char based on pid.
$line = $myPid . str_repeat(chr(ord('A')+$myPid%25), 10000) . "\n";
for($i = 0; $i < 1; $i++) {
    fwrite($fh, $line);
}

fclose($fh);

echo "done\n";


0 commentaires

1
votes

Si vous n'écrivez simplement que des journaux, vous devez peut-être jeter un oeil à la fonction Syslog, car SYSLOG fournit une API. Vous devriez également déléguer écrit à un backend dédié et faire le travail dans un mannequin asynchronaire?


0 commentaires

1
votes

Ce sont mon 2p.

Sauf si un fichier unique est nécessaire pour une raison spécifique, je vais éviter d'ajouter tout à un fichier énorme. Au lieu de cela, je serais envelopper le fichier par heure et dimension. Un couple de paramètres de configuration (Wrap_Time et Wrap_Size) pourraient être définis pour cela.

En outre, j'introduisais probablement une tampon pour éviter d'attendre l'opération d'écriture à compléter.

Probablement PHP n'est pas la langue la plus adaptée à ce type d'opérations, mais cela pourrait toujours être possible.


0 commentaires