Использование PHP из Командной Строки. Интерактивное консольное приложение на PHP

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

Как делают практически все новички:

  1. Создают PHP-файл (иногда HTML-файл , но это самые новички).
  2. Записывают туда PHP-код .
  3. И двойным кликом пытаются открыть его в браузере.

Результат, браузер код открывает, но исполнять его не торопится. А просто выводит какие-то куски кода обычным текстом, либо вообще ничего не выводит.

Ошибка данного подхода состоит в том, что ученик не понимает, что PHP - это серверный язык , а не клиентский. Это HTML или JavaScript клиентские языки, они, конечно, обрабатываются браузером. Но для PHP нужен интерпритатор . И вот данный интерпритатор запускается сервером.

Вывод: запускать PHP-код надо через сервер . Если у Вас Denwer , значит, через него.

Теперь, как запускать PHP-код через Denwer . Большинство новичков вновь делают ошибку. Они вроде бы всё делают правильно, создают нужные папки, перезапускают Denwer и вроде бы, осталось только правильно вызвать файл. Но тут снова ошибка: они вновь открывают файл просто в браузере (либо перетаскиванием файла в браузер, либо двойным кликом). Это легко можно заметить по адресу в адресной строке. Там будет что-то наподобие: file:///Z:\home\mysite.local\www\script.php .

А правильно запускать надо, вводя адрес виртуального хоста . То есть прямо в адресной строке браузера вводите: http://mysite.local/script.php - всё, теперь скрипт запустится и выведет свой результат.

Надеюсь, данная статья поможет многим новичкам, только начинающим изучать 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-подобной системе, вам необходимо добавить ко всем скриптам специальную первую строку и сделать их исполняемыми, чтобы указать, какая из программ должна обрабатывать эти скрипты. На 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 ];
}
?>

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

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

Если вы хотите выполнить приведенный пример в 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-скрипта.

В 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 . Подробнее эта тема описана в разделе

В этой статье приводится пошаговое руководство по установке PHP для совместной работы с HTTP-сервером Apache на Windows . Эта процедура была протестирована как на Windows XP и Vista . Предполагается, что вы уже завершили установку Apache .

Этапы настройки PHP 5

1. Загрузите PHP 5

Прежде чем приступать к работе, скачайте копию PHP 5 со страницы загрузки . Загрузите защищенный пакет VC6 из раздела «Windows Binaries » — то есть не скачивайте установщик. Например, выберите пакет с пометкой «PHP 5.2.5 zip package », если на данный момент текущая версия — 5.2.5 .

Примечание : обратите внимание, что я не тестировал описанную ниже процедуру с версиями PHP 5.3 , только с 5.2.5 , которая была последней версией на момент написания статьи. Теоретически, те же действия должны выполняться и для установки PHP 7 .

2. Установите PHP 5

Создайте на жестком диске папку для PHP . Я предлагаю c:php , хотя вы можете использовать другое название и расположение папки. Лично я предпочитаю не использовать имена с пробелами.

Извлеките все файлы из загруженного архива в эту папку. Для этого просто дважды кликните по zip-файлу . А затем перетащите все файлы в папку c:php .

3. Тем, кто обновляет пакет: Удалите старый файл PHP.INI из каталога Windows

Если вы переходите на PHP 5 с более старой версии, перейдите в каталог Windows , (обычно это c:windows ), и удалите все файлы php.ini , которые вы ранее там размещали.

4. Настройка PHP

Перейдите в папку c:php и создайте копию файла php.ini-recommended . Назовите новый файл php.ini . Теперь у вас должен быть файл c:phpphp.in с содержимым, идентичным файлу c:phpphp.ini-recommended .

Примечание . Если вы используете Apache 1 нужно либо перенести файл php.ini в каталог Windows (c:windows ), либо настроить переменную среды PATH , чтобы включить в нее c:php . Если вы не знаете, как это сделать, просто переместите файл php.ini в папку c:windows . Не нужно этого делать, если используете Apache 2 , так как позже мы укажем в файле конфигурации Apache 2 директиву с расположением файла php.ini .

Для установки PHP на Windows 7 c помощью текстового редактора (например, такого как «Блокнот», который можно найти в разделе «Служебные» меню «Пуск» )? откройте файл php.ini . Возможно, придется внести следующие изменения в файл:

а) Включение коротких открывающих тегов

Найдите следующую строку:

short_open_tag = Off

Если для short_open_tag задано значение off , теги типа «

Поскольку многие сторонние PHP-скрипты используют формат «

short_open_tag = On

b) Волшебные кавычки

При установке Apache PHP по умолчанию входящие данные автоматически не экранируются с помощью слэша. Если вы хотите, чтобы входные данные имели префикс обратной косой черты («»), например, чтобы воспроизводить настройки хостинга, найдите следующую строку:

magic_quotes_gpc = Off

и замените ее на:

magic_quotes_gpc = On

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

c) Использование глобальных переменных

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

Если вы используете такие скрипты, нужно найти следующую строку:

