[Происхождение] Всем известен процесс-демон (Daemon) в Linux/Unix, например, наши часто используемые httpd, mysqld и т. д., которые представляют собой программы, работающие в резидентной памяти, подобно службам в Windows. Обычно процессы-демоны пишутся на C/C++, что означает создание дочерних процессов через fork. Когда родительский процесс в текущей оболочке завершается, дочерний процесс запускается в фоновом режиме, чтобы не генерировать выходную информацию на терминале. , для записи файлов журналов используются такие функции, как системный журнал.
Мы знаем, что php — это язык сценариев и выполняется через механизм сценариев php, поэтому создать процесс-демон затруднительно. Сегодня мы объединим команды Unix/Linux для реализации функции нашего процесса-демона.
[Принцип] Функция команды nohup в Unix заключается в запуске команды без зависания. При этом nohup помещает весь вывод программы в файл nohup.out в текущем каталоге. недоступен для записи, он помещается в файл <домашний каталог пользователя> /nohup.out. Итак, после получения этой команды наша программа php пишет сценарий оболочки и использует цикл для поддержания работы нашего сценария. Затем, независимо от того, закрыто наше окно терминала или нет, наш сценарий php может продолжать работать. Конечно, когда наш php-процесс завершается или перезапускается операционная система, он естественным образом завершается.
[Функция] Вы наверняка спросите, а какой смысл делать наш php-скрипт демоном? Конечно есть, например, самая типичная функция, которая по сути может заменить функцию cron. Например, определенные операции, которые нам нужно выполнять регулярно, можно выполнять с помощью нее, и cron больше не нужен. сервер перезапускается, возможности нет. Однако обычные Unix-серверы перезапустить не так-то просто. Кроме того, мы также можем сделать простую серверную функцию, например, создать сервер, который может использовать Telnet. Хе-хе, ее можно превратить в небольшой бэкдор, но реализация немного сложна.
[Практика] Пример 1: Автоматическое создание файлов Теперь мы приведем два примера, чтобы доказать наше вышеприведенное утверждение. Прежде всего, первый — автоматически генерировать файл каждые тридцать секунд и выполнять его вечно.
Во-первых, вы должны убедиться, что используется операционная система Unix или Linux, например FreeBSD, Redhat, Fedora или SUSE. Затем мы должны убедиться, что наш механизм сценариев PHP находится в каталоге /usr/local/php/bin/php. Конкретный путь может быть записан в соответствии с вашим фактическим путем. Если механизма сценариев нет, установите его самостоятельно.
Например, если текущий каталог /home/heiyeluren/, мы используем vi или другие редакторы для записи файла с именем php_daemon1.php:
$ vi php_daemon1.php
Затем напишите следующий код:
#!/usr/local/php/bin/php
<?
set_time_limit (0);
пока(1)
{
@fopen("test_".time().".txt","w");
спать(30);
}
?>
Затем сохраните и выйдите из vi, а затем дайте права на исполняемый файл php_daemon1.php:
$ chmod +x /home/heiyeluren/php_daemon1.php
Затем дайте нашему скрипту выполниться в фоновом режиме и выполните следующую команду:
$ nohup /home/heiyeluren/php_daemon1.php &
Не забудьте добавить символ & в конце, чтобы он мог работать в фоновом режиме. После выполнения указанной выше команды появится следующее приглашение:
[1] 82480
добавление вывода в nohup.out
После возвращения в машину появится подсказка оболочки. Таким образом, приведенный выше совет означает, что выходная информация о выполнении всех команд будет помещена в файл nohup.out, о котором упоминалось выше. Затем после выполнения указанной выше команды мы будем видеть больше файлов, начинающихся с test_, в текущем каталоге каждые тридцать секунд, например: test_1139901144.txt test_1139901154.txt и другие файлы, что доказывает, что наша программа работает в фоновом режиме.
Итак, как нам прекратить работу программы? Лучший способ — перезапустить операционную систему. Ха-ха, конечно, это не рекомендуется. Мы можем использовать команду kill, чтобы завершить процесс. Прежде чем завершить процесс, мы, естественно, знаем номер PID процесса. ID. Вы можете использовать команду ps, чтобы увидеть его.
$пс
КОМАНДА ПИД-ТТ СТАТ ВРЕМЕНИ
82374 p3 Сс 0:00.14 -баш (баш)
82510 p3 S 0:00.06 /usr/local/php/bin/php /home/heiyeluren/php_daemon1.php
82528 p3 R+ 0:00,00 пс
Выше мы видели, что идентификатор процесса нашего php: 82510, поэтому мы выполняем команду kill:
$ убить -9 82510
[1]+ Убит nohup /home/heiyeluren/php_daemon1.php
Когда вы увидите это приглашение, вы поймете, что процесс был завершен. Если вы повторите команду, вы обнаружите, что он исчез:
$пс
КОМАНДА ПИД-ТТ СТАТ ВРЕМЕНИ
82374 п3 Сс 0:00.17 -баш (баш)
82535 p3 R+ 0:00,00 пс
Если вы не можете увидеть процесс напрямую с помощью команды ps, используйте для его просмотра две комбинированные команды ps и apos, и вы обязательно сможете увидеть процесс.
На основе описанного выше процесса вы можете расширить его и создать собственную программу cron, тогда вам не понадобится cron. Конечно, это всего лишь один из способов. Пример 2: демон на стороне сервера. Он грубо моделируется с использованием серверной части PHP, а затем запускается в фоновом режиме для достижения эффекта серверного демона.
Продолжайте работу в нашем домашнем каталоге: /home/heiyeluren и отредактируйте файл php_daemon2.php:
$ vi php_daemon2.php
Введите следующий код (код взят из руководства по PHP, я изменил комментарии):
#!/usr/local/php/bin/php
<?php
/* Настройки http://www.knowsky.com/php.asp не отображают никаких ошибок*/
error_reporting (0);
/* Таймаут скрипта бесконечен*/
set_time_limit (0);
/* Начать фиксированную очистку */
ob_implicit_flush();
/* IP этой машины и порты, которые необходимо открыть */
$адрес = '192.168.0.1';
$порт = 10000;
/* Генерируем сокет */
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo "socket_create() не удалось: причина: " . socket_strerror($sock) "n";
}
/* Привязываем IP-адрес и порт */
if (($ret =ocket_bind($sock, $address, $port)) < 0) {
echo «socket_bind() не удалось: причина: ».
}
/* Соединение с монитором */
if (($ret = socket_listen($sock, 5)) < 0) {
echo «socket_listen() не удалось: причина: ».
}
/*Вечный цикл для отслеживания пользовательских подключений*/
делать {
if (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() не удалось: причина: " . socket_strerror($msgsock) "n";
перерыв;
}
/* Отправляем подсказку подключенным пользователям*/
$msg = “=======================================rn " .
«Добро пожаловать на тестовый сервер PHP. rnrn».
«Чтобы выйти, введите «quit». rn» .
«Чтобы выключить сервер, введите «shutdown».rn» .
«Чтобы получить справочное сообщение, введите «help».rn» .
"========================================rn" .
"php>";
socket_write($msgsock, $msg, strlen($msg));
делать {
if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo «socket_read() не удалось: причина: ».
перерыв 2;
}
if (!$buf = Trim($buf)) {
продолжать;
}
/*Закрываем клиентское соединение, когда клиент вводит команду выхода*/
if ($buf == 'выход') {
перерыв;
}
/* Когда клиент вводит команду завершения работы, и сервер, и клиент отключаются*/
if ($buf == 'выключение') {
сокет_закрыть ($ msgsock);
перерыв 2;
}
/* Вывод справочной информации, когда клиент вводит команду справки*/
if ($buf == 'помощь') {
$msg = «Сообщение справки PHP-сервера rnrn».
«Чтобы выйти, введите «quit». rn» .
«Чтобы выключить сервер, введите «shutdown».rn» .
«Чтобы получить справочное сообщение, введите «help».rn» .
"php>";
socket_write($msgsock, $msg, strlen($msg));
продолжать;
}
/*Сообщение, когда команда ввода клиента не существует*/
$talkback = «PHP: неизвестная команда '$buf'.rnphp> «;
socket_write($msgsock, $talkback, strlen($talkback));
эхо «$bufn»;
} Пока (истина);
сокет_закрыть ($ msgsock);
} Пока (истина);
/* Закрытие сокетного соединения */
сокет_закрыть ($ носок);
?>
Сохраните приведенный выше код и выйдите.
Приведенный выше код примерно выполняет функцию, аналогичную серверной стороне Telnet, то есть, когда серверная часть запускает программу, клиент может подключиться к порту 10000 сервера для связи.
Добавьте исполняемые права доступа к файлу:
$ chmod +x /home/heiyeluren/php_daemon2.php
Выполните команду на сервере:
$ nohup /home/heiyeluren/php_daemon2.php &
Он входит в фоновую работу, и мы поднимаемся через телнет клиента Windows:
C:>telnet 192.168.0.1 10000
Если будет предложено:
Подключение к 192.168.0.188... Невозможно открыть соединение с хостом по порту 10000: Если соединение не установлено, это означает, что сервер не открыт или вышеуказанная программа выполняется неправильно. Проверьте, есть ли в php параметр –enable. -функция розетки. Если будет предложено:
=========================================
Добро пожаловать на тестовый сервер PHP.
Чтобы выйти, введите «quit».
Чтобы выключить сервер, введите «shutdown».
Чтобы получить справочное сообщение, введите «help».
=========================================
php>
Это означает, что мы успешно подключились к серверному демону, написанному на PHP. После приглашения php> мы можем выполнить три команды, такие как помощь, выход и завершение работы. Если ввод команды не соответствует этим трем, будет предложено:
php> asdf
PHP: неизвестная команда «asdf».
Выполните команду help, чтобы получить помощь. php> help.
Справочное сообщение PHP-сервера
Чтобы выйти, введите «quit».
Чтобы выключить сервер, введите «shutdown».
Чтобы получить справочное сообщение, введите «help».
Эта серверная часть не будет представлена и может быть расширена самостоятельно.
Завершение процесса аналогично примеру 1.
[Вывод] Благодаря вышеизложенному мы знаем, что PHP также можно использовать в качестве демонического процесса. Если он хорошо спроектирован, функция будет более мощной. Однако мы здесь только учимся, и вы можете исследовать и обновлять его самостоятельно. .
Эта статья относится к руководству по PHP на китайском языке. Вам будет очень полезно прочитать дополнительные руководства.