Выполнение PHP-файлов. Интерактивное консольное приложение на PHP

Начиная с версии 4.3, РНР поддерживает новый SAPI -тип (Server Application Programming Interface) под названием CLI , что означает Command Line Interface . Как следует из названия, главной задачей этого SAPI -типа является разработка оболочки/shell (или рабочего стола) приложений с помощью РНР. Имеются весьма небольшие отличия CLI SAPI от других SAPI , которые будут далее рассмотрены в этой главе.

CLI SAPI был выпущен в первый раз с PHP 4.2.0 , но тогда это был эксперимент, и нужно было явно включать его командой --enable-cli при запуске./configure . Начиная с PHP 4.3.0 , CLI SAPI больше не является экспериментальным и всегда встроен и устанавливается как двоичный исполняемый файл php (называется php.exe в Windows).

Существенные отличия CLI SAPI от других SAPI:

    В отличие от CGI SAPI , никакие шапки/headers не записываются в вывод.

    Хотя в CGI SAPI имеется способ подавления HTTP-шапок, эквивалентного переключателя для их включения в CLI SAPI нет.

    Имеются определённые директивы php.ini , которые переопределены в CLI SAPI , поскольку они не имеют смысла в среде окружения оболочки:

Таблица 24-1. Переопределение php.ini -директив
Директива CLI SAPI- значение по умолчанию Комментарий
html_errors FALSE Бывает довольно сложно прочитать в оболочке сообщение об ошибке, наполненное всеми этими бессмысленными HTML -тэгами, поэтому по умолчанию значение этой директивы FALSE .
implicit_flush TRUE Желательно, чтобы любой вывод из print() , echo() и компании немедленно записывался в вывод, а не отправлялся в какой-нибудь буфер. Вы всё ещё можете пользоваться буферизацией вывода , если хотите поработать со стандартным выводом.
max_execution_time 0 (unlimited) Из-за бесконечно больших возможностей использования PHP в среде окружения оболочки, максимальное время выполнения не ограничено. В то время как приложения, написанные для web, выполняются в течение долей секунды, приложения оболочки пытаются занять для своего выполнения максимальное время.
register_argc_argv TRUE Глобальные переменные PHP $argc (количество аргументов, передаваемых приложению) и $argv (массив текущих аргументов) всегда регистрируются и заполняются соответствующими значениями при использовании CLI SAPI .

