免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2057 | 回复: 2
打印 上一主题 下一主题

[转载 守护进程]新软件试用*用php作windows下的守护进程* [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-30 10:48 |只看该作者 |倒序浏览
php精灵1.0 测试版
[6-dec-2005]php精灵1.0测试版发布。

一些技术如下:

让php脱离apache成为windows守护进程的工具。
可以开机自动运行的php程序。
可以在对话框中显示运行结果。
可以任意开启或结束。
在正式版出来之前,任何人可以得到它的测试版本。

文章:http://www.langwan.com/docs.php?docs_id=28
下载地址: ftp://ftp.langwan.com/PHPEXE_1.0.rar
操作录像: ftp://ftp.langwan.com/php精灵演示.rar

请加以下群
PHP编程(一)(二)(三)(四)(五)
3694215(满) 6710777(满) 8793646 8820162 12815337

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
2 [报告]
发表于 2005-12-30 10:57 |只看该作者
受不了,呵呵,还专门写了一个这样子的东西啊。

有很多把一般程序设置为系统服务的程序都可以做到的。

如果可以,完全使用php来做更好。

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
3 [报告]
发表于 2005-12-30 10:59 |只看该作者
  1. <?php
  2. /**
  3. * @package binarychoice.system.unix
  4. * @since 1.0.3
  5. */

  6. // Log message levels
  7. define('DLOG_TO_CONSOLE', 1);
  8. define('DLOG_NOTICE', 2);
  9. define('DLOG_WARNING', 4);
  10. define('DLOG_ERROR', 8);
  11. define('DLOG_CRITICAL', 16);

  12. /**
  13. * Daemon base class
  14. *
  15. * Requirements:
  16. * Unix like operating system
  17. * PHP 4 >= 4.3.0 or PHP 5
  18. * PHP compiled with:
  19. * --enable-sigchild
  20. * --enable-pcntl
  21. *
  22. * @package binarychoice.system.unix
  23. * @author Michal 'Seth' Golebiowski <seth at binarychoice dot pl>
  24. * @copyright Copyright 2005 Seth
  25. * @since 1.0.3
  26. */
  27. class Daemon
  28. {
  29.    /**#@+
  30.     * @access public
  31.     */
  32.    /**
  33.     * User ID
  34.     *
  35.     * @var int
  36.     * @since 1.0
  37.     */
  38.    var $userID = 99;

  39.    /**
  40.     * Group ID
  41.     *
  42.     * @var integer
  43.     * @since 1.0
  44.     */
  45.    var $groupID = 99;
  46.    
  47.    /**
  48.     * Terminate daemon when set identity failure ?
  49.     *
  50.     * @var bool
  51.     * @since 1.0.3
  52.     */
  53.    var $requireSetIdentity = false;

  54.    /**
  55.     * Path to PID file
  56.     *
  57.     * @var string
  58.     * @since 1.0.1
  59.     */
  60.    var $pidFileLocation = '/tmp/daemon.pid';

  61.    /**
  62.     * Home path
  63.     *
  64.     * @var string
  65.     * @since 1.0
  66.     */
  67.    var $homePath = '/';
  68.    /**#@-*/


  69.    /**#@+
  70.     * @access protected
  71.     */
  72.    /**
  73.     * Current process ID
  74.     *
  75.     * @var int
  76.     * @since 1.0
  77.     */
  78.    var $_pid = 0;

  79.    /**
  80.     * Is this process a children
  81.     *
  82.     * @var boolean
  83.     * @since 1.0
  84.     */
  85.    var $_isChildren = false;

  86.    /**
  87.     * Is daemon running
  88.     *
  89.     * @var boolean
  90.     * @since 1.0
  91.     */
  92.    var $_isRunning = false;
  93.    /**#@-*/


  94.    /**
  95.     * Constructor
  96.     *
  97.     * @access public
  98.     * @since 1.0
  99.     * @return void
  100.     */
  101.    function Daemon()
  102.    {
  103.       error_reporting(0);
  104.       set_time_limit(0);
  105.       ob_implicit_flush();

  106.       register_shutdown_function(array(&$this, 'releaseDaemon'));
  107.    }

  108.    /**
  109.     * Starts daemon
  110.     *
  111.     * @access public
  112.     * @since 1.0
  113.     * @return bool
  114.     */
  115.    function start()
  116.    {
  117.       $this->_logMessage('Starting daemon');

  118.       if (!$this->_daemonize())
  119.       {
  120.          $this->_logMessage('Could not start daemon', DLOG_ERROR);

  121.          return false;
  122.       }


  123.       $this->_logMessage('Running...');

  124.       $this->_isRunning = true;


  125.       while ($this->_isRunning)
  126.       {
  127.          $this->_doTask();
  128.       }

  129.       return true;
  130.    }

  131.    /**
  132.     * Stops daemon
  133.     *
  134.     * @access public
  135.     * @since 1.0
  136.     * @return void
  137.     */
  138.    function stop()
  139.    {
  140.       $this->_logMessage('Stoping daemon');

  141.       $this->_isRunning = false;
  142.    }

  143.    /**
  144.     * Do task
  145.     *
  146.     * @access protected
  147.     * @since 1.0
  148.     * @return void
  149.     */
  150.    function _doTask()
  151.    {
  152.           // override this method
  153.    }

  154.    /**
  155.     * Logs message
  156.     *
  157.     * @access protected
  158.     * @since 1.0
  159.     * @return void
  160.     */
  161.    function _logMessage($msg, $level = DLOG_NOTICE)
  162.    {
  163.          // override this method
  164.    }

  165.    /**
  166.     * Daemonize
  167.     *
  168.     * Several rules or characteristics that most daemons possess:
  169.     * 1) Check is daemon already running
  170.     * 2) Fork child process
  171.     * 3) Sets identity
  172.     * 4) Make current process a session laeder
  173.     * 5) Write process ID to file
  174.     * 6) Change home path
  175.     * 7) umask(0)
  176.     *
  177.     * @access private
  178.     * @since 1.0
  179.     * @return void
  180.     */
  181.    function _daemonize()
  182.    {
  183.       ob_end_flush();

  184.       if ($this->_isDaemonRunning())
  185.       {
  186.          // Deamon is already running. Exiting
  187.          return false;
  188.       }

  189.       if (!$this->_fork())
  190.       {
  191.          // Coudn't fork. Exiting.
  192.          return false;
  193.       }

  194.       if (!$this->_setIdentity() && $this->requireSetIdentity)
  195.       {
  196.          // Required identity set failed. Exiting
  197.          return false;
  198.       }

  199.       if (!posix_setsid())
  200.       {
  201.          $this->_logMessage('Could not make the current process a session leader', DLOG_ERROR);

  202.          return false;
  203.       }

  204.       if (!$fp = fopen($this->pidFileLocation, 'w'))
  205.       {
  206.          $this->_logMessage('Could not write to PID file', DLOG_ERROR);

  207.          return false;
  208.       }
  209.       else
  210.       {
  211.          fputs($fp, $this->_pid);
  212.          fclose($fp);
  213.       }

  214.       chdir($this->homePath);
  215.       umask(0);

  216.       declare(ticks = 1);

  217.       pcntl_signal(SIGCHLD, array(&$this, 'sigHandler'));
  218.       pcntl_signal(SIGTERM, array(&$this, 'sigHandler'));
  219.       pcntl_signal(SIGKILL, array(&$this, 'sigHandler'));

  220.       return true;
  221.    }

  222.    /**
  223.     * Cheks is daemon already running
  224.     *
  225.     * @access private
  226.     * @since 1.0.3
  227.     * @return bool
  228.     */
  229.    function _isDaemonRunning()
  230.    {
  231.       $oldPid = file_get_contents($this->pidFileLocation);

  232.       if ($oldPid !== false && posix_kill(trim($oldPid),0))
  233.       {
  234.          $this->_logMessage('Daemon already running with PID: '.$oldPid, (DLOG_TO_CONSOLE | DLOG_ERROR));

  235.          return true;
  236.       }
  237.       else
  238.       {
  239.          return false;
  240.       }
  241.    }

  242.    /**
  243.     * Forks process
  244.     *
  245.     * @access private
  246.     * @since 1.0
  247.     * @return bool
  248.     */
  249.    function _fork()
  250.    {
  251.       $this->_logMessage('Forking...');

  252.       $pid = pcntl_fork();

  253.       if ($pid == -1) // error
  254.       {
  255.          $this->_logMessage('Could not fork', DLOG_ERROR);

  256.          return false;
  257.       }
  258.       else if ($pid) // parent
  259.       {
  260.          $this->_logMessage('Killing parent');

  261.          exit();
  262.       }
  263.       else // children
  264.       {
  265.          $this->_isChildren = true;
  266.          $this->_pid = posix_getpid();

  267.          return true;
  268.       }
  269.    }

  270.    /**
  271.     * Sets identity of a daemon and returns result
  272.     *
  273.     * @access private
  274.     * @since 1.0
  275.     * @return bool
  276.     */
  277.    function _setIdentity()
  278.    {
  279.       if (!posix_setgid($this->groupID) || !posix_setuid($this->userID))
  280.       {
  281.          $this->_logMessage('Could not set identity', DLOG_WARNING);

  282.          return false;
  283.       }
  284.       else
  285.       {
  286.          return true;
  287.       }
  288.    }

  289.    /**
  290.     * Signals handler
  291.     *
  292.     * @access public
  293.     * @since 1.0
  294.     * @return void
  295.     */
  296.    function sigHandler($sigNo)
  297.    {
  298.       switch ($sigNo)
  299.       {
  300.          case SIGTERM:   // Shutdown
  301.             $this->_logMessage('Shutdown signal');
  302.             exit();
  303.             break;

  304.          case SIGKILL:   // Kill
  305.             $this->_logMessage('Kill signal');
  306.             exit();
  307.             break;

  308.          case SIGCHLD:   // Halt
  309.             $this->_logMessage('Halt signal');
  310.             while (pcntl_waitpid(-1, $status, WNOHANG) > 0);
  311.             break;
  312.       }
  313.    }

  314.    /**
  315.     * Releases daemon pid file
  316.     * This method is called on exit (destructor like)
  317.     *
  318.     * @access public
  319.     * @since 1.0
  320.     * @return void
  321.     */
  322.    function releaseDaemon()
  323.    {
  324.       if ($this->_isChildren && file_exists($this->pidFileLocation))
  325.       {
  326.          $this->_logMessage('Releasing daemon');

  327.          unlink($this->pidFileLocation);
  328.       }
  329.    }
  330. }
  331. ?>
复制代码




这是一个Unix的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP