9
votes

ID de processus de contrôle PHP

C'est quelque chose que je me suis demandé pendant un moment et j'ai décidé de demander à ce sujet.

Nous avons la fonction getMypid () qui retournera l'ID de processus de scripts actuel. Y a-t-il une sorte de fonction tel que

checkifpidexistes () dans php? Je veux dire une solution intégrée et non une solution de script de lot.

et y a-t-il un moyen de modifier un pid de scripts?

Quelques éclaircissements:

Je veux Vérifiez si un PID existe pour voir si le script est déjà en cours d'exécution, cela ne fonctionne pas de nouveau, FAUx Cron Job si vous voulez.

La raison pour laquelle je voulais changer le PID est afin que je puisse définir le script pid sur quelque chose de vraiment élevé, tel que 60000 et du code dur qui valorisa, ce script ne peut s'exécuter que sur ce PID, alors 1 instance de celui-ci exécuterait

EDIT ----

pour aider tout le monde D'autre avec ce proplamem, j'ai créé cette classe: xxx

et vous l'utilisez comme: xxx


1 commentaires

"Donc, je peux définir le script PID sur quelque chose de vraiment élevé, tel que 60000 et un code dur qui valorise" - l'hypothèse que vous pourriez définir un PID est défectueux. Cette approche ne peut pas fonctionner.


6 Réponses :


17
votes

in Linux, vous regarderiez /proc.

   if( file_exists("/tmp/daemon.pid"))
   {
       $pid = file_get_contents( "/tmp/daemon.pid" );
       if( file_exists( "/proc/$pid" ))
       {
           error_log( "found a running instance, exiting.");
           exit(1);
       }
       else
       {
           error_log( "previous process exited without cleaning pidfile, removing" );
           unlink( "/tmp/daemon.pid" );
       }
   }
   $h = fopen("/tmp/daemon.pid", 'w');
   if( $h ) fwrite( $h, getmypid() );
   fclose( $h );

Pe> windows well_exec () TaskList.exe, et qui trouverait un identifiant de processus correspondant: P>

$processes = explode( "\n", shell_exec( "tasklist.exe" ));
foreach( $processes as $process )
{
     if( strpos( "Image Name", $process ) === 0
       || strpos( "===", $process ) === 0 )
          continue;
     $matches = false;
     preg_match( "/(.*?)\s+(\d+).*$/", $process, $matches );
     $pid = $matches[ 2 ];
}


4 commentaires

pcntl_fork () ne changera pas les processus actuels PID! La fonction PCNTL_FORK () crée un processus enfant qui diffère du processus parent uniquement dans son PID et son PIPID. Veuillez consulter la page Fork (2) de votre système pour des détails spécifiques sur la manière dont Fourche fonctionne sur votre système.


Hmm, j'espérais une manière plus croix de vérifier si un PID existait :(


Avec mon édition, j'ai mentionné que je ne pense pas qu'il veuille pcntl_fork (), ni il ne tient à choisir PID.


La boucle pour Windows devrait être plutôt quelque chose comme ça:



1
votes

Non, vous ne pouvez pas modifier les processus PID. Il est assigné par le noyau et fait partie des structures de données du noyau


0 commentaires

0
votes

Comme d'autres personnes ont dit, vous ne pouvez pas modifier l'ID de processus - il est attribué et entièrement encombré par le noyau du système d'exploitation. De plus, vous n'avez pas dit s'il s'agit de la ligne de commande ou du serveur Web basé: si c'est ce dernier, vous ne pouvez même pas avoir le PID de votre script.

the page manuelle de getMypid () contient quelques exemples de "optimiste "Verrouillage. J'utilise le mot optimisitc alors que php ne va jamais approcher des goûts d'une application Web ASP.NET où vous avez un véritable environnement fileté avec des classes partagées / statiques et donc Singleton's à utiliser / abuser. Fondamentalement, vous avez la possibilité de:

  • toucher un "fichier de verrouillage" sur le système de fichiers quelque part. Votre script vérifie ensuite si ce fichier existe: si tel est le cas, terminez, sinon, appuyez sur ce fichier et continuez à traiter
  • Définition d'un drapeau basé sur la base de données pour dire que le script est en cours d'exécution. Comme ci-dessus, mais utilisez une table / un champ de base de données pour marquer un script comme en cours d'exécution.

    Ces deux s'appuient sur le script se terminant correctement (comme la dernière étape consisterait à supprimer le fichier de fichiers de verrouillage / db). Si un script se bloque pour une raison quelconque (ou la machine elle-même), vous pouvez être laissé avec un processus de rangement manuel pour supprimer le drapeau. Il n'y a pas de solution facile pour cela, mais une avenue à explorer serait alors d'examiner la date-estampage de la serrure, avec un arbitre "si plus âgé que x, la dernière course doit avoir écrasé" approche.


0 commentaires

6
votes

Un meilleur moyen d'accomplir cela serait d'utiliser un fichier PID ou un fichier de verrouillage. Vérifiez simplement l'existence du fichier PID, de le créer si nécessaire et de le remplir avec votre PID exécutant.

<?
  $pidfile = new pidfile('/tmp', 'myscript');
  if($pidfile->is_already_running()) {
    echo "Already running.\n";
    exit;
  } else {
    echo "Started...\n";
  }
?>


1 commentaires

Le problème est que __Deduct n'est pas déclenché lors de la réinitialisation Apache



0
votes

N'oubliez pas aussi que vous pouvez accéder aux commandes Shell via des backtsks (`), ce qui vous donnerait accès aux outils standard * Nix pour travailler avec PIDS.

Source: http://www.php.net/manual /en/language.operators.execution.php


0 commentaires

3
votes

Pour vérifier si un PID existe sur une machine Windows, j'utilise:

exec('TASKLIST /NH /FO "CSV" /FI "windowtitle eq ' . escapeshellarg($uniquehash) . '"', $output );


1 commentaires

Il convient également à quelque chose de prendre en considération quelque chose que PowerShell ne gère pas les chemins avec des espaces. Cela peut donc l'empêcher de travailler.