Запустите php скрипт как процесс демона

На основании ответа @ chris-dolphin, но используя вспомогательную функцию:

// Creates svg element, returned as jQuery object
function $s(elem) {
  return $(document.createElementNS('http://www.w3.org/2000/svg', elem));
}

var $svg = $s("svg");
var $circle = $s("circle").attr({...});
$svg.append($circle);
145
задан Darryl Hein 15 January 2010 в 07:24
поделиться

6 ответов

Вы можете запустить ваш php-скрипт из командной строки (т.е. bash), используя

nohup php myscript.php и

и помещает ваш процесс в фоновое состояние.

Редактирование:
Да, есть некоторые недостатки, но их невозможно контролировать? Это просто неправильно.
Простой процесс убийства остановит его. И это все еще лучшее и простое решение.

161
ответ дан 23 November 2019 в 22:27
поделиться

Если вы можете - возьмите копию расширенного программирования в среде Unix . Вся глава 13 посвящена программированию демона. Примеры находятся в C, но все необходимые вами функции имеют обертки в PHP (в основном PCNTL и POSIX расширений).

В нескольких словах - написание демона (это возможно только на основе OS-os-os - Windows использует Services) Похоже:

  1. Вызов UMASK (0) для предотвращения проблем разрешений Отказ
  2. Вилка () и иметь родительский выход.
  3. Вызов Setsid () .
  4. Обработка сигнала настройки (обычно это игнорируется или используется для сигнализации демона для перезагрузки его конфигурации) и SIGTERM (чтобы сообщить процедуру изящного выхода).
  5. Fork () снова и иметь родительский выход.
  6. Измените текущий рабочий дир с CHDIR () .
  7. FCLOSE () stdin , stdout и STDERR и не пишите им. Способ коррекции - перенаправить их либо / dev / null или файл, но я не мог найти способ сделать это в PHP. Возможно, когда вы запускаете демон перенаправить их с помощью оболочки (вам придется выяснить, как это сделать, я не знаю :).
  8. Сделайте свою работу!

Также, поскольку вы используете PHP, будьте осторожны для циклических ссылок, поскольку сборщик мусора PHP, до PHP 5.3, не имеет способа сбора этих ссылок, и процесс утечки памяти, пока она в конечном итоге не вылетает.

47
ответ дан 23 November 2019 в 22:27
поделиться

ASP.net запускается на сервере - он просто генерирует HTML (& JavaScript), который отправляется клиенту (например, браузеру) и визуализируется там.

Так что вам нужно не asp.net решение, а действительно богатое клиентское решение. Некоторые из ваших вариантов:

  • Javascript
  • Flash
  • Silverlight
  • Java-апплет

Я подозреваю, что Javascript или Silverlight будут представлять для вас наибольший интерес. Возможно, вы хотите провести небольшое расследование и вернуться с обновленным вопросом.

UPDATE Re: Bob's Comment:

Быстрый google обнаружил это, что кажется довольно классным:

Облегченные визуальные тезаурасы

-121--4244800-

У меня была такая проблема, используя wget это было быстро (макс. 1 секунда), использование ЗАВИТОК заняло около 5 секунд, чтобы получить страницу, когда tcpdump-ing я обнаружил, что ЗАВИТОК пытается выполнить обратный поиск DNS, и если сервер не имеет зарегистрированного DNS-сервера revers, это замедлит работу, Я настроил обратный DNS на своем локальном DNS сервере, так что каждый запрос на этот сайт с использованием ЗАВИТОК теперь идет очень быстро. Я не нашел способ отключить DNS-поиск Revers из параметров настройки cURL.

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

-121--3357877-

Кевин ван Зонневелд написал очень хорошую подробную статью об этом , в своем примере он использует System _ Daemon ГРУШ пакета (последняя дата релиза на 2009-09-02).

10
ответ дан 23 November 2019 в 22:27
поделиться

Есть не один способ решить эту проблему.

Я не знаю подробностей, но, возможно, есть и другой способ запустить PHP-процесс. Например, если вам нужен код для запуска на основе событий в базе данных SQL, вы можете настроить триггер для выполнения вашего скрипта. Это действительно легко сделать в PostgreSQL: http://www.postgresql.org/docs/current/static/external-pl.html .

Честно говоря, я думаю, что лучшим вариантом будет создание процесса Damon с помощью nohup. nohup позволяет команде продолжать выполнение даже после того, как пользователь выйдет из системы:

nohup php myscript.php &

Однако, существует очень серьезная проблема. Как вы сказали, менеджер памяти PHP - это полный мусор, он был построен с предположением, что скрипт выполняется всего несколько секунд, а затем существует. Ваш PHP скрипт начнет использовать GIGABYTES памяти всего через несколько дней. Вы ДОЛЖНЫ ВСЕГДА создать cron скрипт, который будет выполняться каждые 12 или, может быть, 24 часа, который убьет и перезапустит ваш php скрипт следующим образом:

killall -3 php
nohup php myscript.php &

Но что, если скрипт был в середине задания? Ну, kill -3 - это прерывание, это то же самое, что делать ctrl+c на CLI. Ваш php скрипт может перехватить это прерывание и изящно завершить работу, используя библиотеку PHP pcntl: http://php.oregonstate.edu/manual/en/function.pcntl-signal.php

Вот пример:

function clean_up() {
  GLOBAL $lock;
  mysql_close();
  fclose($lock)
  exit();
}
pcntl_signal(SIGINT, 'clean_up');

Идея $lock заключается в том, что PHP-скрипт может открыть файл с помощью fopen("file", "w");. Только один процесс может иметь блокировку записи в файл, поэтому, используя ее, вы можете быть уверены, что запущена только одна копия вашего PHP-скрипта.

Удачи!

11
ответ дан 23 November 2019 в 22:27
поделиться

Вы можете

  1. использовать NOHUP Как предложил Хенрик.
  2. Используйте экран и запустите программу PHP в качестве регулярного процесса внутри этого. Это дает вам больше контроля, чем использование NOHUP .
  3. Используйте такой демомозон, как http://supervisord.org/ (он написан в Python, но может демонстрировать любую программу командной строки и дать вам удаленный элемент управления для управления его).
  4. Напишите свою собственную обертку, как Эмиль предложил, но это излишне

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

14
ответ дан 23 November 2019 в 22:27
поделиться
-

Я запускаю большое количество демонов PHP.

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

Мы используем Daemontools для этого. Это умный, чистый и надежный. На самом деле мы используем его для запуска всех наших демонов.

Вы можете проверить это в http://cr.yp.to/daemontools.html .

Редактировать: быстрый список функций.

  • автоматически запускает демон при перезагрузке
  • Автоматический перезапуск DAMEON ON OFFICAL
  • Регистрация обрабатывается для вас, включая интерфейс управления Rollover и Creuning
  • : «SVC» и «SVSTAT»
  • Unix Bishing (не А плюс для всех возможно)
24
ответ дан 23 November 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: