Attraper un vent favorable ou comment exécuter un script PHP. Application console interactive en PHP

Je ferai immédiatement une réserve sur le fait que tout ce qui sera discuté dans cet article ne s'applique qu'aux systèmes d'exploitation de type Unix et ne fonctionnera pas sous Windows. C'est exactement de cela dont nous parlons alternative à la couronne. Les amateurs malchanceux de Windows devront conjurer avec "Planificateur de tâches"- Black Magic leur restera inaccessible :) De plus, vous aurez besoin d'un accès ssh, et idéalement, d'un accès script php à la ligne de commande.

Qu'est-ce qu'un programme démon et comment écrire un démon en PHP

Démon(démon, dæmon, divinité grecque ancienne δαίμων) - Programme d'ordinateur dans les systèmes de classe UNIX, lancés par le système lui-même et exécutés dans arrière-plan sans interaction directe de l'utilisateur. Les démons démarrent généralement lors du démarrage du système.

Applicable à PHP, c'est un script qui peut s'exécuter tout seul, sans arrêt et sans interaction de l'utilisateur. Comment obtenir un tel script ? En fait, c'est très simple, il suffit d'enfreindre l'une des premières règles de programmation qu'on enseigne à l'école, et créer une boucle infinie :

// Pour que le programme fonctionne constamment, il doit simplement fonctionner constamment ;) while(1) ( // Le code du démon sera situé ici // ... // Le temps de veille du démon entre les itérations (dépend des besoins du système) dormir(1); )

Le code incroyablement simple soulève encore plusieurs questions. Comment le lancer ? Comment suivre sa mise en œuvre ? Comment l'arrêter ?

Comment démarrer un démon php

Comment exécutez-vous des scripts PHP en général ? S'il s'agit d'une application Web, utilisez un navigateur et un serveur Web. Mais cette option ne convient pas, car nous avons affaire à un script sans fin, et le temps d'exécution des scripts est limité par la directive max_execution_time V php.ini. Par conséquent, un script sans fin doit être exécuté via la console, car alors le temps d'exécution maximum n'est pas pris en compte. La commande pour démarrer le démon ressemble à ceci :

Php -f /chemin/vers/votre/daemon.php &

Pour le démarrer manuellement, vous devez le saisir dans le terminal ssh (putty, WinSCP, etc.), et pour le démarrer par le système au démarrage - dans le fichier de démarrage correspondant (la position et le nom du fichier dépendent de système opérateur). Veuillez noter que la console le script démon s'exécute en arrière-plan, sans impliquer l'utilisateur dans l'attente de son achèvement (après tout, le script est sans fin). C'est la possibilité d'exécuter un processus en arrière-plan qui est la raison pour laquelle la méthode que je décris ne convient pas aux serveurs Windows. Après le lancement, la console devrait afficher identifiant du processus notre démon, le soi-disant PID.

Traquer et arrêter les démons

Vous pouvez vérifier si le processus démon est en cours d'exécution en ouvrant simplement la liste des processus sur le système :

PS-aux

Trouver un démon dans la liste des processus est simple, aussi bien par la commande de lancement que par le PID :

UTILISATEUR PID %CPU %MEM VSZ RSS TTY STAT HEURE DE DÉBUT COMMANDE ... root 22193 0.1 0.2 393180 72132 ? S 24 avril 5h05 php -f /path/to/your/daemon.php &

Arrêtez le processus démon vous pouvez le faire de la même manière que n’importe quel autre processus :

Tuer xxxx

Dans l'exemple donné, xxxx est le PID, l'identifiant du processus.

Il convient de noter que cela n’arrête pas, mais plutôt « tue » le processus démon. Le fait est que le scénario sera interrompu n'importe où, ce qui ne convient pas toujours à tout le monde. En théorie, dans ce cas, le démon devrait être arrêté quelque part entre ses itérations et non plus depuis la console. Par exemple, nous pouvons créer une demande pour arrêter le script dans la base de données ou dans un fichier sur le serveur, et entre les itérations du démon, vérifier si une telle demande existe. Si l'application est trouvée, arrêter la boucle avec l'instruction break.

Système de contrôle des démons

Que se passe-t-il si vous devez créer et suivre plusieurs démons à la fois ? Par exemple, dans le service CheckTrust mentionné ci-dessus, > 30 de ces scripts sont impliqués dans le traitement des données utilisateur et des projets. Les créer et les surveiller à partir de la console est très gênant - une interface plus conviviale est nécessaire.

