11
votes

Un moyen simple de démarrer un nouveau processus / thread en PHP

scénario:

  1. hébergement partagé, donc aucune possibilité d'installer de nouvelles extensions + pas de cron
  2. Une demande soumise doit effectuer des processus lourds.
  3. Je veux que la réponse au client soit aussi rapide que possible et la forte levée de continuer immédiatement, mais ne pas arrêter le client.
  4. peut être sur un nouveau fil (s'il est possible), pas de problème sans problème avec le démarrage d'un nouveau processus.

    Quelle est la meilleure façon de faire cela?


2 commentaires

PHP ne peut pas (actuellement) être multi-fileté. beaucoup à mon mécontentement régulier.


Eh bien, certaines choses peuvent être émulées.


5 Réponses :


1
votes

Il n'y a pas de filetage dans PHP. Vous pouvez tricher en renvoyant une page HTML qui déclenche un appel AJAX pour démarrer le processus lourd dans une nouvelle demande. Mais si c'est partagé l'hébergement, je suppose que vous allez rapidement toucher les limites de la mémoire, du temps ou de l'utilisation de la CPU imposée par votre fournisseur d'hébergement.


1 commentaires

Evidemment, il existe des threads dans PHP maintenant mais vous devrez peut-être avoir à < Un href = "http://docs.php.net/manual/fr/pthreads.Installation.php" rel = "nfollow noreferrer"> Installez-les . Cependant, je viens juste d'apprendre cela ce soir, alors je ne l'ai pas encore essayé.



12
votes

sur * NIX: xxx pré>

sous Windows: p>

$WshShell = new COM('WScript.Shell'); 
$oExec = $WshShell->Run('C:\path\to\executable.exe', 0, false);


5 commentaires

Puis-je modifier le / dev / null en un fichier journal de mon choix?


Je pense que oui, tant que vous redirigez stdout et stardr à quelque part qui n'est pas le processus parent et suffixez avec & , cela devrait fonctionner. Tbh, j'ai toujours juste juste / dev / null ed it, donc vraiment vous devrez juste le sucer et voir ...


Démarrer un processus externe arbitraire sur l'hébergement partagé? Bonne chance avec ça.


@Jbnizet Je peux commencer les scripts PHP externes sur les miens exactement comme ci-dessus, et ils vont réellement courir, je pense pour toujours - j'avais une course pendant plus d'une semaine comme une expérience une fois.


Wow. Tu es beaucoup plus chanceux que moi alors :-)



0
votes
var_dump($argv);

0 commentaires

3
votes

Vous pouvez utiliser Google par clé: PHP Continuer le traitement après la fermeture de la connexion.

Les liens suivants qui concernent votre problème sont les suivants:


1 commentaires

Bienvenue à cela. Vous devriez examiner le formatage de votre réponse. Dès maintenant, il semble que vous mettions tout dans un bloc de code, alors qu'il y a une partie de votre réponse qui n'est pas du code.



2
votes

Pour compléter @ Daverandom's Réponse: Vous n'avez pas réellement Besoin à rediriger STDOUT à stdout (avec 2> et 1 < /Code >).

Vous devez rediriger stdout si vous souhaitez empêcher le processus parent de suspendre l'attente de l'enfant à la fin. Ceci est requis cause EXEC retournera la dernière ligne de la sortie du processus enfant, il doit donc attendre que le stdout de l'enfant soit fermé.

Cela ne signifie pas que vous devez rediriger vers / dev / null . Vous pouvez la rediriger vers un autre fichier, voire à un autre descripteur de fichier (comme starr : 1> & 2 ).

  • EXEC ('/ chemin / à / à / exécutable') : Démarrera un nouveau processus et attendra la fin de la fin (c'est-à-dire bloquer le processus parent).
  • EXEC ('/ chemin / à / exécutable &') : essentiellement identique à ce qui précède.
  • $ pid = EXEC ('/ chemin / à / exécutable> / dev / null & echo $!') : Démarrera un processus en arrière-plan, avec les processus enfant et parent en parallèle . La sortie de / chemin / à / exécutable sera supprimée et $ pid recevra le PID du processus d'enfant.

    Utiliser 2> & 1 n'est pas nécessaire, Cause EXEC ignore le starr du processus enfant. C'est également probablement indésirable car il rendra plus difficile de trouver des erreurs, car ils seront juste jetés silencieusement. Si vous omettez 2> & 1 , vous pouvez tuyer le starr du processus parent sur un fichier journal, qui peut être vérifié plus tard lorsque quelque chose ne va pas: < Pré> xxx

    En utilisant ce qui précède pour démarrer le script qui déclenche les processus enfants, tout ce que script.php et tout processus enfant écrit sur < Code> stardr sera écrit dans le fichier journal.


0 commentaires