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 p>
checkifpidexistes () dans php? Je veux dire une solution intégrée et non une solution de script de lot. P>
et y a-t-il un moyen de modifier un pid de scripts? P>
Quelques éclaircissements: P>
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. P>
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 P>
EDIT ---- P>
pour aider tout le monde D'autre avec ce proplamem, j'ai créé cette classe: p> et vous l'utilisez comme: p>
6 Réponses :
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 ]; }
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: foreach ($ processus en tant que processus $) {si (preg_match ('/ ^ (. *) \ s +'. $ pid. '/', $ processus)) {retour vrai; }}?> code>
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 p>
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. P>
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: p>
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. P>
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"; } ?>
Le problème est que __Deduct n'est pas déclenché lors de la réinitialisation Apache
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. P>
Source: http://www.php.net/manual /en/language.operators.execution.php p>
Pour vérifier si un PID existe sur une machine Windows, j'utilise:
exec('TASKLIST /NH /FO "CSV" /FI "windowtitle eq ' . escapeshellarg($uniquehash) . '"', $output );
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.
"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.