Примечание: Эти директивы не могут быть инициализированы другим значением из файла конфигурации php.ini или специального файла (если специфицирован). Это является некоторым ограничением, поскольку эти значения по умолчанию применяются после разбора всех файлов конфигурации. Однако их значение может быть изменено на этапе прогона программы (что не имеет смысла для всех других директив, например, для register_argc_argv).

    Легче работать в среде оболочки, когда определены следующие константы:

    Таблица 24-2. Специфические CLI-константы
    Константа Описание
    STDIN Уже открытый поток в stdin . Она хранит открывшего её

    Вам не нужно явно закрывать эти потоки, это делается РНР автоматически.

  • CLI SAPI не изменяет текущую директорию на директорию исполняемого скрипта!

    Пример, показывающий отличие CGI SAPI:

    Когда используется CGI -версия, на выходе будет:

    Это даёт большую гибкость при написании утилит командной строки на PHP .

    Примечание: CGI SAPI поддерживает поведение CLI SAPI с помощью ключа -C при запуске из командной строки.

  • Список опций командной строки исполняемого файла PHP может быть получен в любое время путём запуска PHP с ключом -h:

    CLI SAPI имеет три разных способа получения PHP -кода, который нужно выполнить:

    1. Сказать PHP выполнить определённый файл.

      Особого внимания требует замена переменных оболочки и использование кавычек.

      Примечание: Просмотрите пример внимательно, нет начальных и конечных тэгов! Переключателю -r они просто не нужны. Использование их в данном случае приведёт к ошибке разборщика.

    2. Предоставить PHP -код для выполнения через стандартный ввод (stdin).

      Это позволяет динамически создавать PHP -код и передавать его экзешнику, как показано в данном (надуманном) примере:

      $ some_application | some_filter | php | sort -u >final_output.txt

    Вы не можете комбинировать эти три способа при выполнении кода.

    Как и в любом приложении оболочки, не только сам PHP , но и ваши скрипты PHP также принимают аргументы. Количество передаваемых в скрипт аргументов в РНР не ограничивается (оболочка имеет ограничение на количество передаваемых символов).
    Аргументы, передаваемые в ваш скрипт, доступны через глобальный массив $argv . Нулевой индекс всегда содержит имя скрипта (которое является символом - в случае, когда PHP -код приходит со стандартного ввода или с использованием ключа командной строки -r).
    Вторая регистрируемая глобальная переменная это $argc , которая содержит количество элементов в массиве $argv (а не количество аргументов, передаваемых в скрипт).

    Если аргументы, которые вы хотите передать в скрипт, не начинаются с символа дефиса (-) , ничего специально наблюдать не надо. Передача в скрипт аргумента, начинающегося с - , создаст проблемы, поскольку PHP думает, что должен сам их обработать. Чтобы предотвратить это, используйте в качестве сепаратора аргументов списка -- . После того как аргумент будет разобран PHP , каждый последующий аргумент передаётся в ваш скрипт без изменений/не разобранным.

    Однако, вот другой способ использования PHP для скриптинга оболочки. Вы можете написать скрипт, первая строка которого начинается с #!/usr/bin/php , а затем идёт нормальный PHP -код, содержащийся между начальным и конечным тэгами PHP , и соответствующим образом устанавливаются атрибуты выполнения файла. Таким способом он может быть исполнен как нормальный скрипт оболочки или perl:

    Как вы видите, ничего особо не нужно делать при передаче параметров в скрипт, который начинается с - .

    Таблица 24-3. Опции командной строки
    Опция Описание
    -s

    Отображать синтаксис в цвете.

    Эта опция использует внутренний механизм разбора файла, производит его расцвеченную HTML -версию и записывает её в стандартный вывод. Заметьте, что генерируется лишь блок [...] HTML -тэгов без HTML -header.

    Примечание:

    -w

    Отобразить исходный текст без комментариев и пробелов.

    Примечание: Эта опция не работает вместе с опцией -r .

    -f

    Разбирает и выполняет данный файл. Этот переключатель является необязательным и может быть опущен. Достаточно предоставить имя файла для выполнения.

    -v

    Записывает PHP, PHP SAPI и Zend-версии в стандартный вывод, например:

    -a

    Запускает PHP интерактивно.

    -d

    Эта опция позволяет устанавливать специальное значение для каждой директивы конфигурации, которые допускаются в php.ini . Синтаксис таков:

    -e

    Генерирует расширенную информацию для debugger/profiler.

    -z

    Загружает Zend-расширение. Если задано только имя файла, PHP пытается загрузить данное расширение из текущего пути по умолчанию к библиотеке в вашей системе (обычно специфицируется как /etc/ld.so.conf в Linux-системах). Передача filename с абсолютным путём не будет использовать системный путь поиска библиотеки. Относительное filename с информацией директории скажет PHP - попытаться загрузить расширение относительно текущей директории.

    -l

    Эта опция предоставляет удобный способ выполнения проверки синтаксиса данного PHP -кода. В случае успеха - текст No syntax errors detected in записывается в стандартный вывод, а return-код оболочки будет 0 . При неудаче - текст Errors parsing вместе с внутренним сообщением разборщика об ошибке записывается в стандартный вывод, а return-код оболочки будет 255 .

    Эта опция не будет находить фатальные ошибки (вроде не определённых функций). Используйте -f , если хотите проверить также и наличие фатальных ошибок.

    Примечание: Эта опция не работает вместе с -r .

    -m

    Используя эту опцию, PHP печатает на вывод встроенные (и загруженные) модули PHP и Zend:

    $ php -m xml tokenizer standard session posix pcre overload mysql mbstring ctype
    -i Эта опция командной строки вызывает phpinfo() и печатает на вывод результаты. Если PHP не работает правильно, советуем выполнить php -i и посмотреть, выводятся ли сообщения об ошибке до или вместо таблиц информации. Имейте в виду, что вывод будет на HTML и, следовательно довольно сумбурным.
    -r

    Эта опция позволяет выполнять PHP прямо в командной строке. Начальный и конечный тэги PHP () не нужны и вызывают ошибки разборщика.

    Примечание: Нужно проявлять внимание при использовании этой формы PHP , чтобы не было противоречий с заменой переменных командной строки, выполняемой оболочкой.

    Пример, выводящий ошибку разборщика:

    Корректным будет использовать одинарные кавычки " . Переменные в строках, заключённые в одинарные кавычки, не разворачиваются при работе sh/bash.

    Исполняемый файл PHP может быть использован для запуска PHP-скриптов абсолютно независимо от web-сервера.
    Если вы работаете под Unix, вы должны добавлять специальную первую строчку в ваши PHP-скрипты и делать их исполняемыми, чтобы система знала, какая программа должна выполнять эти скрипты.
    Под Windows вы можете ассоциировать php.exe с опцией двойного щелчка по файлам.php либо сделать batch-файл (.bat) для запуска скрипта через PHP. Строка, добавленная в начало скрипта для работы под Unix, не помешает под Windows, поэтому вы можете писать таким образом межплатформенные программы. Ниже дан пример простой РНР-программы для выполнения из командной строки.

    Здесь мы используем специальную первую строку для указания на то, что этот файл должен быть запущен в PHP. Здесь мы работаем с CLI-версией, поэтому не выполняется вывод HTTP-шапок/header. Имеются две переменные, которые вы можете использовать при написании РНР-приложений для командной строки: $argc и $argv . Первая - это количество аргументов плюс 1 (имя запущенного скрипта). Вторая - это массив аргументов, начиная с имени скрипта с индексом ноль ($argv).

    Мы проверяем, имеется ли менее или более одного аргумента. Также, если аргумент был --help , -help , -h или -? , мы печатаем help-сообщение, выводя имя скрипта динамически. Если мы получили какой-либо другой аргумент, мы выводим его (echo).

    Если вы хотите выполнить вышеприведённый скрипт под Unix, вам необходимо сделать его executable и просто вызвать как script.php echothis или script.php -h . Под Windows вы можете создать batch-файл для выполнения этой задачи:

    Приняв, что вы назвали программу script.php и что ваш php.exe находится в c:\php\php.exe , этот batch-файл запустит её с добавленными вами опциями: script.bat echothis или script.bat -h .

    См. также в документации по расширению Readline о функциях, которые можно использовать для усовершенствования вашего РНР-приложения для командной строки.

Всех приветствую. Сегодня я начинаю писать в новую рубрику — PHP ! В основном здесь будут основы и азы этого языка. И для начала я вам расскажу, как открыть php-файл в браузере?

Почему php не открывается так, как html?

Дело вот в чем: php — это серверный язык. Html и javascript — клиентские. Соответственно, для выполнения php-кода нужно запускать сервер, только в этом случае файл можно будет открыть. Собственно, тут только 2 пути:

  1. Создать на реальном хостинге сайт, на котором вы будете экспериментировать с php
  2. Создать локальный сервер, на котором вы сможете создавать бесплатно неограниченное количество сайтов у себя на компьютере и экспериментировать сколько душе угодно.

И я всячески советую вам именно второй вариант. Соответственно, перед тем, как начать открывать php файлы, нужно поставить себе такой сервер. Только не думайте, что это тяжело — справитесь буквально за пару минут. Из самых известных локальных серверов для Windows могу выделить такие:

  1. OpenServer
  2. Denwer
  3. Xammp

Лично я работал только с денвером. О его установке можно было бы написать отдельно, но я решил, что ничего лучше официальной документации от разработчиков быть не может. В связи с этим, вот она . Об установке других серверов вы можете найти массу статей и видео в интернете.

Как открыть php файл после установки сервера?

