Как сделать php скрипт как службу и обращаться к нему?
Скажите как php скрипт запустить как службу. А потом обратится к ней и передать параметры. Скрипт демон обработает их и выдаст результат.
например в консоли
и выводит результат.
скрипт есть. все работает. задача сделать ето как службу или демон. не знаю как правильно это называется
lutskboy
14.09.23 18:44:05 MSK
- Ответить на это сообщение
- Ссылка
пых — обычный язык. выучи его и напиши демона.
Anoxemian ★★★★★
( 14.09.23 18:57:46 MSK )
- Ответить на это сообщение
- Ссылка
вся магия у сервиса Type=forking
monkdt
( 14.09.23 19:02:21 MSK )
- Ответить на это сообщение
- Ссылка

google «линукс как запустить скрипт на php как демона» (41000 результатов) или «как написать демона на php» (196000 результатов).
Irma ★
( 14.09.23 19:11:47 MSK )
- Ответить на это сообщение
- Показать ответ
- Ссылка
Ответ на: комментарий от Irma 14.09.23 19:11:47 MSK
написать это одно. примеры есть. как передать ему свои параметры?
lutskboy
( 14.09.23 19:37:14 MSK ) автор топика
- Ответить на это сообщение
- Показать ответ
- Ссылка
Ответ на: комментарий от lutskboy 14.09.23 19:37:14 MSK

Для этого надо придумать и написать к демону API, который дергать внешними утилитами.
Anoxemian ★★★★★
( 14.09.23 20:44:35 MSK )
- Ответить на это сообщение
- Показать ответ
- Ссылка

А тебе для чего? Если в учебных целях, то https://www.php.net/manual/en/features.commandline.webserver.php Если для продакшена, то сделай обычное rest api на nginx + php-fpm и обращайся к нему консольным http клиентом типа httpie, curl или чем хочешь
cobold ★★★★★
( 14.09.23 21:02:50 MSK )
- Ответить на это сообщение
- Ссылка
Ответ на: комментарий от Anoxemian 14.09.23 20:44:35 MSK

Нейронки пускай пишут.
Irma ★
( 14.09.23 21:13:46 MSK )
- Ответить на это сообщение
- Ссылка
протестить с nginx и упаковать их совместно в докер..иначе никак
MKuznetsov ★★★★★
( 14.09.23 22:21:00 MSK )
- Ответить на это сообщение
- Показать ответ
- Ссылка

А зачем тебе это как «демон» если это у тебя обычный скрипт которому похоже не нужно быть запущенным на постоянку. Используй как обычный бинарник, добавь в $PATH путь до него и будешь запускать где хочешь.
Noob_Linux ★★★★
( 15.09.23 09:10:23 MSK )
- Ответить на это сообщение
- Ссылка
Ответ на: комментарий от MKuznetsov 14.09.23 22:21:00 MSK

Вооо, молодцы, притащили нжынкс, докер еще в довесок, потом еще и кубернетис понадобится! А просто
php /path/to/script.php
ggrn ★★★★★
( 15.09.23 10:43:22 MSK )
- Ответить на это сообщение
- Показать ответы
- Ссылка

если клиент http, то есть встроенный в php веб сервер
cylon17
( 15.09.23 10:52:52 MSK )
- Ответить на это сообщение
- Ссылка
Ответ на: комментарий от ggrn 15.09.23 10:43:22 MSK

Вооо, молодцы, притащили нжынкс, докер еще в довесок, потом еще и кубернетис понадобится!
мне кажется, он прикалывается (..иначе никак)
pihter ★★★★★
( 15.09.23 10:54:04 MSK )
- Ответить на это сообщение
- Ссылка
Ответ на: комментарий от ggrn 15.09.23 10:43:22 MSK

ну и как это демонизировать
flant ★★★
( 15.09.23 10:58:57 MSK )
- Ответить на это сообщение
- Показать ответ
- Ссылка

Скрипт демон обработает их и выдаст результат.
Куда выдаст-то? В логи что ли надо?
задача сделать ето как службу или демон. не знаю как правильно это называется
Надо узнать. Или хотя бы объяснить, что именно хочется. Потому что пока нифига не понятно (остальным тоже, судя по ответам).
Может тебе cron нужен, и скрипт запускать каждые несколько минут, с выводом результата в файл?
Скрипт же завершается и выводит результат, что тут вообще демонизировать и зачем?
CrX ★★
( 15.09.23 11:01:07 MSK )
- Ответить на это сообщение
- Ссылка
Ответ на: комментарий от flant 15.09.23 10:58:57 MSK