Cool, ouais ? :) Parfait pour créer système similaire ce serait bien d'avoir un accès en ligne de commande depuis php. Chaque démon est une entrée dans la base de données, sur laquelle vous pouvez saisir une commande pour le lancer, ainsi que le PID du processus. Par conséquent, il devient possible de démarrer, arrêter et surveiller l’état des démons directement depuis l’interface web. En conséquence, les démons eux-mêmes se sont avérés faire partie d'une application console et le système de gestion de ceux-ci est devenu une partie d'une application Web.

Étant donné que le système présenté ci-dessus est conçu strictement pour CheckTrust, je ne montrerai pas son code. Mais je vais copier le code ici classe php pour gérer les processus, que j'ai utilisé lors de sa création :

<?php /* * Process.php * Un moyen simple de suivre les processus externes. * Vous avez toujours voulu exécuter un processus en php, mais vous vouliez quand même avoir un certain contrôle sur le processus ? Eh bien… C’est une façon de le faire. * @compability : Linux uniquement. (Windows ne fonctionne pas). * @author: Peec */ class Process( private $pid; private $command; public function __construct($cl=false)( if ($cl != false)( $this->command = $cl; $this-> runCom(); ) ) fonction privée runCom())( $command = "nohup ".$this->command." > /dev/null 2>&1 & echo $!"; exec($command ,$op); $ this->pid = (int)$op; ) fonction publique setPid($pid)( $this->pid = $pid; ) fonction publique getPid())( return $this->pid; ) état de la fonction publique ( ))( $command = "ps -p ".$this->pid; exec($command,$op); if (!isset($op))return false; else return true; ) public function start()) ( if ($ this->command != "")$this->runCom(); else return true; ) public function stop())( $command = "kill ".$this->pid; exec($command ); if ($ this->status() == false)return true; sinon return false; ) ) ?>

Le seul inconvénient de cette classe est que j'ai déjà décrit la vôtre - elle arrête les processus en utilisant la méthode kill, mais cela me suffit pour l'instant :) Et le voici un exemple de son utilisation :

// Démarre le démon et récupère le PID (en supposant que le pid soit enregistré quelque part après le démarrage) $command = ""; $processus = nouveau processus($commande); $processId = $process->getPid(); // Vérification de l'état du démon $process = new Process(); $process->setPid($processId); $statut = $processus->statut(); // renvoie vrai ou faux // Arrêt du démon $process = new Process(); $process->setPid($processId); $stopped = $process->stop(); // renvoie vrai ou faux

Pour résumer, je tiens à dire que ce n'est pas la seule implémentation possible et, probablement, pas la plus optimale des démons en PHP. Par exemple, il existe une extension PHP intéressante, PCNTL, pour les démons multi-processus. Certains pourraient même dire qu'il existe des langages de programmation complètement différents pour les applications console. Mais quoi qu’on en dise, cette mise en œuvre a indéniablement avantages :

  • Elle est simple comme une pantoufle. Un démon n’est qu’une boucle sans fin, bien plus simple.
  • Il est compatible avec les applications Web- faisant partie d'un service web, mes démons s'appuient sur les développements existants, utilisent les mêmes modèles de données, classes et méthodes de travail avec eux.
  • Elle travaille! Sérieusement, certains démons fonctionnent depuis plusieurs mois maintenant et, étant bien écrits, ils ne deviennent pas stupides, ne se figent pas et ne consomment pas de mémoire.

Merci de votre attention :) Si quelqu'un a des questions ou des idées, je me ferai un plaisir d'y répondre dans les commentaires.

PHP est l'un des langages de programmation les plus populaires sur le Web. Il doit sa popularité avant tout à sa facilité d’apprentissage et à sa polyvalence. Mais le champ de son application ne s’arrête pas seulement à la création de simples pages web. Les scripts PHP peuvent être exécutés à partir de ligne de commande, ce qui vous permet d'y écrire des applications console à part entière.

Comment exécuter un script php depuis la ligne de commande ?

Quel que soit le système d'exploitation que vous utilisez, pour exécuter le script, vous devez taper la commande suivante dans la console :

Script Php.php

Votre système d'exploitation peut afficher un message indiquant que la commande php lui est inconnue. Dans ce cas, et si vous êtes sûr que l'interpréteur PHP lui-même est correctement installé, il sera utile de spécifier le chemin complet de l'interpréteur lors de l'exécution du script.

C:\php\php.exe script.php

Pour les systèmes de type UNIX :

/usr/bin/php script.php

