Maison > Article > développement back-end > Une brève introduction aux verrous de fichiers PHP et aux verrous de processus
Cet article présente principalement les exemples d'utilisation du verrouillage de fichier PHP et du verrouillage de processus. L'éditeur pense que c'est assez bon, je vais donc le partager avec vous maintenant et le donner comme référence. Suivons l'éditeur pour y jeter un œil.
Compte tenu de l'introduction de swoole auparavant, utilisons le mécanisme serveur/client et multi-processus de swoole pour expliquer le verrouillage.
Ceci est uniquement pour PHP. Le mécanisme de verrouillage sera expliqué. Étant donné que les verrous SQL sont différents de leurs modes d'action et de leurs scénarios d'application, ils seront expliqués séparément
1. >
2. Fichiers participants I Traiter la file d'attente et le blocage artificiel de /O ;
3. Protéger le contenu du fichier dans la logique métier ;
Ce qui suit est le fichier lock C/S mécanisme de communication Le processus de communication spécifique a été omis pour l'utilisation de ):
//监听数据发送事件 $serv->on('receive', function ($serv, $fd, $from_id, $data) { $serv->send($fd, "ServerEnd"); $p_file = "locktest.txt"; var_dump(file_get_contents($p_file)); });Résultat :
$s_recv = "ww"; $p_file = "locktest.txt"; $o_file = fopen($p_file,'w+'); // flock()加锁方式: flock($o_file,LOCK_EX); // // swoole加锁方式: // $lock = new swoole_lock(SWOOLE_FILELOCK, $p_file); // $lock->lock(); fwrite($o_file, 'ss' . $s_recv); sleep(30); // 两种解锁方式 // flock($o_file, LOCK_UN); // $lock->unlock();
Il est à noter que :
$s_recv = "xx"; $p_file = "locktest.txt"; $o_file = fopen($p_file,'w+'); // flock()加锁方式: flock($o_file,LOCK_EX); // // swoole加锁方式: // $lock = new swoole_lock(SWOOLE_FILELOCK, $p_file); // $lock->lock(); fwrite($o_file, 'ss' . $s_recv); // 两种解锁方式 // flock($o_file, LOCK_UN); // $lock->unlock();1. Qu'il s'agisse de flock() ou de swoole_lock() fournis par swoole, il existe un mécanisme pour se déverrouiller automatiquement lorsque le processus se termine, il peut donc fonctionner normalement même sans déverrouillage manuel dans la démo, voici donc le chapitre Un client exécute la fonction de pause sleep() pour observer l'effet du verrouillage du fichier
[l0.16@4 m29.5% c30s04] $ php swoole_client2.php
À la différence du verrouillage de fichiers, le verrouillage de processus n'est pas utilisé pour empêcher les E/S sur les fichiers, il est utilisé pour éviter les conséquences inattendues causées par la concurrence multi-processus. Par conséquent, il est nécessaire de mettre plusieurs files d'attente en file d'attente. processus lorsqu'ils sont simultanés, c'est-à-dire bloquer d'autres processus simultanés avant la fin de l'exécution logique clé d'un processus
Il existe plusieurs idées d'implémentation :
. 1. Utilisez le verrouillage de fichier flock() pour créer un fichier de verrouillage temporaire et utilisez LOCK_NB pour simuler un flux bloquant ou non bloquant, puis utilisez des conditions de jugement pour contrôler l'exécution de la logique à l'intérieur du processus Modèle non bloquant ; démo :
2. Utilisez la mémoire partagée fournie par swoole , la méthode de cache ou la méthode de communication transfère une variable globale dans différents processus une fois que le processus a obtenu le statut. de la variable, il utilise des conditions de jugement pour contrôler l'exécution de la logique ; Il existe de nombreuses façons de transférer des variables. Voici une seule idée, qui est memcached à titre d'exemple ; démo du modèle :
Ce qu'il faut noter ici est :
$p_file = "locktest.txt"; $o_file = fopen($p_file, 'w+'); // 如果临时文件被锁定,这里的flock()将返回false if (!flock($o_file, LOCK_EX + LOCK_NB)) { var_dump('Process Locked'); } else { // 非阻塞模型必须在flock()中增加LOCK_NB参数 // 当然,这里取消LOCK_NB参数就是阻塞模型了 flock($o_file, LOCK_EX + LOCK_NB); var_dump('Process Locking'); // 模拟长时间的执行操作 sleep(10); }1. memcached ne peut pas être inférieur à la durée réelle d'exécution du programme, il est donc recommandé d'être légèrement plus long et de recycler une fois l'exécution logique terminée
3. Dans les applications pratiques, il est nécessaire de définir un délai de nouvelle tentative, qui peut être défini. très pratique Réduisez dans une large mesure une grande quantité de concurrence d'E/S pour memcached et réduisez la pression du serveur
;
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!