用php写的一个daemon程序

一文搞懂深度学习:最全神经网络介绍 本文是深度学习系列文章的第二篇,我们将深入探讨各种类型的人工神经网络,探索它们独特的特性和应用。 阅读详情

基础类

<?php
/**
* @package binarychoice.system.unix
* @since 1.0.3
*/

// Log message levels
define('DLOG_TO_CONSOLE', 1);
define('DLOG_NOTICE', 2);
define('DLOG_WARNING', 4);
define('DLOG_ERROR', 8);
define('DLOG_CRITICAL', 16);

/**
* Daemon base class
*
* Requirements:
* Unix like operating system
* PHP 4 >= 4.3.0 or PHP 5
* PHP compiled with:
* --enable-sigchild
* --enable-pcntl
*
* @package binarychoice.system.unix
* @author Michal 'Seth' Golebiowski <seth at binarychoice dot pl>
* @copyright Copyright 2005 Seth
* @since 1.0.3
*/
class Daemon
{
    /**#@+
     * @access public
     */
    /**
     * User ID
     *
     * @var int
     * @since 1.0
     */
    var $userID = 99;

    /**
     * Group ID
     *
     * @var integer
     * @since 1.0
     */
    var $groupID = 99;
   
    /**
     * Terminate daemon when set identity failure ?
     *
     * @var bool
     * @since 1.0.3
     */
    var $requireSetIdentity = false;

    /**
     * Path to PID file
     *
     * @var string
     * @since 1.0.1
     */
    var $pidFileLocation = '/var/run/daemon.pid';

    /**
     * Home path
     *
     * @var string
     * @since 1.0
     */
    var $homePath = '/';
    /**#@-*/


    /**#@+
     * @access protected
     */
    /**
     * Current process ID
     *
     * @var int
     * @since 1.0
     */
    var $_pid = 0;

    /**
     * Is this process a children
     *
     * @var boolean
     * @since 1.0
     */
    var $_isChildren = false;

    /**
     * Is daemon running
     *
     * @var boolean
     * @since 1.0
     */
    var $_isRunning = false;
    /**#@-*/


    /**
     * Constructor
     *
     * @access public
     * @since 1.0
     * @return void
     */
    function Daemon()
    {
       error_reporting(0);
       set_time_limit(0);
       ob_implicit_flush();

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

    /**
     * Starts daemon
     *
     * @access public
     * @since 1.0
     * @return bool
     */
    function start()
    {
       $this->_logMessage('Starting daemon');

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

          return false;
       }


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

       $this->_isRunning = true;


       while ($this->_isRunning)
       {
          $this->_doTask();
       }

       return true;
    }

    /**
     * Stops daemon
     *
     * @access public
     * @since 1.0
     * @return void
     */
    function stop()
    {
       $this->_logMessage('Stoping daemon');

       $this->_isRunning = false;
    }

    /**
     * Do task
     *
     * @access protected
     * @since 1.0
     * @return void
     */
    function _doTask()
    {
           // override this method
    }

    /**
     * Logs message
     *
     * @access protected
     * @since 1.0
     * @return void
     */
    function _logMessage($msg, $level = DLOG_NOTICE)
    {
          // override this method
    }

    /**
     * Daemonize
     *
     * Several rules or characteristics that most daemons possess:
     * 1) Check is daemon already running
     * 2) Fork child process
     * 3) Sets identity
     * 4) Make current process a session laeder
     * 5) Write process ID to file
     * 6) Change home path
     * 7) umask(0)
     *
     * @access private
     * @since 1.0
     * @return void
     */
    function _daemonize()
    {
       ob_end_flush();

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

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

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

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

          return false;
       }

       if (!$fp = @fopen($this->pidFileLocation, 'w'))
       {
          $this->_logMessage('Could not write to PID file' . "[$this->pidFileLocation]", DLOG_ERROR);

          return false;
       }
       else
       {
          fputs($fp, $this->_pid);
          fclose($fp);
       }

       @chdir($this->homePath);
       umask(0);

       declare(ticks = 1);

       pcntl_signal(SIGCHLD, array(&$this, 'sigHandler'));
       pcntl_signal(SIGTERM, array(&$this, 'sigHandler'));

       return true;
    }

    /**
     * Cheks is daemon already running
     *
     * @access private
     * @since 1.0.3
     * @return bool
     */
    function _isDaemonRunning()
    {
       $oldPid = @file_get_contents($this->pidFileLocation);

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

          return true;
       }
       else
       {
          return false;
       }
    }

    /**
     * Forks process
     *
     * @access private
     * @since 1.0
     * @return bool
     */
    function _fork()
    {
       $this->_logMessage('Forking...');

       $pid = pcntl_fork();

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

          return false;
       }
       else if ($pid) // parent
       {
          $this->_logMessage('Killing parent');

          exit();
       }
       else // children
       {
          $this->_isChildren = true;
          $this->_pid = posix_getpid();

          return true;
       }
    }

    /**
     * Sets identity of a daemon and returns result
     *
     * @access private
     * @since 1.0
     * @return bool
     */
    function _setIdentity()
    {
       if (!posix_setgid($this->groupID) || !posix_setuid($this->userID))
       {
          $this->_logMessage('Could not set identity', DLOG_WARNING);

          return false;
       }
       else
       {
          return true;
       }
    }

    /**
     * Signals handler
     *
     * @access public
     * @since 1.0
     * @return void
     */
    function sigHandler($sigNo)
    {
       switch ($sigNo)
       {
          case SIGTERM:    // Shutdown
             $this->_logMessage('Shutdown signal');
             exit();
             break;

          case SIGCHLD:    // Halt
             $this->_logMessage('Halt signal');
             while (pcntl_waitpid(-1, $status, WNOHANG) > 0);
             break;
       }
    }

    /**
     * Releases daemon pid file
     * This method is called on exit (destructor like)
     *
     * @access public
     * @since 1.0
     * @return void
     */
    function releaseDaemon()
    {
       if ($this->_isChildren && file_exists($this->pidFileLocation))
       {
          $this->_logMessage('Releasing daemon');

          unlink($this->pidFileLocation);
       }
    }
}
?>

使用例子

<?php
class TestDaemon extends Daemon
{
    function TestDaemon()
    {
       parent::Daemon();

       $fp = fopen('/tmp/daemon.log', 'a');
       fclose($fp);
   
       chmod('/tmp/daemon.log', 0777);
    }

    function _logMessage($msg, $status = DLOG_NOTICE)
    {
       if ($status & DLOG_TO_CONSOLE)
       {
          print $msg."/n";
       }
      
       $fp = fopen('/tmp/daemon.log', 'a');
       fwrite($fp, date("Y/m/d H:i:s ").$msg."/n");
       fclose($fp);
    }

    function _doTask()
    {
       static $i = 0;
   
       sleep(1);
       echo $i;
   
       $i++;
   
       if ($i >= 30)
       {
          $this->stop();
       }
    }

}
?>

 

<?php
require_once ('Daemon.class.php');
require_once ('TestDaemon.class.php');

$Daemon = new TestDaemon();
$Daemon->start();
?>

 

 

 

 

原文地址:http://hi.baidu.com/titanictom/blog/item/ed2459db042b3564d1164eac.html

 

FPGA学习之路—应用程序—原码二位乘法器及Verilog代码分析 FPGA学习之路——原码二位乘法器及Verilog代码分析 原理 原码乘法可以分为原码一位乘和原码二位乘,两者在实现规则上大同小异。原码一位乘每次判断乘数的最低位,对被乘数和部分积进行相应操作。而原码二位乘则是对乘数的低二位进行判断,并执行相关操作。 两位乘数的取值可以有四种可能组合,每种组合对应于以下操作: 00相当于0x,部分积Dresult右移2位,不进行其他运算; 01相当于1x,部分积D... 阅读详情

相关推荐

避开这5个坑!ADNI数据库下载实操经验分享(含断点续传方案)

本文分享了ADNI数据库下载的5个常见陷阱及解决方案,包括高级搜索策略优化、断点续传技巧和数据完整性验证。特别针对大文件下载中断问题,提供了wget断点续传和分卷下载的实操方法,帮助研究者高效获取神经影像数据,避免重复下载和时间浪费。

git9versioner的博客 374

php daemon 内存,php进程daemon化的正确做法