Veuillez noter que le chemin d'accès à l'interpréteur PHP sur votre système peut être différent, cela doit donc également être pris en compte. Par exemple, pour les utilisateurs du package WampServer populaire, le chemin peut être :

C:\wamp\bin\php\php5.3.8\php.exe

Enfin, pour éviter de devoir saisir le chemin complet à chaque fois, vous devez ajouter le chemin de l'interpréteur à la variable d'environnement PATH de votre système d'exploitation.

Nous écrivons un script simple pour vérifier le code de réponse du serveur

Afin de montrer les fonctionnalités du script depuis la ligne de commande, nous allons écrire une application simple qui prendra fichier texte avec des liens et vérifiez le code de réponse du serveur pour chacun de ces liens. De plus, nous offrirons la possibilité de sélectionner le fichier souhaité de manière interactive, afin d'apprendre en même temps comment cela se fait.

Immédiatement après le lancement, le script sélectionne tous les fichiers portant l'extension *.txt dans le dossier des fichiers. Ensuite, il affiche cette liste à l'utilisateur au format numéro => nom et attend que l'utilisateur saisisse le numéro du fichier qui l'intéresse.

Récupérer tous les fichiers par masque est simple ; pour cela nous utiliserons la fonction glob standard, mais la lecture des données depuis la console est un peu plus intéressante. Le fait est qu'après avoir exécuté le script à partir de la ligne de commande, trois flux standard y sont ouverts : pour la sortie (STDOUT), l'entrée (STDIN) et les erreurs (STDERR). Les pointeurs vers ces flux sont disponibles pour le script sous la forme de constantes du même nom et vous pouvez travailler avec eux de la même manière que, par exemple, avec des fichiers normaux. Ainsi, pour lire les données de la console, lisez simplement la ligne du flux d'entrée : fgets(STDIN) .

$files = glob("files/*.txt"); $files ou exit("Aucun fichier à vérifier.".PHP_EOL); echo "Fichiers dans le dossier : ".count($files).PHP_EOL; foreach ($files as $index => $name) ( echo "[($index)] => ($name)".PHP_EOL; ) echo "Choisissez le fichier : "; $choice = intval(fgets(STDIN));

Une fois que l'utilisateur a fait sa sélection et vérifié que la sélection est correcte, nous pouvons ouvrir le fichier en lecture.

Array_key_exists($choice, $files) ou exit("Mauvais fichier sélectionné.".PHP_EOL); $fichier = $fichiers[$choix]; echo "Traitement du fichier "($file)...".PHP_EOL; $start_time = microtime(true); $code_stats = tableau(); $f = fopen($fichier, "r");

À l’aide d’une boucle while, nous commençons à parcourir toutes les lignes du fichier. Les chaînes doivent être des URL valides, sinon nous ne pourrons pas déterminer le code de réponse correct du serveur. Nous obtenons des en-têtes pour chaque adresse en utilisant fonction standard get_headers , et le code de réponse se trouve généralement dans la première ligne de l'en-tête.

While ($url = trim(fgets($f))) ( $headers = get_headers($url); if (is_array($headers)) ( array_key_exists($headers, $code_stats) ou $code_stats[$headers] = 0 ; $code_stats[$headers]++; echo date("H:i:s")." Code HTTP "($headers)" pour l'url "($url)"".PHP_EOL; ) else ( array_key_exists("Inconnu ", $code_stats) ou $code_stats["Unknown"] = 0; $code_stats["Unknown"]++; echo date("H:i:s")." Problème avec l'url "($url)"". PHP_EOL; ) ) fclose($f);

Par conséquent, après le traitement du fichier, vous pouvez afficher de petites statistiques sur la durée du traitement et le nombre de codes de réponse rencontrés.

$elapsed_time = round(microtime(true) - $start_time, 3); echo "Fichier traité dans ($elapsed_time)s".PHP_EOL; echo "Les statistiques du code sont :".PHP_EOL; print_r($code_stats);

Le résultat d’une telle application pourrait être, par exemple, le résultat suivant :

$ php check.php Fichiers dans le dossier : 1 => files/db.txt Choisissez le fichier : 0 Traitement du fichier "files/db.txt"... 18:33:43 Code HTTP "HTTP/1.0 200 OK" pour l'url "http://mail.ru/" 18:33:45 Code HTTP "HTTP/1.1 301 Déplacé de façon permanente" pour l'url "http://yandex.ru/" 18:33:46 Code HTTP "HTTP/1.1 302 Déplacé Temporairement" pour l'URL "http://rambler.ru/" 18:33:47 Code HTTP "HTTP/1.0 301 Moved Permanently" pour l'url "http://google.ru/" Le fichier traité en 5,558 s Les statistiques du code sont : Tableau ( => 1 => 1 => 1 => 1)

