2017-09-08 1 views
0

Comme nous le savons, PHP fonctionne dans la philosophie "ne rien partager". Il est donc lié à de sérieuses limitations de performance. Alors qu'un script compilé peut être accéléré par certaines extensions de cache, nous ne pouvons pas éviter une initialisation très lourde (par exemple, nous avons un service web et chaque appel nécessite au minimum l'analyse et l'amorçage des schémas DTO, la configuration des liaisons de données, la connexion base de données (connexions mysql persistantes est vraiment bidouille de ce point de vue), l'ouverture d'autres services à distance et ainsi de suite).Comment traiter plusieurs demandes en utilisant la même instance en cours d'exécution de PHP?

Egalement ce problème semble être résolu par le framework ReactPHP, mais ... existe-t-il des solutions non-framework légères? Tout ce qui concerne les méthodes de piratage, les exemples à un fichier et les bibliothèques légères (pas les frameworks) sont acceptés. Aucune fonctionnalité complexe recréée par le serveur Web requise. Le simple traitement des requêtes POST simples est suffisant.

<offtopic>

La tâche elle-même est si essentiel, donc je me demande pourquoi PHP ne fournit pas ce hors-the-box encore ...

</offtopic>

+0

Avec opcache et tout, cela ne devrait pas avoir un très grand impact. La plupart des frameworks ne chargeront que les modules requis pour gérer la tâche en cours. Bien que je ne suis pas sûr de HTTP POST, les sockets pourraient fonctionner. – Salketer

+0

Supposons que le chargement de module ne soit pas un goulot d'étranglement, mais une initialisation où nous devons partager des ressources de configuration. ReactPHP (le seul framework de ce type?) Le résout mais l'utiliser signifie dépendre d'un framework complexe avec un support pas très élevé. Trop risqué pour une tâche aussi simple. –

+0

Ne pensez-vous pas que si c'était vraiment une tâche si simple, il y aurait aussi d'autres solutions? Tout en PHP est apatride. À moins que vous utilisiez des ressources avec state() et gardiez PHP très mince, ça va être dur. Mais je doute vraiment que ce "goulot d'étranglement" vous cause du mal tandis que Facebook n'a aucun problème avec ça ... – Salketer

Répondre

1

Une belle façon de le faire est un script CLI qui agirait comme votre serveur Java/nodeJS normal. Et utilisez une passerelle PHP légère pour recevoir les requêtes HTTP et demander les informations nécessaires à la CLI via socket.

Une lecture intéressante est http://liveforeverbook.info/blog/2008/01/31/persistent-web-apps-in-php/

La clé est que le script CLI conserve la banque de messages en mémoire (comme le service Java), et communique avec le client par un Web PHP "passerelle".

serveur IRC < -> PHP passerelle < -> Client L'étape de la passerelle est réellement nécessaire, mais aide à filtrer les déchets qui pourraient venir par si le serveur IRC est connecté directement au réseau.

Vous démarrez le serveur IRC s'exécutant en tant que script à partir de la console (php server.php) et le laissez s'exécuter. Les scripts de l'interface de ligne de commande n'ont pas de délai d'attente. Par conséquent, le code continuera de s'exécuter jusqu'à ce que vous l'éteigniez manuellement.

1

existe-t-il des solutions non-cadre légères? Tout ce qui concerne les méthodes de piratage, les exemples à un fichier et les bibliothèques légères (pas les frameworks) sont acceptés.

Dépend de ce que vous cherchez. Vous aurez besoin d'une sorte de boucle d'événement/planificateur, qui est la plupart du temps ce que amphp/amp/react/event-loop fournissent. Si vous ne voulez pas mourir dans un callback-hell, vous aurez besoin d'une forme d'implémentation de la promesse, fournie par amphp/amp/react/promise.

Si vous voyez ces parties comme un framework et que vous ne voulez pas les utiliser, vous pouvez bien sûr les écrire vous-même. Mais là encore, vous cherchez un logiciel stable, l'un d'entre eux sera plus stable que votre propre implémentation, car ils sont beaucoup plus utilisés et les bogues sont signalés et corrigés.

Tout ce qui se trouve au-dessus de ces bases n'est que des bibliothèques. Vous pouvez les utiliser ou écrire les vôtres. Si vous avez juste besoin d'un serveur socket, pourquoi ne pas utiliser les librairies qui traitent déjà les cas limites de PHP aussi bien que possible?

Aucune fonctionnalité complexe recréée par le serveur Web requise. Le simple traitement des requêtes POST simples est suffisant.

Oh, qu'est-ce qu'un serveur Web complexe? "Juste" gérer les requêtes POST simples? Vous aurez besoin d'un analyseur de protocole HTTP qui traite correctement les requêtes en pipeline, décode l'encodage en segments, un analyseur en plusieurs parties si vous voulez traiter les fichiers téléchargés, etc

Si vous cherchez simplement à gérer plusieurs requêtes dans un seul PHP processus sans bootstrapping répétée, je suggère de jeter un oeil à PHP-PM, mais à ce stade, il n'est pas prêt à la production.