


PHP utilise simplement la fonction shmop pour créer de la mémoire partagée afin de réduire la charge du serveur
Cet article présente principalement comment PHP utilise simplement la fonction shmop pour créer de la mémoire partagée afin de réduire la charge du serveur. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer
. Dans l'article précédent Ce blog [Comprendre le concept, les avantages et les inconvénients de la mémoire partagée] a déjà expliqué le concept de mémoire partagée. Utilisons simplement la mémoire partagée (en fait, vous pouvez également utiliser d'autres outils, comme redis)
PHP dispose de deux ensembles d'interfaces pour le partage de mémoire. L'un est shm, qui est en fait un partage de variables et sérialisera les variables d'objet avant de les stocker. Il est assez pratique à utiliser, mais le stockage sérialisé n'a aucun sens pour les opérations d'accès à la mémoire qui privilégient l'efficacité. L'autre est shmop, qui est commun à Linux et Windows, mais sa fonction est plus faible que shm Sous Linux, ces fonctions sont directement implémentées en appelant la série de fonctions shm*, tandis que sous Winodows, elles sont également implémentées par le système d'encapsulation. fonctions. a fait le même appel. Ce que j'utilise ici en premier, c'est shmop.
Pour créer un segment de mémoire partagée, vous devez utiliser la fonction shmop, puis vous devez activer l'extension. Vous pouvez vous référer à [Activer l'extension shmop pour PHP pour implémenter la mémoire partagée].
La fonction principale de shmop
shmop_open (créer ou ouvrir un bloc de mémoire partagée), shmop_write (écrire des données dans un bloc de mémoire partagée), shmop_read (lire des données à partir d'un bloc de mémoire partagée) , shmop_size (obtenir la taille d'un bloc de mémoire partagée), shmop_close (fermer le bloc de mémoire partagée), shmop_delete (supprimer un bloc de mémoire partagée)<?php //创建一块共享内存 $shm_key = 0x4337b101; $shm_id = @shmop_open($shm_key, 'c', 0644, 1024); //读取并写入数据 $data = shmop_read($shm_id, 0, 1024); shmop_write($shm_id, json_encode($data), 0); $size = shmop_size($shm_id); //获取内存中实际数据占用大小 //关闭内存块,并不会删除共享内存,只是清除 PHP 的资源 shmop_close($shm_id);
shmop_open (créer un segment de mémoire)
Le premier qui apparaît dans cette fonction. Le problème est le paramètre ID système. Il s'agit d'un numéro qui identifie le segment de mémoire partagée dans le système. Le deuxième paramètre est le mode d'accès, qui est très similaire au mode d'accès de la fonction fopen. Vous pouvez accéder à un segment mémoire selon 4 modes différents : mode "a", qui permet d'accéder aux segments mémoire en lecture seule, accès en lecture seulemode "w", qui permet d'accéder segments de mémoire en lecture seule Segment de mémoire pour la lecture et l'écriture, lecture et écriture
mode "c", il crée un nouveau segment de mémoire, ou si le segment de mémoire existe déjà, essayez de l'ouvrir pour la lecture et l'écriture
mode "n", cela crée une nouvelle mémoire. Si le segment avec la même clé existe déjà, la création échouera dans un souci d'utilisation sûre de la mémoire partagée.
Le troisième paramètre est l'autorisation du segment mémoire. Vous devez fournir une valeur octale ici.
shmop_write (écrire des données dans le segment mémoire)
Cette fonction est similaire à la fonction fwrite, qui a deux paramètres : la ressource de flux ouvert (renvoyée par fopen) et les données que vous souhaitez écrire. La fonction shmop_write effectue également cette tâche. Le premier paramètre est l'ID renvoyé par shmop_open, qui identifie le bloc de mémoire partagée sur lequel vous opérez. Le deuxième paramètre correspond aux données que vous souhaitez stocker et le troisième paramètre final est la position où vous souhaitez commencer l'écriture. Par défaut, nous utilisons toujours 0 pour indiquer par où commencer l'écriture. Notez que cette fonction renvoie FALSE en cas d'échec et le nombre d'octets écrits en cas de succès.shmop_read (lire les données du segment de mémoire)
La lecture des données du segment de mémoire partagée est simple. Tout ce dont vous avez besoin est un segment de mémoire ouvert et la fonction shmop_read. Cette fonction accepte certains paramètres et fonctionne comme fread. Veuillez faire attention aux paramètres ici. La fonction shmop_read acceptera l'ID renvoyé par shmop_open, que nous connaissons déjà, mais elle acceptera également deux autres paramètres. Le deuxième paramètre est l'emplacement dans le segment de mémoire à partir duquel vous souhaitez lire, et le troisième est le nombre d'octets que vous souhaitez lire. Le deuxième paramètre peut toujours être 0, indiquant le début des données, mais le troisième paramètre peut être problématique car nous ne savons pas combien d'octets nous voulons lire. C'est très similaire à ce que nous faisons dans la fonction fread, qui accepte deux paramètres : la ressource du flux ouvert (renvoyée par fopen) et le nombre d'octets que vous souhaitez lire dans le flux. Utilisez la fonction filesize (qui renvoie le nombre d'octets dans un fichier) pour le lire complètement.shmop_size (renvoie la taille réelle des données du segment mémoire)
Par exemple, nous avons ouvert un espace mémoire d'une longueur de 100 octets, mais la longueur réelle des données stockées n'est que de 90, alors la valeur renvoyée en utilisant shmop_size est de 90.shmop_delete (supprimer le segment de mémoire)
该函数仅接受一个参数:我们希望删除的共享内存 ID,这不会实际删除该内存段。它将该内存段标记为删除,因为共享内存段在有其他进程正在使用它时无法被删除。shmop_delete 函数将该内存段标记为删除,阻止任何其他进程打开它。要删除它,我们需要关闭该内存段。在创建内存块时建议key参数用常量而不用变量,否则很有可能造成内存泄露。
shmop_close(关闭内存段)
我们在对内存段进行读取和写入,但完成操作后,我们必须从它解除,这非常类似于处理文件时的 fclose 函数。打开包含一个文件的流并在其中读取或写入数据后,我们必须关闭它,否则将发生锁定。
简单测试结果查看
我是在LNMP环境下操作的,如果你也和我一样,在执行完简单的操作之后,可以使用linux命令查看一下地址和占用大小
# ipcs -m
[root@bogon ~]# ipcs -m ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 0 gdm 600 393216 2 dest 0x00000000 32769 gdm 600 393216 2 dest 0x4337b101 884750 nobody 644 1024 0
命令说明
key :共享内存的唯一的key值,共享内存通过该key来判断你读取的是哪一块内存。
shmid:当使用key来获取内存时,你获得的是这个id的值。它作为你操作内存块的标识。
owner:创建该共享内存块的用户
perms:该共享内存的读写权限,8禁止,可以是777,与文件的读写权限一致。
bytes:该内存块的大小
nattch:连接该内存块的进程数
status:当前状态,如:dest,即将删除等。
项目实际应用小案例
<?php /** * 将领技能 */ class Generalskill_model extends CI_Model { private $_memory_key = 0x4337b001; //共享内存地址key private $_memory_size = 1048576; //开辟共享内存大小 //最好根据实际数据长度大小定义。 public function __construct() { parent::__construct(); } public function get_skill_list() { $data = []; $shmid = @shmop_open($this->_memory_key, 'a', 0644, $this->_memory_size); if ($shmid === FALSE) { $shmid = @shmop_open($this->_memory_key, 'c', 0644, $this->_memory_size); $data = $this->return_skill_list(); shmop_write($shmid, json_encode($data), 0); @shmop_close($shmid); return $data; } $data = json_decode(preg_replace('/[\x00-\x1F\x80-\x9F]/u', '', trim(shmop_read($shmid, 0, $this->_memory_size))), true); @shmop_close($shmid); return $data; } public function return_skill_list() { //这里是一个超大的数组,其实就是把这个数组json化,然后存入共享内存段。 其实可以用redis等其他缓存...这里我就是为了不用redis等其他nosql才用的shmop return array ( 1 => array ('id' => '1','animation' => '13','skill_type' => '1','power_type' => '1','site' => '1','type' => '1','paramete' => '0','paramete2' => '0','paramete3' => '0','chance' => '0','ratio' => '1', ), 2 => array ('id' => '2','animation' => '3','skill_type' => '2','power_type' => '1','site' => '1','type' => '1','paramete' => '0','paramete2' => '0','paramete3' => '0','chance' => '0','ratio' => '2', ),..........................................
当然你要考虑的是,如果数据更新的话,那么内存段也要删除,并且更新数据......................通过shmop_delete可以删除 。这就需要你们自己根据项目应用来考虑了
还有就是我这里只是为了简单的读,并没有出现复杂的读写,否则可能会出现进程互斥等意想不到的冲突~如果复杂,那么就可以考虑信号量了~
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Les principales raisons pour lesquelles vous ne pouvez pas vous connecter à MySQL en tant que racines sont des problèmes d'autorisation, des erreurs de fichier de configuration, des problèmes de mot de passe incohérents, des problèmes de fichiers de socket ou une interception de pare-feu. La solution comprend: vérifiez si le paramètre Bind-Address dans le fichier de configuration est configuré correctement. Vérifiez si les autorisations de l'utilisateur racine ont été modifiées ou supprimées et réinitialisées. Vérifiez que le mot de passe est précis, y compris les cas et les caractères spéciaux. Vérifiez les paramètres et les chemins d'autorisation du fichier de socket. Vérifiez que le pare-feu bloque les connexions au serveur MySQL.

Il existe de nombreuses raisons pour lesquelles la startup MySQL échoue, et elle peut être diagnostiquée en vérifiant le journal des erreurs. Les causes courantes incluent les conflits de port (vérifier l'occupation du port et la configuration de modification), les problèmes d'autorisation (vérifier le service exécutant les autorisations des utilisateurs), les erreurs de fichier de configuration (vérifier les paramètres des paramètres), la corruption du répertoire de données (restaurer les données ou reconstruire l'espace de la table), les problèmes d'espace de la table InNODB (vérifier les fichiers IBDATA1), la défaillance du chargement du plug-in (vérification du journal des erreurs). Lors de la résolution de problèmes, vous devez les analyser en fonction du journal d'erreur, trouver la cause profonde du problème et développer l'habitude de sauvegarder régulièrement les données pour prévenir et résoudre des problèmes.

La solution à l'erreur d'installation de MySQL est: 1. Vérifiez soigneusement l'environnement système pour vous assurer que les exigences de la bibliothèque de dépendance MySQL sont satisfaites. Différents systèmes d'exploitation et exigences de version sont différents; 2. Lisez soigneusement le message d'erreur et prenez des mesures correspondantes en fonction des invites (telles que les fichiers de bibliothèque manquants ou les autorisations insuffisantes), telles que l'installation de dépendances ou l'utilisation de commandes sudo; 3. Si nécessaire, essayez d'installer le code source et vérifiez soigneusement le journal de compilation, mais cela nécessite une certaine quantité de connaissances et d'expérience Linux. La clé pour finalement résoudre le problème est de vérifier soigneusement l'environnement du système et les informations d'erreur et de se référer aux documents officiels.

MySQL ne peut pas fonctionner directement sur Android, mais il peut être implémenté indirectement en utilisant les méthodes suivantes: à l'aide de la base de données légère SQLite, qui est construite sur le système Android, ne nécessite pas de serveur distinct et a une petite utilisation des ressources, qui est très adaptée aux applications de périphériques mobiles. Connectez-vous à distance au serveur MySQL et connectez-vous à la base de données MySQL sur le serveur distant via le réseau pour la lecture et l'écriture de données, mais il existe des inconvénients tels que des dépendances de réseau solides, des problèmes de sécurité et des coûts de serveur.

Les principales raisons de la défaillance de l'installation de MySQL sont les suivantes: 1. Problèmes d'autorisation, vous devez s'exécuter en tant qu'administrateur ou utiliser la commande sudo; 2. Des dépendances sont manquantes et vous devez installer des packages de développement pertinents; 3. Conflits du port, vous devez fermer le programme qui occupe le port 3306 ou modifier le fichier de configuration; 4. Le package d'installation est corrompu, vous devez télécharger et vérifier l'intégrité; 5. La variable d'environnement est mal configurée et les variables d'environnement doivent être correctement configurées en fonction du système d'exploitation. Résolvez ces problèmes et vérifiez soigneusement chaque étape pour installer avec succès MySQL.

La défaillance de l'installation de MySQL est généralement causée par le manque de dépendances. Solution: 1. Utilisez System Package Manager (tel que Linux Apt, YUM ou DNF, Windows VisualC Redistribuable) pour installer les bibliothèques de dépendance manquantes, telles que SudoaptInstallLiBMysQlClient-Dev; 2. Vérifiez soigneusement les informations d'erreur et résolvez les dépendances complexes une par une; 3. Assurez-vous que la source du gestionnaire de package est correctement configurée et peut accéder au réseau; 4. Pour Windows, téléchargez et installez les bibliothèques d'exécution nécessaires. Développer l'habitude de lire des documents officiels et de faire bon usage des moteurs de recherche peut résoudre efficacement les problèmes.

Une surveillance efficace des bases de données MySQL et MARIADB est essentielle pour maintenir des performances optimales, identifier les goulots d'étranglement potentiels et assurer la fiabilité globale du système. Prometheus Mysql Exportateur est un outil puissant qui fournit des informations détaillées sur les mesures de base de données qui sont essentielles pour la gestion et le dépannage proactifs.

Les questions et réponses fréquemment posées à l'entretien CentOS comprennent: 1. Utilisez la commande yum ou dnf pour installer des packages logiciels, tels que SudoyuminInstallnginx. 2. Gérer les utilisateurs et les groupes via des commandes UserAdd et GroupAdd, telles que SudouserAdd-M-S / Bin / BashNewuser. 3. Utilisez Firewalld pour configurer le pare-feu, comme SudoFirewall-CMD - Permanent-Add-Service = HTTP. 4. Définissez les mises à jour automatiques pour utiliser Yum-Cron, telles que SudoyuMinInstallyum-Cron et configure applat_updates = Oui.