daemon 音标 : [‘di:mən] , 中文含义为守护神或精灵的意思 . 其实它还有个意思 : 守护进程 .守护进程简单地说就是可以脱离终端而在后台运行的进程 . 这在Linux中是非常常见的一种进程 , 比如apache或者mysql等服务启动后 , 就会以守护进程的方式进驻在内存中 。以PHP为例 , 假如我有个耗时间的任务需要跑在后台 : 将所有mysql中user表中的2000万用...

weixin_39551366的博客 230

防雷防浪涌电路设计

通信线路或者电源线路通常会铺设到户外,一旦线路铺到户外后,就需要考虑防雷的问题了,那么怎么设计保护电路,能够防止雷电等浪涌对电路的破坏呢?

manhuami2007的博客 1万+

php写守护进程(Daemon)

守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。php也可以实现守护进程的功能。   1、基本概念     进程             每个进程都有一个父进程,子进程退出,父进程能得到子进程退出的状态。     进程组             每个进程都属于一个进

亿光年 3万+

动态对抗Zygisk-IL2CppDumper:Unity游戏安全新策略

本文深入探讨了对抗Zygisk-IL2CppDumper攻击的Unity游戏安全新策略。通过实时内存监控、动态混淆技术和异常行为检测体系,有效防止关键代码被动态提取。文章详细介绍了内存指纹系统、运行时混淆方案和五维特征模型等实用防御手段,帮助开发者提升游戏安全性。

weixin_29325955的博客 306

飞牛fnNAS存储模式RAID 5数据恢复

中介绍了fnNAS存储空间的几个模式,细心的网友应该能感受到,我是非常推崇RAID 5的。但我认为,一般人出现1块硬盘损坏后,就能够赶紧采取处理措施了,再高的容灾等级也无法满足这个用户的需求了。》就完成了飞牛NAS存储空间的说明,包括了如何创建、怎么选择空间模式、RAID 5 硬盘故障后的更换、系统更换/重装后数据盘的恢复等等。在VMware中新建虚拟机,安装好fnNAS后,再向虚拟机添加“已有硬盘”(这就是所谓崩溃虚拟机的数据盘),此时新的fnNAS出现提示。在“选择要添加的硬盘”中,选择刚添加硬盘。

dgnankai的专栏 3010

php 如何守护进程_php如何写守护进程(Daemon)

守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。php也可以实现守护进程的功能。一、基本概念进程: 每个进程都有一个父进程,子进程退出,父进程能得到子进程退出的状态。进程组:每个进程都属于一个进程组,每个进程组都有一个进程组号,该号等于该进程组组长的PID二、守护编程要点1. 在后台运行 为避免挂起控...

weixin_35835508的博客 271

5G无人机安全研究综述

国内多所高校提出混合信任模型,南京航空航天大学于2020年提出了起源信息感知的无人机网络信任模型[26],模型基于报文的完整性对报文创建和操作节点的行为评判并生成观测证据,收集证据进行信任评估,识别网络中的恶意节点并进行路由隔离,实现准确的对等信任评估。同时,5G技术的高速率、高可靠性、低时延等特点,能够为无人机提供实时高清图像回传,保证通信网络的稳定,拓展无人机飞控距离限制,丰富了5G无人机的应用场景。5G和无人机技术的融合,丰富了传统无人机的应用服务场景,然而5G无人机仍存在安全隐患。

weixin_70923796的博客 765

PHP7 学习笔记(十六)daemon 守护进程

&#13; 前言 在一个多任务的计算机操作系统中,守护进程(英语:daemon,/ˈdiːmən/或/ˈdeɪmən/)是一种在后台执行的计算机程序。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的守护进程。   daemon 程序是一直运行的服务端程序,又称为守护进程。通常在系统后台运行,没有控制终端不与前台交...

Tinywan 611

Web渗/透/攻/击实战(1)—成功渗/透台湾某净化设备公司官网

写在前面 作为一个防御型白帽黑客​ 你一定要知道黑客的进攻套路 才能有相应的防御措施 声明:只做测试,发现对方的漏洞,并不进行破坏性操作 1、 网站分析 地址:http://www.xxx.com.tw/ 这是一家中国台湾地区的网站,看着满屏的繁体字,就不是很舒服 网站首页包括:关于我们、资料下载、联络方式等等。 这些对我们进行sql注入用处并不大 我们需要的是可以进行参数传入的页面,这样我们就可以在参数里做文章 找一下 有没有新闻列表相关的页面 页...