Сервер установлен? Отлично, теперь у вас все есть для запуска php-файлов. Собственно, чтобы это делать, ваш локальный сервер должен быть запущен. Вот такой ярлычок у вас должен быть на рабочем столе:

Теперь вам нужно создать новый сайт для локального сервера. Опять же, я показываю только как это делать на денвере. Заходим в корневую папку сервера, тут находим папку home . В ней будут все ваши сайты. Нужно создать новую папку, ее название и будет названием нового сайта. В созданной папке обязательно нужно создать папку www , без этого ничего работать не будет. Последний этап — кидаем нужные php-файлы (которые нужно открыть) в папку www. Она является корневой для сайта.

Способ открытия php-файлов отличается от того, как открывать html. Вы не можете открыть их в браузере напрямую, в таком случае вы увидите только код. Чтобы открыть файл, нужно прописать сайт, на котором он находится, а также путь к файлу на сайте. Хочу подчеркнуть, что если ввести просто название сайта (без http:// , но со слешем), то сервер запустит index.php , если такой имеется.

Пример:
Я создал на локальном сервере папку phptest , в ней — www , а уже в нее закинул нужные файлы. Отлично, теперь нужно перезапустить денвер, если он у вас был запущен. Если нет, просто запускаем. Теперь в браузерной строке нужно набрать: phptest/

Так вы попадаете на главную страницу сайта. Этот файл нужно назвать index.php . Например, я создал на php калькулятор, поместил его в phptest под названием calc.php . Прописываю адрес до этого файла:

Отлично, открылся калькулятор. Можно тестировать приложение.

Как не нужно открывать php?

Это не нужно делать так, как html-файлы. То есть не через «Открыть с помощью» «Браузер» . Так вы увидите только исходный код файла, но ни в коем случае не результат его выполнения.

Все, на этом мы разобрались с тем, как открыть php-файл в браузере. Достаточно один раз установить и настроить локальный сервер, и в будущем вы сможете без проблем открывать файлы этого разрешения. На этом у меня на сегодня все. Надеюсь, у вас все получилось. До встречи.

В CLI SAPI есть три различных способа запуска PHP-кода:

    Указывание конкретного файла для запуска.

    $ php my_script.php $ php -f my_script.php

    Оба способа (с указыванием опции -f или без) запустят файл my_script.php . Нет ограничений, какой файл запускать, и PHP-скрипты не обязаны иметь расширение .php .

    Замечание :

    Если необходимо передать аргументы в скрипт, то при использовании опции -f первым аргументом должен быть -- .

  1. Передать PHP-код напрямую в командной строке.

    $ php -r "print_r(get_defined_constants());"

    Необходимо быть особо осторожным при использовании этого способа, так как может произойти подстановка переменных оболочки при использовании двойных кавычек.

    Замечание :

    Внимательно прочтите пример: в нем нет открывающих и закрывающих тегов! Опция -r просто в них не нуждается. Их использование приведет к ошибке парсера.

  2. Передать запускаемый PHP-код через стандартный поток ввода (stdin ).

    Это дает мощную возможность создавать PHP-код и скармливать его запускаемому файлу, как показано в этом (вымышленном) примере:

    $ some_application | some_filter | php | sort -u > final_output.txt

Вы не можете комбинировать любой из этих трех способов запуска кода.

Как и любое другое консольное приложение, бинарный файл PHP принимает аргументы, но PHP-скрипт также может получать аргументы. PHP не ограничивает количество аргументов, передаваемых в скрипт (оболочка консоли устанавливает некоторый порог количества символов, которые могут быть переданы; обычно этого лимита хватает). Переданные аргументы доступны в глобальном массиве $argv . Первый индекс (ноль) всегда содержит имя вызываемого скрипта из командной строки. Учтите, что если код вызывается на лету из командной строки с помощью опции -r , значением $argv будет просто дефис (- ). То же самое верно и для кода, переданного через конвейер из STDIN .

Вторая зарегистрированная глобальная переменная - это $argc , содержащая количество элементов в массиве $argv ((а не количество аргументов, переданных скрипту).

Если передаваемые аргументы не начинаются с символа - , то особых проблем быть не должно. Передаваемый в скрипт аргумент, который начинается с - создаст проблемы, так как PHP решит, что он сам должен его обработать. Для предотвращения подобного поведения используйте разделитель списка аргументов -- . После того как этот разделитель будет прочитан PHP, все последующие аргументы будут переданы в скрипт нетронутыми.

# Эта команда не запустит данный код, но покажет информацию об использовании PHP $ php -r "var_dump($argv);" -h Usage: php [-f] [...] # Эта команда передаст аргумент "-h" в скрипт, предотвратив показ справки PHP $ php -r "var_dump($argv);" -- -h array(2) { => string(1) "-" => string(2) "-h" }

Однако, в Unix-системах есть еще один способ использования PHP для консольных скриптов. Можно написать скрипт, первая строка которого будет начинаться с #!/usr/bin/php (или же другой корректный путь к бинарному файлу PHP CLI). После этой строки можно поместить обычный PHP-код, заключенный в открывающие и закрывающие теги PHP. Как только будут установлены корректные атрибуты запуска на файл (например, chmod +x test ), скрипт может быть запущен как обычный консольный или perl-скрипт:

Пример #1 Запуск PHP-скрипта как консольного

#!/usr/bin/php
var_dump ($argv );
?>

Подразумевая что этот файл называется test и находится в текущей директории, можно сделать следующее:

$ chmod +x test $ ./test -h -- foo array(4) { => string(6) "./test" => string(2) "-h" => string(2) "--" => string(3) "foo" }

Как можно увидеть, в этом случае не нужно заботиться о передаче параметров, которые начинаются с - .

Исполняемый PHP-файл может использоваться для запуска PHP-скриптов независимо от веб-сервера. В случае, работы в Unix-подобной системе, необходимо добавить ко всем скриптам особую строку #! (называемую также "shebang") в начало файла и сделать их исполняемыми, чтобы указать, какая из программ должна обрабатывать эти скрипты. На Windows-платформах можно назначить обработчик php.exe для файлов с расширениями .php либо создать пакетный (.bat) файл для запуска скриптов посредством PHP. Строка, добавляемая в начале скрипта для Unix-систем, не влияет на их работу в ОС Windows, таким образом можно создавать кроссплатформенные скрипты. Ниже приведен простой пример скрипта, выполняемого из командной строки:

Пример #2 Скрипт, предназначенный для запуска из командной строки (script.php)

#!/usr/bin/php

If ($argc != 2 || in_array ($argv [ 1 ], array("--help" , "-help" , "-h" , "-?" ))) {
?>

Это консольный PHP-скрипт, принимающий один аргумент.

Использование:

} else {
echo $argv [ 1 ];
}
?>

Скрипт приведенный выше включается в себя специальную Unix строку, указывающую на его запуск с помощью PHP. Работа ведется с CLI -версией, поэтому не будет выведено ни одного HTTP -заголовка.

Также приведенный пример проверяет количество переданных аргументов. В случае, если их больше или меньше одного, а также в случае, если переданный аргумент был --help , -help , -h или -? , выводится справочное сообщение с использованием $argv , которое содержит имя выполняемого скрипта. В противном случае просто выводится полученный аргумент.

Для запуска приведенного примера в Unix-системе, необходимо сделать его исполняемым и просто выполнить в консоли script.php echothis или script.php -h . В Windows-системе можно создать пакетный файл:

Пример #3 Пакетный файл для запуска PHP-скрипта из командной строки (script.bat)

@echo OFF "C:\php\php.exe" script.php %*

Предполагая, что скрипт называется script.php и полный путь к CLI php.exe совпадает с C:\php\php.exe , приведенный пакетный файл запустит скрипт с переданными параметрами: script.bat echothis либо script.bat -h .

Также можно ознакомиться с расширением Readline , которое можно использовать для усовершенствования консольного PHP-скрипта.

В Windows запуск PHP можно настроить без необходимости указывать C:\php\php.exe и расширение .php . Подробнее эта тема описана в разделе

Сразу оговорюсь, что всё, о чём будет идти речь в этой статье, применимо лишь для Unix-подобных операционных систем, и не будет работать под Windows. Речь идёт именно об альтернативе крону . Несчастным любителям Windows придётся колдовать с "Планировщиком заданий" - Чёрная Магия останется недоступна для них:) Кроме того, потребуется ssh доступ, а в идеале - доступ php скриптов к командной строке.

Что есть программа-демон и как написать демона на PHP

Де́мон (daemon, dæmon, др.-греч. δαίμων божество) - компьютерная программа в системах класса UNIX, запускаемая самой системой и работающая в фоновом режиме без прямого взаимодействия с пользователем. Демоны обычно запускаются во время загрузки системы.

Применимо к PHP, это скрипт, который может работать самостоятельно, без остановок и без участия пользователя. Как получить такой скрипт? На самом деле, очень просто, нужно лишь нарушить одно из первых правил программирования, которому учат в школе, и создать бесконечный цикл:

// Чтобы программа работала постоянно, она просто должна постоянно работать;) while(1) { // Тут будет располагаться код Демона // ... // Время сна Демона между итерациями (зависит от потребностей системы) sleep(1); }

Простой до невозможности код вызывает, всё же, несколько вопросов. Как его запустить? Как отслеживать его выполнение? Как его остановить?

Как запустить php-демона

А как вообще запускают php-скрипты? Если это веб-приложение, то при помощи браузера и веб-сервера. Но этот вариант не подходит, ведь мы имеем дело с бесконечным скриптом, а время выполнения скриптов ограничены директивой max_execution_time в php.ini . Следовательно, бесконечный скрипт необходимо запускать через консоль, ведь тогда максимальное время его выполнения не учитывается . Примерно так выглядит команда запуска демона:

Php -f /path/to/your/daemon.php &

Для ручного запуска её нужно ввести в ssh терминале (putty, WinSCP и т.д.), а для запуска системой при загрузке - в соответствующий файл автозагрузки (положение и название файла зависит от операционной системы). Обратите внимание, что консольный скрипт демона запускается в фоновом режиме , не вовлекая пользователя в ожидание его завершения (ведь скрипт бесконечен). Именно в наличии возможности запустить процесс в фоновом режиме и лежит причина того, что описываемый мной способ не подходит для Windows-серверов. После запуска в консоли должен отобразиться идентификатор процесса нашего демона, так называемый PID.

Отслеживание и остановка демонов

Проверить, запущен ли процесс демона можно просто открыв список процессов в системе:

Ps -aux

Найти демона в списке процессов несложно, как по команде запуска, так и по PID:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND ... root 22193 0.1 0.2 393180 72132 ? S Apr24 5:05 php -f /path/to/your/daemon.php &

Остановить процесс демона можно так же, как и любой другой процесс:

Kill xxxx

В приведённом примере xxxx - это и есть PID, идентификатор процесса.

Стоит отметить, что это не остановка, а именно "убийство" процесса демона. Дело в том, что работа скрипта будет прервана где попало, что не всегда и не всем подходит. По идее, в таком случае демона нужно останавливать где-то между его итерациями и уже не из консоли. К примеру, мы можем создать в базе данных или в каком-то файле на сервере заявку на остановку скрипта, а между итерациями демона проверять, нет ли такой заявки. Если заявка будет обнаружена, остановить цикл оператором break .

Система управления демонами

А что, если требуется создать и отслеживать сразу много демонов? К примеру, в упомянутом выше сервисе CheckTrust обработкой данных и проектов пользователей занимаются > 30 таких скриптов. Создавать и следить за ними из консоли очень неудобно - нужен более дружественный интерфейс.

Круто, да? :) Как раз для создания подобной системы было бы неплохо иметь доступ к командной строке из php. Каждый демон - запись в базе данных, напротив которой можно проставить команду его запуска, а так же PID процесса. Следовательно, появляется возможность запускать, останавливать и отслеживать статус демонов прямо из веб-интерфейса. В итоге сами демоны у меня получились частью консольного приложения, а система управления ими - частью веб-приложения.