conclusions

Voilà, simple et interactif. application de la console prêt en PHP. Je ne voulais pas écrire un programme complètement inutile, ce script convient donc non seulement à l'apprentissage, mais aussi à l'utilisation. Par exemple, si vous enregistrez un plan du site dans un fichier texte, le script vous aidera à déterminer erreurs possibles avec des liens, et si vous le modifiez un peu, il indiquera même lesquels :).

L'application elle-même peut être téléchargée.

Bonjour à tous. Aujourd'hui, je commence à écrire dans une nouvelle section - PHP! En gros, voici les bases et les bases de ce langage. Et d’abord, je vais vous expliquer comment ouvrir un fichier php dans un navigateur ?

Pourquoi PHP ne s'ouvre-t-il pas comme HTML ?

Voici le problème : php est un langage côté serveur. HTML et Javascript sont côté client. Par conséquent, pour exécuter du code PHP, vous devez démarrer le serveur, ce n'est que dans ce cas que le fichier peut être ouvert. En fait, il n'y a que 2 façons :

  1. Créez un site Web sur un hébergement réel où vous expérimenterez PHP
  2. Créez un serveur local sur lequel vous pouvez créer gratuitement un nombre illimité de sites Web sur votre ordinateur et expérimenter à votre guise.

Et je vous conseille fortement exactement la deuxième option. Par conséquent, avant de commencer à ouvrir des fichiers php, vous devez installer un tel serveur. Ne pensez pas que c'est difficile : vous pouvez le faire en quelques minutes seulement. Parmi les serveurs locaux les plus connus pour les fenêtres Je peux souligner les éléments suivants :

  1. Serveur Ouvert
  2. Denwer
  3. Xammp

Personnellement, je n'ai travaillé qu'avec Denver. Je pourrais écrire sur son installation séparément, mais j'ai décidé qu'il ne pouvait y avoir rien de mieux que la documentation officielle des développeurs. À cet égard, le voici. Vous pouvez trouver de nombreux articles et vidéos sur Internet concernant l’installation d’autres serveurs.

Comment ouvrir un fichier php après avoir installé le serveur ?

Le serveur est-il installé ? Super, vous avez maintenant tout pour exécuter des fichiers php. En fait, pour ce faire, votre serveur local doit être en cours d'exécution. Voici le raccourci que vous devriez avoir sur votre bureau :

Vous devez maintenant créer un nouveau site Web pour serveur local. Encore une fois, je montre seulement comment procéder à Denver. Allons à dossier racine serveur, nous trouvons ici le dossier maison. Il contiendra tous vos sites. Vous devez créer un nouveau dossier, son nom sera le nom du nouveau site. Dans le dossier créé, vous devez créer un dossier www, sans cela rien ne fonctionnera. La dernière étape consiste à déposer les fichiers php nécessaires (qui doivent être ouverts) dans le dossier www. C'est la racine du site.

La façon d’ouvrir les fichiers php est différente de la façon d’ouvrir le HTML. Vous ne pouvez pas les ouvrir directement dans le navigateur, auquel cas vous ne verrez que le code. Pour ouvrir un fichier, vous devez enregistrer le site sur lequel il se trouve, ainsi que le chemin d'accès au fichier sur le site. Je tiens à souligner que si vous saisissez simplement le nom du site (sans http://, mais avec une barre oblique), le serveur lancera index.php, s'il existe.

Exemple:
J'ai créé un dossier phptest sur le serveur local, avec www dedans, puis je l'y ai téléchargé fichiers nécessaires. Génial, vous devez maintenant redémarrer Denver s'il était en cours d'exécution. Sinon, exécutez-le. Maintenant, dans la ligne du navigateur, vous devez taper : phptest/

Alors tu arrive à page d'accueil site. Ce fichier doit s'appeler index.php. Par exemple, j'ai créé une calculatrice en php, je l'ai mise dans phptest appelée calc.php. J'écris l'adresse avant ce fichier :

Super, la calculatrice s'est ouverte. Vous pouvez tester l'application.

Comment ne pas ouvrir php ?

Cela n'a pas besoin d'être fait comme les fichiers HTML. Autrement dit, pas à travers "Pour ouvrir avec""Navigateur". De cette façon vous ne verrez que le code source du fichier, mais en aucun cas le résultat de son exécution.

