11
votes

PHP fonctionnant comme une application FASTCGI (PHP-CGI) - Comment émettre des demandes simultanées?

Edit: Mise à jour - Faites défiler

edit 2: Mise à jour - Problème résolu


Certaines informations de base:

J'écris mon propre serveur Web à Java et il y a quelques jours, j'ai demandé à quel point Apache interface avec PHP, afin que je puisse mettre en œuvre le support PHP. J'ai appris que FastCGI est la meilleure approche (puisque mod_php n'est pas une option). J'ai donc examiné la spécification du protocole FastCGI et j'ai réussi à écrire un wrapper FastCGI de travail pour mon serveur. J'ai testé phpinfo () et cela fonctionne, en fait, toutes les fonctions PHP semblent fonctionner simplement bien (des données d'affichage, des sessions, une date / heure, etc., etc.).

Mon serveur Web est en mesure de servir des demandes simultanées ( IE User1 peut récupérer File1.html en même temps que user2 demandant quelque_large_binaire_file.zip), il le fait en accumulant un nouveau thread Java pour chaque demande d'utilisateur (terminer lorsque la connexion terminée ou la connexion de l'utilisateur avec le client est annulée). < p> Cependant, il ne peut pas traiter avec 2 (ou plusieurs) demandes FastCGI en même temps. Ce qu'il fait, c'est que cela les festes, alors lorsque la demande 1 est terminée immédiatement après la démarrage de la demande de traitement 2. J'ai testé ceci avec 2 pages PHP, on contient le sommeil (10) et l'autre phpinfo (). < P> Comment puis-je continuer à traiter avec plusieurs demandes, car je sais que cela peut être fait (PHP sous IIS fonctionne comme FastCGI et il peut traiter de multiples demandes tout à fait).

Un peu plus d'informations:

Je suis codant sous Windows et mon fichier de commandes utilisé pour exécuter php-cgi.exe contient: xxx

mais il ne se reproduit pas 8 enfants, le service se termine simplement après 500 demandes.

J'ai fait des recherches et de Wikipedia :

Traitement de plusieurs demandes simultanément est obtenu soit par en utilisant une seule connexion avec Multiplexage interne (c'est-à-dire plusieurs Demandes sur une seule connexion) et / ou en utilisant plusieurs connexions

Maintenant, les multiples connexions ne fonctionnent pas pour moi, car chaque client demande quelque chose qui implique FastCGI, il crée une nouvelle prise à l'application FastCGI, mais cela ne fonctionne pas simultanément (il les filait à la place. ).

Je sais que le multiplexage interne des demandes FastCGI dans la même connexion est accompli en émettant chaque demande de FastCGI unique avec une autre Demande ID . (Voir également les 3 derniers paragraphes du «protocole de communication» dans la position Cet article ). < / p>

Je n'ai pas testé cela, mais comment puis-je continuer à mettre en œuvre cela? Je suppose que j'ai besoin d'une sorte de filetage Java FastCGI qui contient une carte de quelque sorte et une fonction statique que je peux utiliser pour ajouter des demandes à. Ensuite, dans la fonction Run () du fil (), il aurait une boucle de temps et pour chaque cycle, elle vérifierait si la carte contient de nouvelles demandes, le cas échéant, il leur attribuerait une carte d'identité de demande et écrivez-les au flux FastCGI. Et puis attendez l'entrée, etc., comme vous pouvez le voir, cela devient trop compliqué.

Est-ce que quelqu'un connaît la bonne façon de faire cela? Ou des pensées du tout? Merci beaucoup.

Remarque, si nécessaire, je peux fournir le code de mon wrapper FastCGI.


update :

Fondamentalement, j'ai téléchargé Nginx et l'a configuré pour utiliser PHP en tant qu'application FastCGI et il a trop souffert du même problème que mon serveur. Il ne pouvait pas gérer les demandes PHP simultanées. Cela me conduit à croire que mon code est en fait correct. Donc, quelque chose ne va pas avec PHP ou je ne la configure pas correctement. Peut-être que c'est parce que j'utilise Windows car certains utilisateurs LightPD revendiquent Windows ne peut pas gérer correctement FastCGI (cela n'a pas beaucoup de sens). Je vais installer Linux prochain et signaler tout progression avec ça.


1 commentaires

Très bien, je viens de rester sur ce problème pendant une journée et difficile à comprendre ce qui se passe sur le sommeil () de PHP affectera d'autres processus, grâce à votre réponse et à votre partage.


3 Réponses :


9
votes

D'accord, j'ai réussi à trouver la cause du problème. Ce n'était pas mon code du tout. C'est PHP, il ne peut pas accéder à des fenêtres supplémentaires de PHP-CGI supplémentaires lors de l'exécution de mode FastCGI, sous Linux, il fonctionne parfaitement, j'ai simplement signalé mon serveur à mon IP de la boîte Linux et qu'il n'avait aucun problème avec des demandes de FCGI simultanées. Sucks, mais je suppose que c'est comme ça que c'est ...

J'ai ressemblé plus profondément dans le code source PHP après cela et j'ai constaté que la section du code qui répond à php_fcgi_children a été encapsulée par #Ifndef Win32 afin que les développeurs soient donc conscients de la question


1 commentaires

Mise à jour: PHP V7.1 + poignées php_fcgi_children sur Windows. Si l'ENV var est défini, le premier processus PHP-CGI.EXE exercera le nombre spécifié d'enfants. Celles-ci partageront la même prise TCP. Voir commettre et php.net/manual/de/migration71.windows-support.php



2
votes

Bonjour, ça vient un peu de retard, j'ai écrit un tailleur pour php-cgi.exe sous Windows, pas parfait, mais ce dont vous avez besoin. Vérifiez-le à ici .


2 commentaires

Oh très sympa, je vais regarder ça!


HULLELUYA MAN, après 2 jours de googling étendue et réalisant que PHP-CGI.EXE peut servir 1 connexion simultanée, j'étais désespérée de se développer localement sur Apache et sur serveur avoir Nginx, mais je souhaitais avoir la même configuration dans les deux environnements. Donc, votre solution a aidé. BTW ça ne fonctionne qu'avec ActivePyThon, car il a des propresses Win32, le python standard n'a pas ce liberté



2
votes

RE: Script Python SPAWN-PHP ...

merci@nosam qui a vraiment aidé.
Pour ceux qui souhaitent le faire fonctionner rapidement, vous aurez besoin du système suivant (si 64 bits)

ActivePyTHON-2.7.2.5-Win64-x64.msi
pywin32-217.win-amd64-py2.7.exe

ActivePyThon n'a pas de versions plus anciennes d'entre eux sur leur www, vous devrez donc faire un peu de googling pour trouver un miroir de travail (il y a beaucoup de temps là-bas)

Une fois que vous avez téléchargé le SRC de BitBucket, vous devrez peut-être modifier SPAWN-PHP.PY (pour fixer l'espacement des onglets), car Bit-Bucket semblait gâcher la languette dans le fichier empêchant son exécution.

Tout-in-tous qui a sauvé ma journée pour un site Web de Little Windows occupé à l'aide de Nginx + Fast-CGI.

Merci Mate!


0 commentaires