Поскольку система, показанная выше, заточена строго под CheckTrust, её код показывать я не буду. Зато скопирую сюда код php класса для управления процессами , который я использовал при её создании:

<?php /* * Process.php * An easy way to keep in track of external processes. * Ever wanted to execute a process in php, but you still wanted to have somewhat controll of the process ? Well.. This is a way of doing it. * @compability: Linux only. (Windows does not work). * @author: Peec */ class Process{ private $pid; private $command; public function __construct($cl=false){ if ($cl != false){ $this->command = $cl; $this->runCom(); } } private function runCom(){ $command = "nohup ".$this->command." > /dev/null 2>&1 & echo $!"; exec($command ,$op); $this->pid = (int)$op; } public function setPid($pid){ $this->pid = $pid; } public function getPid(){ return $this->pid; } public function status(){ $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; else return false; } } ?>

Единственный недостаток этого класса - то, что я уже описывал ваше - он останавливает процессы методом kill, но мне пока что этого достаточно:) А вот и пример его использования:

// Запуск демона и получение PID (предполагается, что pid где-то сохраняется после запуска) $command = ""; $process = new Process($command); $processId = $process->getPid(); // Проверка статуса демона $process = new Process(); $process->setPid($processId); $status = $process->status(); // возвращает true или false // Остановка демона $process = new Process(); $process->setPid($processId); $stopped = $process->stop(); // возвращает true или false