register_globals = Off

и изменить ее на:

register_globals = On

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

d) Отображение ошибок

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

Чтобы PHP отображал сообщения об ошибках прямо в окне браузера, найдите следующую строку:

display_errors = Off

и измените ее на:

display_errors = On

Для этого параметра на работающем сайте всегда должно быть установлено значение Off .

e) Путь сессии

Если скрипт использует сессии, найдите следующую строку:

;session.save_path = "/tmp"

session.save_path задает папку, в которой PHP сохраняет файлы сессии. Поскольку папка /tmp в Windows не существует, то нужно установить другую папку. Один из способов — создать папку с именем c:tmp (как ранее мы создали c:php ) и указать для этого параметра данную папку. Если сделаете это, измените данную строку следующим образом:

session.save_path = "c:tmp"

Обратите внимание, что в дополнение к изменению пути я также удалил из строки префикс точки с запятой («;») .

Также можно использовать текущую папку TEMP на своем компьютере. Или создайте папку tmp в каталоге PHP , например c:phptmp и соответствующим образом настройте файл конфигурации. Возможных вариантов может быть много. Если вы не можете решить, какой из них выбрать, просто создайте c:php и сделайте, как я сказал выше.

f) Сервер SMTP

При установке PHP 5 5 если скрипт использует функцию mail() , и нужно, чтобы функция успешно отправляла почту на локальном компьютере, найдите следующий раздел:

; For Win32 only. SMTP = localhost smtp_port = 25 ; For Win32 only. ;sendmail_from = [email protected]

Измените его, указав адрес вашего SMTP-сервера и учетную запись электронной почты. Например, если ваш SMTP-сервер mail.example.com , а адрес электронной почты [email protected] , измените код так:

SMTP = mail.example.com smtp_port = 25 sendmail_from = [email protected]

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

Как настроить Apache для PHP 5

Существует два способа установки Apache PHP . Первый: настроить его на загрузку PHP-интерпретатора в качестве модуля Apache . Второй: настроить его для запуска интерпретатора как бинарного CGI . Нужно применять только один из них. Выберите метод модуля, если на хостинге PHP также установлен, как модуль Apache , или используйте метод CGI , если он реализован на хостинге.

a) Запуск PHP 5 в качестве модуля Apache

Чтобы настроить Apache для загрузки PHP в качестве модуля для анализа PHP-скриптов , используйте текстовый редактор ASCII , чтобы открыть файл конфигурации Apache , httpd.conf .

Если вы используете Apache 1.x , файл находится в папке c:Program FilesApache GroupApacheconf . Пользователи Apache 2.0.x могут найти его в папке C:Program FilesApache GroupApache2conf , а пользователи Apache 2.2.x — в папке C:Program FilesApache Software FoundationApache2.2conf . Как правило, он находится в папке conf каталога, где установлен Apache .

Найдите раздел файла с операторами LoadModule . Объявления, перед которыми стоит символ хэша «#» , считаются закомментированными.

Если используете Apache 1.x , добавьте следующую строку после всех операторов LoadModule :

LoadModule php5_module "c:/php/php5apache.dll"

Если вы используете Apache 2.0.x , добавьте следующую строку после всех операторов LoadModule :

LoadModule php5_module "c:/php/php5apache2.dll"

Если вы используете Apache 2.2.x , добавьте следующую строку:

LoadModule php5_module "c:/php/php5apache2_2.dll"

Обратите внимание, что в этом примере установки PHP используется символ прямой косой черты («/» ) вместо традиционной обратной косой черты Windows («») . Это не опечатка.

Если вы используете Apache 1.x , найдите серию операторов «AddModule » и добавьте после всех строк следующую.

AddModule mod_php5.c

Затем найдите в файле блок AddType и добавьте приведенную ниже строку после последнего оператора AddType . Это нужно сделать независимо от того, какую версию Apache вы используете. Для Apache 2.2.x нужно найти строки AddType в разделе . Добавьте строку непосредственно перед закрытием для этого раздела.

Если необходима поддержка других типов файлов, например «.phtml », добавьте их в список, например, так:

Тем, кто использует одну из версий Apache 2 , нужно указать местоположение ini-файла PHP . Добавьте следующую строку в конец httpd.conf .

PHPIniDir "c:/php"

Если вы использовали другой каталог, нужно будет изменить c:/php на правильный путь. Не забудьте применить косую черту («/» ).

Если используете Apache 1 , вы уже разместили файл php.ini в папке Windows или где-нибудь в PATH . Поэтому PHP должен будет найти его самостоятельно.

Запуск PHP 5 в качестве бинарного файла CGI

Если вы настроили для PHP 5 загрузку в качестве модуля Apache , можете пропустить данный раздел. Он предназначен для тех, кто хочет настроить для PHP запуск в качестве бинарного CGI .

Процедура для этого при установке PHP 7 одинаковая как для Apache 1.x , так и для всех версий серии 2.x .