信息安全领域优质创作者|操作系统领域专家 1807

Android Studio无法启动,Failed to create JVM:error code -1. JVM Path 完美解决方案

Android Studio无法启动,Failed to create JVM:error code -1. JVM Path 完美解决方案。 找到Android studio的启动文件bin目录,把studio64.exe.vmoptions 删除或改名(推荐改名,方便恢复),如果你是32位系统这个文件就是 studio.exe.vmoptions

陈万洲的专栏 4850

KalonDaemon - 守护进程PHP版

声明:这篇文章是我09年的时候发表在自己的之前的BLOG上的,属于原创内容,现在将文章转移到这里。守护进程也称精灵进程(daemon),是生存期较长的一种进程。它们常常用在系统自举时启动,仅在系统关闭时才终止。因为它们没有控制终端,所以说它们是在后台运行的。UNIX类操作系统有很多的守护进程,它们执行日常事务活动。目前有大量的web站点基与PHP开发,业务逻辑都是由PHP来实现,很多时候我们也需要一个PHP的daemon来做一些日常事务,例如我们想每隔一个小时统计一下数据库中的某项数据,每天定期的执行一些备

PHP kernel - Inside PHP 6342

Python 领域 vllm 知识蒸馏的实践经验

知识蒸馏(Knowledge Distillation)是一种将大型、复杂模型(教师模型)的知识转移到小型、高效模型(学生模型)的技术。在大型语言模型(LLM)时代,这项技术变得尤为重要,因为它可以在保持模型性能的同时显著降低计算资源需求。本文专注于在Python生态中使用vLLM(Very Large Language Model)框架实现知识蒸馏的实践经验。vLLM是一个专为大型语言模型设计的高效推理和服务框架,它通过创新的注意力机制和内存管理技术,显著提高了LLM的推理速度。

AI Python 编程之道的博客 777

php守护程序,用PHP写一个Daemon守护进程

Daemon守护进程这又是一个有趣的概念,daemon在英语中是"精灵"的意思,就像我们经常在迪斯尼动画里见到的那些,有些会飞,有些不会,经常围着动画片的主人公转来转去,啰里啰唆地提一些忠告,时不时倒霉地撞在柱子上,有时候还会想出一些小小的花招,把主人公从敌人手中救出来,正因如此,daemon有时也被译作"守护神"。所以,daemon进程在国内也有两种译法,有些人译作"精灵进程",有些人译作"守护...

weixin_34456923的博客 199

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

php怎么写脚本,PHP脚本来写Daemon程序_php

这又是一个有趣的概念,daemon在英语中是"精灵"的意思,就像我们经常在迪斯尼动画里见到的那些,有些会飞,有些不会,经常围着动画片的主人公转来转去,舻靥嵋恍┲腋妫辈皇钡姑沟刈苍谥由希惺焙蚧够嵯氤鲆恍┬⌒〉幕ㄕ校阎魅斯拥腥耸种芯瘸隼矗蛉绱耍daemon有时也被译作"守护神"。所以,daemon进程在国内也有两种译法,有些人译作"精灵进程",有些人译作"守护进程",这两种称呼的出现频率都很高。与真正...

weixin_42525289的博客 157

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

使用PHP脚本来写Daemon程序