Подводя итог, хочу сказать, что это не единственно возможная и, вполне возможно, не самая оптимальная реализация демонов на php. К примеру, для многопроцессовых демонов существует крутое расширение PHP PCNTL . Кто-то, возможно, даже скажет, что для консольных приложений существуют совсем другие языки программирования. Но, как ни крути, у данной реализации есть неоспоримые преимущества:

  • Она простая , как тапок. Демон - это просто бесконечный цикл, куда уж проще.
  • Она совместима с веб-приложениями - являясь частью веб-сервиса, мои демоны опираются на существующие наработки, используют те же модели данных, классы и методы работы с ними.
  • Она работает! Серьёзно - некоторые демоны у нас запущены уже несколько месяцев и, будучи грамотно написанными, не тупят, не зависают, не поглощают память.

Спасибо за внимание:) Если у кого-нибудь возникнут вопросы или идеи, с удовольствием отвечу на них в комментариях.

PHP является одним из наиболее популярных языков программирования в вебе. Своей популярностью он в первую очередь обязан легкости в изучении и многофункциональности. Но сфера его применения не заканчивается только на создании простых веб-страничек. PHP-скрипты можно запускать из командной строки, что позволяет писать на нем полноценные консольные приложения.

Как запустить php-скрипт из командной строки?