Ça y est, nous avons compris comment ouvrir un fichier php dans un navigateur. Il suffit d'installer et de configurer un serveur local une fois, et à l'avenir vous pourrez ouvrir des fichiers de cette résolution sans aucun problème. C'est tout ce que j'ai pour aujourd'hui. J'espère que tout s'est bien passé pour toi. À bientôt.

De l'auteur : Si vous avez déjà piloté un cerf-volant, vous savez que ce n'est pas si facile, même si de l'extérieur, cela semble le contraire. En fait, il faut s'y habituer pour pouvoir tirer la corde à temps ou capter la « vague » d'air. Aujourd'hui, je vais vous expliquer comment exécuter un script PHP et quelles « ficelles » tirer pour qu'il non seulement fonctionne, mais « vole » !

Fonctionnalités de lancement

Comme cela a été mentionné plus d'une fois, il s'agit d'un langage de programmation côté serveur, donc faire apparaître le résultat de son code dans le navigateur sera un peu plus difficile. Pour ce faire, le fichier doit se trouver directement sur l'espace serveur. Il existe deux types de serveurs utilisés pour travailler avec PHP :

Régulier (à distance) – fourni par l’hébergeur.

Local – installé sur la machine client.

Côté hébergement, pour voir le résultat du script, saisissez l'adresse au format suivant dans la ligne du navigateur : your_site.ru/file_name.php

Sur un serveur local, les choses sont différentes. Avant d'exécuter le script PHP dans le navigateur, découvrons ces fonctionnalités.
Selon le serveur utilisé, l'adresse que vous composez peut différer. Le plus souvent, dans « notre » région, diverses versions avec Apache sont utilisées, dont Denver est la plus courante.

Exécuter le script dans Denwer

Dans les versions Apache, tous les scripts sont lancés dans localhost. Pour démontrer cela en pratique, créons quelques exemple intéressant. Voici son code :



< html >

< head >

< meta http - equiv = "refresh" content = "1" >

< / head >

< body >

< time style = "taille de police : 36 px ; couleur : rvb (102 255 102) »> < / time >

< / body >

< / html >

Placez ce code dans un fichier PHP et enregistrez-le sur le disque virtuel créé après le démarrage du serveur local. Pour moi c'est le fichier test2.php.

En haut de l'image, le chemin où vous devez placer le fichier créé est indiqué. Ce chemin peut être légèrement différent pour vous si vous avez spécifié un nom de disque virtuel différent lors de l'installation de Denver.

Voyons maintenant comment exécuter un script PHP sur un ordinateur. Pour ce faire, vous devez spécifier l'adresse dans le navigateur au format : localhost/file_name.php

Nous commençons à souffrir

Peut-être que le nom est trop ennuyeux pour une section, mais j'ai eu un peu de mal jusqu'à ce que je puisse ouvrir le fichier via la ligne de commande. Lors de la tentative de démarrage du système PC, les erreurs suivantes se sont produites :

C'est étrange, puisque les bibliothèques mentionnées se trouvaient dans mon dossier ext. Il s'avère que tout l'intérêt réside dans des chemins mal spécifiés dans le fichier de configuration php.ini.

Dans celui-ci, vous devez trouver la section « Chemins et répertoires » et corriger le chemin spécifié dans le paramètre extension_dir. Remplacez les barres obliques droites par des barres obliques gauches et ajoutez la lettre du lecteur virtuel au début de l'adresse.

Si vous ne parvenez toujours pas à exécuter le script PHP à partir de la console CMD, vous devez alors examiner tous les chemins mentionnés dans le message d'erreur et les corriger.

Si tout va bien

Sur la ligne de commande, le système doit préciser le chemin où se trouve « l'exécutable » de l'interpréteur du langage PHP. À Denver, il se trouve à ce chemin : Z:\usr\local\php5

Le fichier de configuration globale se trouve également ici.

Lancez la ligne de commande Windows. Ensuite, nous indiquons au système le chemin d'accès à l'exécutable Fichier PHP. Définissez ensuite le chemin du script souhaité : Z:\usr\local\php5\php.exe Z:\home\localhost\www\test2.php

Mais au final vous obtiendrez un résultat qui n'est pas tout à fait attendu :

Et tout cela parce que la ligne de commande « ne comprend pas » les balises. Avant d'exécuter le script PHP depuis la ligne de commande, nous modifions légèrement le code pour qu'il renvoie uniquement l'heure actuelle sans l'effet « horloge ».

gastrogourou 2017