Найдите часть конфигурационного файла Apache , в которой находится раздел ScriptAlias . Добавьте приведенную ниже строку сразу после строки ScriptAlias для «cgi-bin ». Если используете Apache 2.2.x , убедитесь, что строка расположена до закрытия для раздела .

Обратите внимание : если вы установили PHP в другом месте, например c:Program Filesphp , нужно указать соответствующий путь вместо c:/php/ (например, c:Program Filesphp) . Не забудьте, что здесь мы используем простую косую черту («/» ) вместо обратной косой черты Windows («» ).

ScriptAlias /php/ "c:/php/"

Apache нужно настроить MIME тип PHP . Найдите блок комментариев AddType , поясняющий его использование, и добавьте следующую строку ниже него. Для Apache 2.2.x найдите строки AddType в разделе . Добавьте приведенную ниже строку непосредственно перед закрытием для этого раздела.

AddType application/x-httpd-php .php

Как и в случае установки PHP в качестве модуля Apache , можно добавить любые расширения, чтобы Apache распознавал их как скрипты PHP , например:

AddType application/x-httpd-php .phtml

Затем вам нужно указать серверу выполнять исполняемый файл PHP каждый раз, когда он встречает скрипт PHP . Добавьте в файл следующий код, например, после блока комментариев, поясняющих «Action «.

Если вы используете Apache 2.2.x , то добавьте код сразу после инструкции AddType , описанной выше; в Apache 2.2.x нет блока комментариев «Action «.

Action application/x-httpd-php "/php/php-cgi.exe"

Примечание : часть «/php/» будет распознана как ScriptAlias , своего рода макрос, который будет расширен Apache до «c:/php/» (или «c:/Program Files/php/» , если вы установили PHP там ). Другими словами, не помещайте в эту директиву путь «c:/php/php.exe» или «c:/Program Files/php/php.exe» , а используйте «/php/php-cgi.exe» .

Если используете Apache 2.2.x , найдите следующий раздел в файле httpd.conf :

Добавьте приведенные ниже строки сразу после раздела, который только что нашли.

AllowOverride None Options None Order allow,deny Allow from all

c) Настройка индексной страницы по умолчанию

Этот раздел относится к варианту установки PHP на Windows в качестве модуля Apache , так и двоичного CGI .

Если вы создаете файл index.php и хотите, чтобы Apache загружал его как главную страницу сайта, придется добавить еще одну строку в файл httpd.conf . Найдите строку, которая начинается с «DirectoryIndex », и добавьте «index.php » в список файлов. Например, если у вас был такой код:

DirectoryIndex index.html

измените его на:

DirectoryIndex index.php index.html

При следующем входе на веб-сервер через имя каталога, например «localhost » или «localhost/directory/ », Apache отправит все скрипты из index.php или содержимое файла index.html , если index.php недоступен.

Перезапустите веб-сервер Apache

Перезагрузите сервер Apache . Это необходимо, чтобы Apache считал новые директивы конфигурации PHP , которые вы поместили в файл httpd.conf . Сервер Apache 2.2 можно перезапустить, дважды кликнув по иконке Apache Service Monitor в панели задач и нажав в появившемся окне кнопку «Перезапустить ».

Тестирование установки PHP

После установки PHP 5 5 или другой версии языка создайте php-файл со следующей строкой:

Сохраните в каталог Apache htdocs файл с именем test.php . Если используете «Блокнот », не забудьте сохранить имя «test.php » с кавычками. Иначе программа самостоятельно добавит расширение .txt .

Откройте данный файл в браузере, введя в адресную строку «localhost / test.php » (без кавычек ). Не открывайте файл напрямую через проводник — вы увидите только код, введенный ранее. Вам нужно использовать указанный выше URL-адрес , чтобы браузер попытался получить доступ к веб-серверу Apache , который запускает PHP для интерпретации скрипта.

Если все пройдет успешно, вы увидите страницу с информацией о настройке PHP . Поздравляю — вы успешно установили PHP и настроили Apache для работы с ним. Вы можете загрузить этот же файл test.php на свой хостинг и запустить его там, чтобы узнать, как хостинг настроил PHP у себя, и попытаться воспроизвести эти настройки на своей машине.

Если это не сработает, проверьте, не выдает ли установка PHP или установка Apache ошибок. Для этого откройте окно командной строки и запустите php-cgi.exe для файла test.php , например, c:phpphp-cgi test.php .

Если вы вызвали PHP из командной строки и увидели большой HTML-файл со всей информацией о конфигурации PHP , значит, PHP настроен правильно. Вероятно, проблема связана с конфигурацией Apache . Убедитесь, что вы перезапустили Apache после внесения изменений в конфигурацию и что вы правильно настроили веб-сервер.

Сразу оговорюсь, что всё, о чём будет идти речь в этой статье, применимо лишь для 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 . Кто-то, возможно, даже скажет, что для консольных приложений существуют совсем другие языки программирования. Но, как ни крути, у данной реализации есть неоспоримые преимущества:

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

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



gastroguru © 2017