Discussion:
PHP est-il multi-tache ?
(trop ancien pour répondre)
Denis Beauregard
2009-02-28 20:17:24 UTC
Permalink
Bonjour,

Je me pose la question en objet : PHP est-il multi-tâche ?

En d'autres mots, supposons que je lance une tâche qui dure
disons 10 secondes (c'est un exemple) durant lesquelles j'ouvre
un fichier, je lis une valeur au début, je la manipule et à la
fin, je la replace dans le fichier (en mySQL par exemple ou même
dans un simple fichier texte sur le serveur). Après 3 secondes,
un autre usager demande la même page avec une requête moins
compliquée et après 5 secondes, le système replace la valeur
dans le même fichier.

Est-ce que j'aurai, par la suite, la valeur saisie par le 1er
visiteur ou celle du 2e ?

Comme application :


J'ai un fichier de statistiques sur les visiteurs d'un site.
Je reçois une requête puis j'ajoute 1 au nombre de requêtes pour
la journée. Si PHP est multi-tâche, les requêtes de 2 visiteurs
peuvent se chevaucher, mais s'il ne l'est pas, la 1re requête est
traitée au complet avant la 2e.

Dans mon cas, vu le nombre de visiteurs, le risque d'erreur est
très faible et ce serait une erreur de 1 ou 2 dans les statistiques,
ce qui n'est pas important en soi. Mais je suis tout de même
curieux...


Denis
Sylvain SF
2009-02-28 22:02:22 UTC
Permalink
Post by Denis Beauregard
Je me pose la question en objet : PHP est-il multi-tâche ?
vu le détail de la question, celle-ci est plutôt un script
peux-t-il s'exécuter de manière concurrentielle (plusieurs
fois simultanément dans différents process serveur) ?
la réponse est bien sur oui, un serveur http sert plusieurs
pages en même temps.
Post by Denis Beauregard
J'ai un fichier de statistiques sur les visiteurs d'un site.
Je reçois une requête puis j'ajoute 1 au nombre de requêtes pour
la journée. Si PHP est multi-tâche, les requêtes de 2 visiteurs
peuvent se chevaucher, mais s'il ne l'est pas, la 1re requête est
traitée au complet avant la 2e.
l'incrémentation incorrecte viendrait d'un traitement incorrect;
si vous faites:

$count = getCounterFromLog(...);
/*
long process
*/
storeCounterInLog(..., $count + 1);

le compteur sera faux car la cinématique est très mauvaise
(non pertinente).

si par contre, vous faites:
SQL_EXEC("update t_stats set counter=counter+1");

l'incrémentation correcte sera garantie par le serveur SQL.
(MYSQL = "mysql_query" ou autres).

Sylvain.

Loading...