Независимо от используемой операционной системы, для запуска скрипта необходимо набрать в консоли следующую команду:

Php script.php

Ваша ОС может выдать сообщение о том, что команда php ей неизвестна. В таком случае, и если вы уверены, что сам интерпретатор PHP установлен корректно, поможет указание полного пути к интерпретатору во время запуска скрипта.

C:\php\php.exe script.php

Для UNIX-подобных систем:

/usr/bin/php script.php

Обратите внимание, что путь к интерпретатору PHP на вашей системе может быть другим, поэтому это тоже надо учесть. Например, для пользователей популярного пакета WampServer путь может быть таким:

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

Ну и наконец, чтобы не вводить полный путь каждый раз, следует добавить путь к интерпретатору в переменную окружения PATH вашей операционной системы.

Пишем простой скрипт для проверки кода ответа сервера

Для того, чтобы показать особенности работы скрипта из командной строки, напишем простое приложение, которое будет брать текстовый файл со ссылками и проверять код ответа сервера для каждой из этих ссылок. Причем предусмотрим возможность выбора нужного файла в интерактивном режиме, чтобы заодно узнать, как это делается.

Сразу после запуска скрипт выбирает все файлы с расширением *.txt из папки files . Затем выводит данный список пользователю в формате номер => имя и ждет от пользователя ввода номера интересующего его файла.

Получение всех файлов по маске делается просто, для этого воспользуемся стандартной функцией glob , а вот с чтением данных из консоли всё немного интересней. Дело в том, что после запуска скрипта из командной строки в нем открываются три стандартных потока: для вывода (STDOUT), ввода (STDIN) и ошибок (STDERR). Указатели на эти потоки доступны для скрипта в виде одноименных констант и работать с ними можно так же как, например, с обычными файлами. Таким образом, чтобы прочитать данные из консоли достаточно просто прочитать строку из потока ввода: fgets(STDIN) .

$files = glob("files/*.txt"); $files or exit("No files to check.".PHP_EOL); echo "Files in folder: ".count($files).PHP_EOL; foreach ($files as $index => $name) { echo "[{$index}] => {$name}".PHP_EOL; } echo "Choose the file: "; $choice = intval(fgets(STDIN));

После того, как пользователь сделал свой выбор и проверки правильности выбора, мы можем открыть файл для чтения.

Array_key_exists($choice, $files) or exit("Wrong file selected.".PHP_EOL); $file = $files[$choice]; echo "Processing file "{$file}"...".PHP_EOL; $start_time = microtime(true); $code_stats = array(); $f = fopen($file, "r");

С помощью цикла while начинаем перебирать все строки в файле. Строки должны быть корректными url-адресами иначе мы не сможем определить правильный код ответа сервера. Заголовки для каждого адреса получаем с помощью стандартной функции get_headers , а код ответа находится обычно в первой строке заголовка.

While ($url = trim(fgets($f))) { $headers = get_headers($url); if (is_array($headers)) { array_key_exists($headers, $code_stats) or $code_stats[$headers] = 0; $code_stats[$headers]++; echo date("H:i:s")." HTTP code "{$headers}" for url "{$url}"".PHP_EOL; } else { array_key_exists("Unknown", $code_stats) or $code_stats["Unknown"] = 0; $code_stats["Unknown"]++; echo date("H:i:s")." Problem with url "{$url}"".PHP_EOL; } } fclose($f);

В итоге после обработки файла, можно вывести небольшую статистику о том, сколько заняла обработка по времени и какие коды ответа сколько раз встречались.

$elapsed_time = round(microtime(true) - $start_time, 3); echo "File processed in {$elapsed_time}s".PHP_EOL; echo "Code stats are:".PHP_EOL; print_r($code_stats);

Результатом работы такого приложения может быть, например, такой вывод:

$ php check.php Files in folder: 1 => files/db.txt Choose the file: 0 Processing file "files/db.txt"... 18:33:43 HTTP code "HTTP/1.0 200 OK" for url "http://mail.ru/" 18:33:45 HTTP code "HTTP/1.1 301 Moved Permanently" for url "http://yandex.ru/" 18:33:46 HTTP code "HTTP/1.1 302 Moved Temporarily" for url "http://rambler.ru/" 18:33:47 HTTP code "HTTP/1.0 301 Moved Permanently" for url "http://google.ru/" File processed in 5.558s Code stats are: Array ( => 1 => 1 => 1 => 1)

Выводы

Вот и всё, простое и интерактивное консольное приложение на PHP готово. Мне не хотелось писать какую-нибудь совершенно бесполезную программу, поэтому этот скрипт подходит не только для изучения, но и для использования. Например, если сохранить в текстовый файл карту сайта, то скрипт поможет определить возможные ошибки с ссылками, а если его немного доработать, то даже укажет с какими именно:).

Само приложение можно скачать .



Статьи по теме