или не – скрином!
у вас что, детства не было? )
pihter ★★★★★
( 15.09.23 11:16:28 MSK )
- Ответить на это сообщение
- Ссылка

например трясёшь — он звон издаёт
колокольчик есть. все работает. задача сделать ето как будильник или метроном. не знаю как правильно это называется
CrX ★★
( 15.09.23 11:24:00 MSK )
- Ответить на это сообщение
- Ссылка
в скрипте делаешь вечный цикл, и в нем засыпаешь на 1 сек. внедряешь в скрипт обработчик сигналов от ОС и вешаешь обработчик на SIGHUP. в директории со скриптом (не обязательно) создаешь файл command в него втыкаешь строку «getcountry 23.34.56.17». в обработчике SIGHUP считываешь содержимое файла command парсишь/сравниваешь и далее делаешь что хочешь. затем удаляешь файл. захотел дать команду — пишешь в файл команду, посылаешь php демону SIGHUP
Vlad-76 ★★★★
( 15.09.23 13:25:47 MSK )
- Ответить на это сообщение
- Ссылка
подключаешь библиотеку socket или как для php она называется. и делаешь из php скрипта tcp server. Дальше рассказывать?
Vlad-76 ★★★★
( 15.09.23 13:28:08 MSK )
- Ответить на это сообщение
- Ссылка
подключаешь к php либу, которая умеет создавать unix socket
помниться была книжка по UNIX IPC (inter proccess communication)
могу еще способ подкинуть пишешь скрипт в котором читаешь STDIN. и делаешь из него по типу telnet server. telnet server под линукс на самом деле не умеет слушать TCP сокет, он работает совместно с inetd приблудой (/etc/inetd.conf). Вам остается в вечном цикле скрипта читать STDIN (обрабатывать ввод команд) и обрабатывать их. Подключаться к скрипту telnet ом. вывод скрипта в STDOUT
Vlad-76 ★★★★
( 15.09.23 13:38:36 MSK )
Последнее исправление: Vlad-76 15.09.23 13:39:10 MSK (всего исправлений: 2)
- Ответить на это сообщение
- Ссылка
Ответ на: комментарий от ggrn 15.09.23 10:43:22 MSK
нельзя конечно-же. Будет отстой немодный. Даже в inetd прямо никак, только через systemd
Что там, кубернетис ? вот дело говоришь..
MKuznetsov ★★★★★
( 15.09.23 19:28:16 MSK )
- Ответить на это сообщение
- Ссылка
Судя по постановке задачи, тебе не нужен никакой демон и служба. Тебе нужно написать на PHP (пусть так) консольное приложение, где ты будешь разбирать опции командной строки. Вот тут про это читай.
Дальше в шебанг прописываешь путь к интерпретатору PHP и делаешь файл исполняемым (chmod +x).
Wizard_ ★★★★★
( 18.09.23 12:37:15 MSK )
- Ответить на это сообщение
- Ссылка
Форум русскоязычного сообщества Ubuntu
Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!
- Форум русскоязычного сообщества Ubuntu »
- Ubuntu Russian LoCo »
- Разработка (Модератор: Azure) »
- Запуск PHP скрипта в фоне после запуска системы
Страницы: [1] Вниз
Автор Тема: Запуск PHP скрипта в фоне после запуска системы (Прочитано 4851 раз)
0 Пользователей и 2 Гостей просматривают эту тему.
Страницы: [1] Вверх
- Форум русскоязычного сообщества Ubuntu »
- Ubuntu Russian LoCo »
- Разработка (Модератор: Azure) »
- Запуск PHP скрипта в фоне после запуска системы
Страница сгенерирована за 0.03 секунд. Запросов: 25.
- Сайт
- Об Ubuntu
- Скачать Ubuntu
- Семейство Ubuntu
- Новости
- Форум
- Помощь
- Правила
- Документация
- Пользовательская документация
- Официальная документация
- Семейство Ubuntu
- Материалы для загрузки
- Совместимость с оборудованием
- RSS лента
- Сообщество
- Наши проекты
- Местные сообщества
- Перевод Ubuntu
- Тестирование
- RSS лента
© 2012 Ubuntu-ru — Русскоязычное сообщество Ubuntu Linux.
© 2012 Canonical Ltd. Ubuntu и Canonical являются зарегистрированными торговыми знаками Canonical Ltd.
Как запустить скрипт php с get параметрами?
Есть страница, которая очень долго формируется. Ее адрес содержит get параметры. Цель запустить скрипт с обходом ограничения времени выполнения.
через команду php index.php?param=value не работает, т.к. как только после .php появляется знак ? вываливается ошибка.
Через wget site.ru/index.php?param=value отрубается по таймайту.
Как-то можно запустить или только вариант уходить на vps?
- Вопрос задан более трёх лет назад
- 1224 просмотра
Комментировать
Решения вопроса 1
Евгений @eugeneledenev Автор вопроса
Вроде нашел решение. Можно создать скрипт в котором «вручную» задаю get параметры и включаю в него мой основной скрипт.
В командной строке будет:
php -r ‘$_GET[«param_name»]=»param_value»; include «index.php»;’
Программирование в PHP для командной строки
Ubuntu предоставляет в комплекте с пакетом apache2 утилиты для включения\выключения виртуальных хостов и модулей. Однако, создание конфигов для виртуальных хостов отнимают дополнительное время. Поэтому, мне захотелось исправить этот недостаток. Можно было, конечно, сделать автоматические поддомены для апача, но я решил написать скрипт, который создает файлы конфигурации виртуальных хостов для апача, а так же, при необходимости, добавляет имя хоста в файл /etc/hosts. Я не очень хорошо пишу скрипты в bash’e, поэтому решил использовать PHP для моей довольно простой задачи, который я, к тому же, знаю довольно неплохо.
Итак, в этой статье мы сделаем сразу две полезных вещи: ознакомимся с операциями ввода\вывода командной строки в PHP и напишем скрипт, который совсем немного упростит нам жизнь.
Проверка прав доступа
Наверное, ни для кого не секрет, что достаточно просто в первой строке PHP скрипта написать
#!/usr/bin/env php
и такой скрипт можно будет выполнить как обычную программу в Linux.
Прежде всего, нам нужно проверить, есть ли у нас право на запись в ту самую папку, которая содержит в себе конфиги виртуальных хостов, а обычно для этого нужны root права. Проверить это довольно просто:
- $virtual_hosts_dir = «/etc/apache2/sites-available/» ;
- if ( ! is_dir ( $virtual_hosts_dir ) || ! is_writable ( $virtual_hosts_dir ) )
- echo «You must run this script as root! \n » ;
- exit ;
- >
Получение информации из параметров
Далее, нам необходимо узнать у пользователя некоторую информацию, которая нам нужна для создания конфига. Кроме последовательного ввода из консоли, можно передать эту информацию в качестве параметров, которые мы передаем при вызове скрипта. В PHP есть глобальные переменные $argc и $argv. Первая содержит количество входящих параметров, а вторая — массив со входящими параметрами. По-умолчанию входящий параметр всего один — полный путь к вызываемому скрипту. Таким образом, обработка входящих переменных сводится просто к обработке массива:
- if ( $argc > 1 )
- for ( $i = 1 ; $i < $argc ; $i ++ )
- $option = explode ( » #339933″>, $argv [ $i ] ) ;
- switch ( $option [ 0 ] )
- case «-h» :
- case «—add-to-hosts» :
- $add_to_hosts = true ;
- break ;
- case «-n» :
- case «—no-add-to-hosts» :
- $add_to_hosts = false ;
- break ;
- case «-a» :
- case «—server-alias» :
- if ( isset ( $option [ 1 ] ) )
- $server_alias = $option [ 1 ] ;
- >
- else
- echo «Wrong option: < $argv [ $i ]>\n » ;
- >
- break ;
- case «-d» :
- case «—document-root» :
- if ( isset ( $option [ 1 ] ) )
- if ( $option [ 1 ] == «default» )
- $document_root = $default_doc_root
- >
- else if ( is_dir ( dirname ( $option [ 1 ] ) ) )
- $document_root = $option [ 1 ] ;
- >
- >
- else
- echo «Wrong option: < $argv [ $i ]>\n » ;
- >
- break ;
- default :
- if ( substr ( $argv [ $i ] , 1 , 1 ) == ‘-‘ )
- echo «Unknown option: < $argv [ $i ]>\n » ;
- >
- break ;
- >
- >
- >
Потоки ввода\вывода
Но не всегда ведь удобно вбивать кучу параметров в консоль. Поэтому теперь мы просим пользователя ввести с клавиатуры то, что нам до сих пор неизвестно. Для этого нам понадобятся потоки ввода\вывода, а в данном случае только ввода. В PHP для работы с потоками ввода\вывода используются константы STDIN, STDOUT, STDERR. По сути, эти потоки ничем не отличаются от файловых потоков и работать с ними так же просто. Например, строка:
просто считает строку из консоли и запишет её в переменную $line. В данном случае, мы не открывали и не закрывали поток, т.к. PHP делает это автоматически. Но, мы можем открыть поток вручную и держать его открытым столько, сколько нам нужно. Это будет работать быстрее, если Вам нужно считать\записать более одной строки:
- $stdin = fopen ( «php://stdin» , «r» ) ;
- $line1 = gets ( $stdin ) ;
- $line2 = gets ( $stdin ) ;
- fclose ( $stdin ) ;
В данном случае мы сначала открываем поток, считываем из него две строки и закрываем его.
С записью аналогично, хотя я предпочитаю для вывода на экран просто использовать echo.
Продолжаем писать наш скрипт. Пока у нас нет хоть какой-то строки в качестве имени хоста, продолжаем просить пользователя, чтобы он что-то ввел:
- while ( ! $server_alias )
- echo «Enter your hostname: » ;
- $server_alias = trim ( fgets ( STDIN ) ) ;
- >
Теперь, спросим у пользователя, нужно ли добавлять информацию о этом хосте в /etc/hosts, но спрашиваем только в том случае, если эта информация не была передана в качестве параметра. Так как скрипт я писал себе для повседневной работы, то никаких реальных сайтов у меня не будет и чаще всего нужно будет добавлять хост в /etc/hosts, поэтому если мы ничего не вводим, а просто нажимаем Enter то это принимается как согласие:
- if ( $add_to_hosts === null )
- echo «Add $server_alias to your /etc/hosts ? (Y/N) [Y]: » ;
- $line = trim ( fgets ( STDIN ) ) ;
- if ( $line == ‘n’ || $line == ‘N’ )
- $add_to_hosts = false ;
- >
- else
- $add_to_hosts = true ;
- >
- >
То же самое и с корневой директорией сайта:
- if ( ! $document_root )
- $default_doc_root = $default_doc_root . ‘/’ . $server_alias ;
- echo «Enter your document root [ $default_doc_root ]: » ;
- $line = trim ( fgets ( STDIN ) ) ;
- if ( $line && is_dir ( dirname ( $line ) ) )
- $document_root = $line ;
- >
- else
- $document_root = $default_doc_root ;
- >
- >
Генерация конфиг-файла
На этом этапе весь сбор информации закончен и у нас есть все, что нужно, для того, чтобы создать конфиг. Надо убедится, что корневая директория сайта существует, а если её нет — создадим её:
- if ( ! is_dir ( $document_root ) )
- mkdir ( $document_root ) ;
- >
Мы спрашивали у пользователя по поводу добавления хоста в /etc/hosts. Сделаем это, если он согласился:
- if ( $add_to_hosts )
- $hosts = file_get_contents ( «/etc/hosts» ) ;
- $hosts .= «127.0.0.1 \t $server_alias \n » ;
- file_put_contents ( «/etc/hosts» , $hosts ) ;
- >
Собственно так выглядит шаблон нашего конфига:
- $host_template =
- ServerAdmin i@bogus.in
- ServerAlias $server_alias
- DocumentRoot $document_root
- Options Indexes FollowSymLinks MultiViews
- AllowOverride All
- Order allow,deny
- allow from all
- ErrorLog \$/$server_alias-error.log;
- LogLevel warn
- CustomLog \$/$server_alias-access.log combined
- HOST ;
Ну и теперь просто запишем конфиг в файл и напомним пользователю о том, что конфиг теперь нужно еще и активировать с помощью a2ensite:
- file_put_contents ( «/etc/apache2/sites-available/ $server_alias » , $host_template ) ;
- echo «Apache config for this hostname created successfully! Don’t forget to run a2ensite $server_alias \n » ;
Скрипт написан. Нужно сохранить его в файл и не забыть установить флаг +x, чтобы его можно было запускать как программу:
chmod +x a2addsite
Использование
Теперь скрипт можно использовать. Можно как вводить всю информацию в консоли:
% sudo ./a2addsite
Add test.local to your /etc/hosts? (Y/N) [Y]:
Enter your document root [/home/www/test.local]:
Apache config for this hostname created successfully! Don’t forget to run a2ensite test.local
так передавать всю или часть информации скрипту в качестве параметров при вызове:
% sudo ./a2addsite —server-alias=test2.local —add-to-hosts —document-root=default
Apache config for this hostname created successfully! Don’t forget to run a2ensite test2.local
Выводы
PHP можно использовать не только для разработки сайтов, но и для решения мелких локальных задач на компьютере. Скрипт я писал под себя и, наверняка, кто-то из Вас переделает его под свои нужды.
Исходный код скрипта
Литература
Больше информации о потоках ввода вывода, а также о остальных особенностях работы с консолью в PHP можно получить на официальном сайте PHP (англ.):
Command line usage
PHP input/output