@import url(http://www.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); 什么是Daemon进程 这又是一个有趣的概念,daemon在英语中是"精灵"的意思,就像我们经常在迪斯尼动画里见到的那些,有些会飞,有些不...

aifeier1982的博客 121

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

PHP-Daemon终极指南:如何在PHP中构建稳定可靠的后台守护进程

PHP-Daemon是一个强大的工具,让开发者能够使用PHP 5.3+构建生产级别的守护进程,无需繁琐的样板代码即可创建容错应用。本文将为你提供一个完整的指南,帮助你快速掌握PHP-Daemon的核心功能和使用方法。 ## 为什么选择PHP-Daemon? 在构建后台服务时,PHP可能不是第一选择,但PHP-Daemon改变了这一现状。它提供了一套完整的解决方案,让PHP开发者能够轻松创建稳定

gitblog_00355的博客 937

用PHP写一个Daemon守护进程

http://www.nowamagic.net/librarys/veda/detail/811 Daemon守护进程 这又是一个有趣的概念,daemon在英语中是"精灵"的意思,就像我们经常在迪斯尼动画里见到的那些,有些会飞,有些不会,经常围着动画片的主人公转来转去,啰里啰唆地提一些忠告,时不时倒霉地撞在柱子上,有时候还会想出一些小小的花招,把主人公从敌人手中救出来,正因如此,daem

linking530的专栏 728

php daemon 代码存入哪里了,如何写php守护进程(Daemon)

原标题:如何写php守护进程(Daemon)守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。php也可以实现守护进程的功能。一、基本概念进程:每个进程都有一个父进程,子进程退出,父进程能得到子进程退出的状态。进程组:每个进程都属于一个进程组,每个进程组都有一个进程组号,该号等于该进程组组长的PID二、...

weixin_33668998的博客 152

php多进程 daemon,如何在php项目中实现一个进程daemon化

如何在php项目中实现一个进程daemon化发布时间:2020-12-17 15:08:02来源:亿速云阅读:105作者:Leah本篇文章为大家展示了如何在php项目中实现一个进程daemon化,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言daemon 音标 : [‘di:mən] , 中文含义为守护神或精灵的意思 . 其实它还有个意思 : 守护进程 ...

weixin_42400074的博客 148

PHP-Daemon vs 其他方案:何时选择PHP守护进程方案

PHP-Daemon是一个能够帮助开发者使用PHP 5.3+构建生产级守护进程的工具,它可以让你无需编写大量样板代码就能创建容错应用。在服务器端开发中,选择合适的守护进程方案至关重要,不同的技术栈各有其优势和适用场景。 ## 🚀 PHP-Daemon的核心优势 PHP-Daemon最大的特点是**降低了PHP开发守护进程的门槛**。传统PHP开发主要面向Web请求,而构建长期运行的后台服务需

gitblog_01154的博客 357

PHP-Daemon快速入门:10分钟搭建你的第一个PHP后台服务

想要在PHP中构建稳定可靠的后台服务吗?PHP-Daemon正是你需要的解决方案!这个强大的库让你能够使用PHP 5.3+创建生产就绪的守护进程,构建容错应用程序而无需繁琐的模板代码。无论你是需要定时任务处理、后台作业队列还是长期运行的服务,PHP-Daemon都能帮你轻松实现。😊 ## 🚀 为什么选择PHP-Daemon? PHP-Daemon是一个专为PHP开发者设计的守护进程构建框架

gitblog_00222的博客 422

php daemon 代码存入哪里了,php进程daemon化的正确实现方法

前言daemon 音标 : [‘di:mən] , 中文含义为守护神或精灵的意思 . 其实它还有个意思 : 守护进程 .Daemon程序是一直运行的服务端程序,又称为守护进程。通常在系统后台运行,没有控制终端不与前台交互,Daemon程序一般作为系统服务使用。Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前...

weixin_30055951的博客 131

php daemon

<br />http://pear.php.net/package/System_Daemon/download<br /> <br />pear install System_Daemon-0.10.3<br /> <br />require_once "System/Daemon.php"; // Bare minimum setup System_Daemon::setOption("appName", "simple"); System_Daemon::setOption("authorEma

Hello World! 1085

PHP-Daemon调试技巧大全:掌握多进程应用的故障排查方法

PHP-Daemon是一个基于PHP 5.3+构建生产级守护进程的框架,让开发者能够轻松构建容错应用而无需处理复杂的底层代码。本文将分享10个实用的调试技巧,帮助开发者快速定位和解决PHP-Daemon多进程应用中的各类问题。 ## 1. 启用调试模式:快速开启调试功能 PHP-Daemon提供了便捷的调试模式开关,通过命令行参数`--debugworkers`可以启用工作进程调试控制台。这一

gitblog_01056的博客 930
上一篇: transfer-encoding: chunked的问题
下一篇: 添加默认lib路径到linux
LarryFrances
博客等级 码龄22年 0粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值