Cette fois je vais vous donner une explication détaillée des principes, avantages et inconvénients d'Ajax, et quelles sont les précautions pour utiliser Ajax. Voici des cas pratiques, jetons un oeil.
1. Contexte de la technologie ajax
Il est indéniable que la popularité de la technologie ajax bénéficie de la promotion vigoureuse de Google, précisément à cause de Google Earth L'application généralisée de la technologie Ajax telle que Google Suggest et Gmail a donné naissance à la popularité d'Ajax. Cela rend également Microsoft extrêmement embarrassé, car dès 1997, Microsoft avait inventé la technologie clé en ajax, et lorsque IE5 a été lancé en 1999, il a commencé à prendre en charge l'objet XmlHttpRequest, et Microsoft avait déjà commencé à l'utiliser auparavant. est utilisé dans certains produits, tels que certaines applications du menu du site Web MSDN. Malheureusement, pour une raison inconnue, après que Microsoft ait inventé la technologie de base d'ajax, il n'a pas vu son potentiel, ne l'a pas développé et promu, mais l'a mis de côté. Personnellement, je trouve cela très étrange, car avec les ressources et la vision stratégique de Microsoft, il ne devrait pas être incapable de voir les perspectives de la technologie ajax. La seule explication peut être que son principal concurrent de l'époque. La disparition de Netscape l'a paralysé et ralenti. Après tout, les géants font aussi la sieste, comme les erreurs stratégiques d'IBM contre Microsoft. C'est cette erreur qui a fait de son concurrent actuel la position de leader dans l'Ajax. En fait, le leadership actuel de Google dans la technologie Ajax est hors de portée de Microsoft. Nous en parlerons plus tard lorsque nous parlerons des défauts d'Ajax. Maintenant que Microsoft est conscient de ce problème, il a également commencé à rattraper son retard dans le domaine ajax. Par exemple, il a lancé son propre atlas de framework ajax et a également fourni une interface pour implémenter des rappels asynchrones dans .NET 2.0, à savoir l'interface ICallBack. . Alors pourquoi Microsoft est-il si nerveux à cause de son retard en matière d'ajax ? Analysons maintenant la signification profonde de la technologie ajax.
2. L'importance de la technologie ajax
Nous avons tous été exposés ou appliqués à ajax dans une certaine mesure dans notre développement quotidien. il s'agit d'ajax Quant à l'importance de la technologie, ce à quoi nous accordons le plus d'attention est sans aucun doute l'amélioration de l'expérience utilisateur. Cependant, si nous combinons les futures tendances de développement des ordinateurs et d'Internet, nous constaterons que la technologie ajax représente cette tendance à certains égards. Pourquoi dis-tu cela ? On sait que depuis l’avènement des ordinateurs, les logiciels de bureau ont toujours occupé une position absolument dominante, mais l’émergence et le succès d’Internet ont provoqué de subtils changements dans tout cela. Un nombre considérable de personnes pensent que tôt ou tard, les données et les logiciels informatiques passeront du bureau à Internet. En d’autres termes, les ordinateurs du futur pourraient abandonner les disques durs encombrants et obtenir des données et des services directement à partir d’Internet. Je me souviens que lorsque j’étais à l’université, un professeur avait imaginé un tel scénario alors qu’il nous donnait un cours. , il n'y aura pas de logiciels et de programmes redondants sur le bureau de l'ordinateur, mais un seul IE. Même s'il semble que nous soyons encore loin de ce jour et qu'il reste encore de nombreux problèmes à résoudre, je pense que ce n'est pas un problème. un rêve, mais une réalité qui se réalisera tôt ou tard. Eh bien, le principal problème est que la connexion Internet est instable. Personne ne veut voir son ordinateur télécharger les données du serveur petit à petit. Alors, ajax résout-il ce problème ? En résolvant le problème, cela ne fait que masquer le problème. Il agit simplement comme un tampon entre le serveur et le client, faisant croire aux utilisateurs qu'il n'y a pas d'interruption de service. Pour être précis, ajax n'augmente pas la vitesse de téléchargement des données depuis le serveur, mais rend simplement l'attente moins frustrante. Mais cela a suffi à provoquer un impact et un choc énormes, et cela a en fait eu un impact énorme sur les logiciels de bureau. Je vais utiliser un exemple pour illustrer ce point. Nous pouvons comparer Outlook Express et Gmail, un logiciel de bureau typique, et le second est un mode B/S implémenté par ajax. En fait, ce dernier remplace lentement le premier. Gmail a presque les mêmes fonctionnalités qu'Outlook Express lors de l'envoi et de la réception d'e-mails, et ne nécessite pas l'installation d'un programme client. C'est l'une des principales raisons pour lesquelles Microsoft a si peur de l'impact d'Ajax et, dans une enquête menée il n'y a pas si longtemps, il considérait Google comme son principal concurrent au cours des dix prochaines années. Bien entendu, ce changement n’éliminera pas tous les logiciels de bureau. Aucun des navigateurs existants ne peut gérer des images complexes comme les programmes de bureau tels que PhotoShop. Mais nous ne pouvons ignorer son influence et son impact.
3. À propos du nom d'ajax
Le nom complet d'ajax est JavaScript asynchrone et XML. Parmi eux, Asynchrone signifie asynchrone. est différente. La méthode de synchronisation utilisée dans le développement Web traditionnel.
À propos de la synchronisation et de l'asynchrone
La transmission asynchrone est une transmission orientée caractères, et son unité est le caractère tandis que la transmission synchrone est une transmission orientée bits, son unité est la trame et elle transmet ; Les horloges du récepteur et de l’expéditeur doivent être cohérentes.
Plus précisément, la transmission asynchrone divise les bits en petits groupes pour la transmission. Généralement, chaque groupe est un caractère de 8 bits. Il y a un bit de départ et un bit d'arrêt en tête et en queue de chaque groupe. Pendant le processus de transmission, les horloges du récepteur et de l'expéditeur ne doivent pas nécessairement être cohérentes. c'est-à-dire que l'expéditeur peut envoyer ces groupes à tout moment sans que le destinataire sache quand il arrivera. L'un des exemples les plus évidents est la communication entre le clavier de l'ordinateur et l'hôte. Lorsqu'une touche est enfoncée, un code ASCII de 8 bits est envoyé à l'hôte. Le clavier peut envoyer le code à tout moment, en fonction de la saisie de l'utilisateur. vitesse. Le matériel interne doit pouvoir recevoir un caractère tapé à tout moment. Il s'agit d'un processus de transmission asynchrone typique. Un problème potentiel avec la transmission asynchrone est que le récepteur ne sait pas quand les données arriveront. Avant qu'il ne détecte les données et ne réponde, le premier bit est passé. C'est comme si quelqu'un surgissait de manière inattendue par derrière et vous parlait, et que vous n'aviez pas le temps de réagir et que vous manquiez les premiers mots. Par conséquent, chaque transmission asynchrone d'informations commence par un bit de démarrage, qui informe le récepteur que les données sont arrivées, ce qui donne au récepteur le temps de répondre, de recevoir et de mettre en cache les données bits à la fin de la transmission. Quand, un arrêt ; Le bit indique la fin de la transmission des informations. Par convention, une ligne inactive (ne transmettant pas de données) transporte en fait un signal représentant un 1 binaire. Le bit de départ de la transmission par étapes fait passer le signal à 0, et les autres bits font changer le signal avec les informations de données transmises. Enfin, le bit d'arrêt ramène le signal à 1, où il reste jusqu'à l'arrivée du bit de démarrage suivant. Par exemple, le chiffre « 1 » sur le clavier enverra « 00110001 » selon le codage ASCII étendu 8 bits. En même temps, un bit de démarrage doit être ajouté devant le bit 8 bits et un bit d'arrêt. suivra.
Les paquets de bits transmis simultanément sont beaucoup plus gros. Au lieu d'envoyer chaque caractère indépendamment, chacun avec son propre bit de démarrage et son propre bit d'arrêt, il les combine et les envoie ensemble. Nous appelons ces combinaisons des trames de données, ou simplement des trames. La première partie de la trame de données contient un ensemble de caractères de synchronisation, qui est une combinaison unique de bits, similaire au bit de départ mentionné précédemment, utilisée pour informer le récepteur qu'une trame est arrivée, mais elle peut Assurez-vous également que la vitesse d'échantillonnage du récepteur est cohérente avec la vitesse d'arrivée des bits, afin que les parties émettrices et réceptrices soient synchronisées. La dernière partie du cadre est un marqueur de fin de cadre. Comme le caractère de synchronisation, il s'agit également d'une chaîne de bits unique, similaire au bit d'arrêt mentionné précédemment, utilisée pour indiquer qu'il n'y a pas d'autres données à venir avant le début de la trame suivante. Les transferts synchrones sont généralement beaucoup plus rapides que les transferts asynchrones. Le récepteur n'a pas besoin de démarrer et d'arrêter chaque caractère. Une fois les caractères de synchronisation de trame détectés, il les reçoit au fur et à mesure de l'arrivée des données suivantes. De plus, le surcoût de la transmission synchrone est également relativement faible. Par exemple, une trame typique peut contenir 500 octets (c'est-à-dire 4 000 bits) de données, qui ne peuvent contenir que 100 bits de surcharge. À ce stade, les bits ajoutés augmentent le nombre total de bits transmis de 2,5 %, ce qui est bien inférieur à l'augmentation de 25 % de la transmission asynchrone. À mesure que le nombre de bits de données réels dans la trame de données augmente, le pourcentage de bits de surcharge diminue en conséquence. Cependant, plus les bits de données sont longs, plus le tampon requis pour mettre en cache les données est grand, ce qui limite la taille d'une trame. De plus, plus la trame est grande, plus elle occupe de temps continu le support de transmission. Dans des cas extrêmes, cela entraînera une attente trop longue des autres utilisateurs. heures. Pendant ces 10 heures, l'eau n'a pas été complètement coupée, mais le débit était beaucoup plus faible qu'avant. Le débit est revenu à la normale après 10 heures. Alors, quelle méthode choisiriez-vous. étais-tu ? Apparemment, c'est ce dernier.4. Technologie incluse dans ajax
Tout le monde sait qu'ajax n'est pas une nouvelle technologie, mais une combinaison de plusieurs technologies originales. Il est composé des technologies suivantes. 1. Utilisez CSS et XHTML pour exprimer. 2. Utilisez le modèle DOM pour l'interaction et l'affichage dynamique. 3. Utilisez XMLHttpRequest pour communiquer de manière asynchrone avec le serveur. 4.Utilisez javascript pour vous lier et appeler.
Parmi les technologies ci-dessus, à l'exception de l'objet XmlHttpRequest, toutes les autres technologies sont basées sur les standards du Web et ont été largement utilisées. Bien que XMLHttpRequest n'ait pas encore été adopté par le W3C, il s'agit déjà d'un standard de facto, car presque tous. les principaux navigateurs le prennent actuellement en charge.
5. Principe Ajax et objet XmlHttpRequest
Le principe d'Ajax est simplement d'envoyer une requête asynchrone au serveur via l'objet XmlHttpRequest, d'obtenir des données du serveur, puis d'utiliser javascript pour fonctionner le DOM et mettez à jour la page. L’étape la plus critique consiste à obtenir les données de la demande auprès du serveur. Pour comprendre ce processus et ce principe, nous devons comprendre quelque chose à propos de XMLHttpRequest.
XMLHttpRequest est le mécanisme de base d'ajax. Il a été introduit pour la première fois dans IE5 et est une technologie qui prend en charge les requêtes asynchrones. Pour faire simple, JavaScript peut adresser des requêtes au serveur et traiter les réponses en temps opportun sans bloquer l'utilisateur. N'obtenez aucun effet de rafraîchissement.
Commençons donc par XMLHttpRequest et voyons comment cela fonctionne.
Tout d’abord, examinons les propriétés de l’objet XMLHttpRequest.
Ses attributs sont :
onreadystatechange Gestionnaire d'événements programme pour les événements déclenchés par chaque changement d'état.
responseText renvoie la forme de chaîne des données du processus serveur.
responseXML L'objet de données de document compatible DOM renvoyé par le processus serveur.
le statut est le code numérique renvoyé par le serveur, tel que le commun 404 (introuvable) et 200 (prêt)
status Informations de chaîne de texte accompagnant le code de statut
readyState Valeur d'état de l'objet
0 (non initialisé) L'objet a été créé, mais n'a pas été initialisé (la méthode open n'a pas encore été appelée)
1 (Initialisé) L'objet a été créé , mais la méthode d'envoi n'a pas encore été appelée
2 (Envoyer des données) La méthode d'envoi a été appelée, mais l'état actuel et l'en-tête http sont inconnus
3 (Les données sont en cours de transmission) Une partie des données a été reçue car la réponse et l'en-tête http sont incomplets. Pour le moment, elles sont obtenues via ResponseBody et ResponseText. Il y aura des erreurs dans certaines données
4 (Complet) Les données sont reçues. À l'heure actuelle, les données de réponse complètes peuvent être obtenues via ResponseXml et ResponseText
Cependant, en raison des différences entre les navigateurs, la création d'un objet XMLHttpRequest peut nécessiter des méthodes différentes. Cette différence se reflète principalement entre IE et les autres navigateurs. Ce qui suit est une méthode relativement standard de création d’un objet XMLHttpRequest.
function CreateXmlHttp() { //非IE浏览器创建XmlHttpRequest对象 if(window.XmlHttpRequest) { xmlhttp=new XmlHttpRequest(); } //IE浏览器创建XmlHttpRequest对象 if(window.ActiveXObject) { try { xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { try{ xmlhttp=new ActiveXObject("msxml2.XMLHTTP"); } catch(ex){} } } } function TestAjax() { var data=document.getElementByIdx("username").value; CreateXmlHttp(); if(!xmlhttp) { alert("创建xmlhttp对象异常!"); return false; } xmlhttp.open("POST",url,false); xmlhttp.onreadystatechange=function() { if(xmlhttp.readyState==4) { document.getElementByIdx("user1").innerHTML="数据正在加载..."; if(xmlhttp.status==200) { document.write(xmlhttp.responseText); } } } xmlhttp.send(); }
Comme indiqué ci-dessus, la fonction vérifie d'abord l'état global de XMLHttpRequest et s'assure qu'il est terminé (readyStatus=4), c'est-à-dire que les données ont été envoyées. Interrogez ensuite l'état de la demande en fonction des paramètres du serveur. Si tout est prêt (statut = 200), effectuez les opérations requises suivantes.
Pour les deux méthodes de XmlHttpRequest, open et send, la méthode open spécifie :
a Le type de données soumises au serveur, c'est-à-dire post ou get.
b. L'adresse URL demandée et les paramètres transmis.
c. Mode de transmission, faux signifie synchrone, vrai signifie asynchrone. La valeur par défaut est vraie. S'il s'agit d'un mode de communication asynchrone (vrai), le client n'attend pas la réponse du serveur ; s'il s'agit d'un mode synchrone (faux), le client doit attendre que le serveur renvoie un message avant d'effectuer d'autres opérations. Il faut préciser la méthode de synchronisation en fonction des besoins réels. Dans certaines pages, des requêtes multiples peuvent être émises, voire des requêtes de grande intensité et de grande intensité, organisées, planifiées et formées, et cette dernière écrasera la précédente. . Bien entendu, vous devez spécifier la méthode de synchronisation.
La méthode Send est utilisée pour envoyer des requêtes.
Connaissant le workflow de XMLHttpRequest, nous pouvons voir que XMLHttpRequest est entièrement utilisé pour émettre une requête au serveur, et son rôle se limite à cela, mais son rôle est la clé de toute l'implémentation ajax, car Ajax n'est rien de plus que deux processus, faire une demande et répondre à la demande. Et c'est entièrement une technologie côté client. XMLHttpRequest gère le problème de communication entre le serveur et le client, c'est pourquoi c'est si important.
Maintenant, nous pouvons probablement comprendre le principe de l'ajax. Nous pouvons considérer le serveur comme une interface de données, qui renvoie un flux de texte brut. Bien entendu, ce flux de texte peut être au format XML, HTML, code Javascript ou simplement une chaîne. À ce stade, XMLHttpRequest demande cette page au serveur et le serveur écrit le résultat du texte dans la page. C'est la même chose que le processus de développement Web ordinaire. La différence est qu'une fois que le client a obtenu le résultat de manière asynchrone, ce n'est pas directement. affiché sur la page, mais est d'abord traité par javascript puis affiché sur la page. Quant à de nombreux contrôles ajax populaires actuellement, tels que magicajax, etc., ils peuvent renvoyer DataSet et d'autres types de données . Ils encapsulent simplement le résultat de ce processus. En substance, il n'y a pas beaucoup de différence entre eux.
6. Avantages d'Ajax
Tout le monde a fondamentalement une compréhension approfondie des avantages qu'Ajax nous apporte Ici, je ne vais que brièvement le faire. parlons de quelques points :
1. Le point le plus important est que la page ne s'actualise pas et ne communique pas avec le serveur à l'intérieur de la page, offrant à l'utilisateur une très bonne expérience.
2. Utilisez le mode asynchrone pour communiquer avec le serveur, sans interrompre le fonctionnement de l'utilisateur, et bénéficiez de capacités de réponse plus rapides.
3. Une partie du travail précédemment chargé par le serveur peut être transférée au client, en utilisant la capacité inactive du client pour le traiter, réduisant ainsi la charge sur le serveur et la bande passante, et économisant de l'espace et de la location du haut débit. frais. Et pour réduire la charge sur le serveur, le principe d'ajax est de « récupérer les données à la demande », ce qui peut minimiser la charge sur le serveur causée par les requêtes et réponses redondantes.
4. Basé sur une technologie standardisée et largement prise en charge, il n'est pas nécessaire de télécharger des plug-ins ou de petits programmes.
7. Inconvénients d'ajax
Maintenant, je vais me concentrer sur les défauts d'ajax, car généralement nous prêtons surtout attention à ce qu'apporte ajax. nous. Les avantages incluent une expérience utilisateur améliorée. Les défauts causés par ajax ont été ignorés.
Les défauts de l'ajax décrits ci-dessous sont tous causés par son caractère inné.
1. Ajax tue le bouton de retour, ce qui détruit le mécanisme de retour du navigateur. Le bouton Précédent est une fonctionnalité importante d'un site Web standard, mais il ne fonctionne pas bien avec JavaScript. Il s'agit d'un problème sérieux causé par ajax, car les utilisateurs espèrent souvent annuler l'opération précédente en revenant en arrière. Alors, y a-t-il une solution à ce problème ? La réponse est oui. Ceux qui ont utilisé Gmail savent que la technologie ajax utilisée sous Gmail résout ce problème. Cependant, cela ne change pas le mécanisme ajax. pour ce faire, il suffit de créer ou d'utiliser un IFRAME masqué pour reproduire les modifications sur la page lorsque l'utilisateur clique sur le bouton de retour pour accéder à l'historique. (Par exemple, lorsque l'utilisateur clique à nouveau dans Google Maps, il recherche dans un IFRAME masqué, puis reflète les résultats de la recherche sur un élément Ajax pour restaurer l'état de l'application tel qu'il était à ce moment-là.)
Cependant , bien que ce problème puisse être résolu, le coût de développement qu'il entraîne est très élevé, ce qui est contraire au développement rapide requis par le framework ajax. Il s'agit d'un problème très grave causé par ajax.
2. Problèmes de sécurité
La technologie apporte également de nouvelles menaces de sécurité aux entreprises informatiques. La technologie Ajax revient à établir un canal direct pour les données d'entreprise. Cela permet aux développeurs d’exposer par inadvertance davantage de données et de logique de serveur qu’auparavant. La logique Ajax peut être masquée par la technologie d'analyse de sécurité côté client, permettant ainsi aux pirates de créer de nouvelles attaques à partir de serveurs distants. Ajax est également difficile à éviter certaines faiblesses de sécurité connues, telles que les attaques de scripts intersites, les attaques par injection SQL et les vulnérabilités de sécurité basées sur les informations d'identification.
3. Le support des moteurs de recherche est relativement faible.
4. Détruit le mécanisme d'exception du programme. Au moins du point de vue actuel, les frameworks ajax tels que ajax.dll et ajaxpro.dll détruiront le mécanisme d'exception du programme. Concernant ce problème, je l'ai rencontré lors du processus de développement, mais après vérification, il n'y a quasiment aucune introduction pertinente sur Internet. Plus tard, j'ai fait une expérience moi-même, en utilisant ajax et les modes de soumission de formulaires traditionnels pour supprimer une donnée... ce qui a apporté de grandes difficultés à notre débogage.
5. En outre, il existe d'autres problèmes, tels que la violation de l'intention initiale de l'URL et du positionnement des ressources. Par exemple, si je vous donne une adresse URL, si la technologie Ajax est utilisée, peut-être que ce que vous voyez sous l'adresse URL est différent de ce que je vois sous cette adresse URL. Ceci est contraire à l’intention initiale du positionnement des ressources.
6、一些手持设备(如手机、PDA等)现在还不能很好的支持ajax,比如说我们在手机的浏览器上打开采用ajax技术的网站时,它目前是不支持的,当然,这个问题和我们没太多关系。
8、ajax的几种框架
目前我们采用的比较多的ajax框架主要有ajax.dll,ajaxpro.dll,magicajax.dll 以及微软的atlas框架。Ajax.dll和Ajaxpro.dll这两个框架差别不大,而magicajax.dll只是封装得更厉害一些,比如说它可以直接返回DataSet数据集,前面我们已经说过,ajax返回的都是字符串,magicajax只是对它进行了封装而已。但是它的这个特点可以给我们带来很大的方便,比如说我们的页面有一个列表,而列表的数据是不断变化的,那么我们可以采用magicajax来处理,操作很简单,添加magicajax之后,将要更新的列表控件放在magicajax的控件之内,然后在pageload里面定义更新间隔的时间就ok了,atlas的原理和magicajax差不多。但是,需要注意的一个问题是,这几种框架都只支持IE,没有进行浏览器兼容方面的处理,用反编译工具察看他们的代码就可以知道。
除了这几种框架之外,我们平时用到的比较多的方式是自己创建xmlHttpRequest对象,这种方式和前面的几种框架相比更具有灵活性。另外,在这里还提一下aspnet2.0自带的异步回调接口,它和ajax一样也可以实现局部的无刷新,但它的实现实际上也是基于xmlhttprequest对象的,另外也是只支持IE,当然这是微软的一个竞争策略。
9.ajax应用举例
以上内容是转载高人写的资料,下面我将我在项目中实际应用给出个例子,这个例子是这样的:我参与的一个项目的值班安排模块里,选择值班人时,弹出的是个联系人树型TreeView结构图,点开哪个部门,然后部门下的联系人就展开了,原先是这样的,选择好某些联系人后,哪天白天或晚上的值班人就是这样的格式”小A,小B”,但是现在要求这样的格式”小A(部门一),小B(部门二)”这里假设小A属于部门一,小B属于部门二。由于选择联系人是纯前台javascript的操作的,这里要通过联系人userlist表中的部门id,来取得部门的名称,也就是通过前台取后台的数据,这个在系列五里我也阐述过,下面给出代码:
var param= "date=<%=stryear%>/<%=strmonth%>/" + x <%=stryear%><%=strmonth%> +"&Type=" + type +"&Other=" + eval_r("formData.RBOTHER"+x+".value") +"&ZBRY=" + eval_r("formData.RBZBRY"+x+".value") +"&ZBRYID=" + eval_r("formData.RBZBRYID"+x+".value") +"&Demo=" + eval_r("formData.RBDEMO"+x+".value") +"&id=" + eval_r("formData.RBZBID"+x+".value");//传递的参数 var retVal = window.showModalDialog( "chooseUsers.asp?"+param,this, "dialogWidth=280px; dialogHeight=500px; help=no; status=no; scroll=no; resizable=yes; "); //弹出对话框取得联系人 //ajax调用服务器端方法取到部门名称 if(retVal ['userIds']!=""&& retVal ['userIds']!=null)//联系人id集合格式1,2,3,4 { var PostUrl=" ../../../Application/CallBoard/GetDepartMentByUid.aspx?userIDs="+objRetVal['userIds']+"";//后台处理页面url xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");//新建一个xmlhttprequest对象 xmlHttp.open("POST", PostUrl, false); xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); xmlHttp.send(""); var builder= xmlHttp.responseText; //将值传递回来,拼成了新格式 eval_r("formData.RBZBRY"+x+".value = '" +builder+"'");// formData.RBZBRY为一文本控件,将显示值班人员新格式 } }
相信看了本文案例你已经掌握了方法,更多精彩请关注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!