PHP高级编程实例:编写守护进程
1.什么是守护进程守护进程是脱离于终端并且在后台运行的进程。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。 例如 apache,nginx,mysql 都是守护进程 2.为什么开发守护进程很多程序以服务形式存在,他没有终端或UI交互,它可能采用其他方式与其他程序交互,如TCP/UDP Socket,UNIX Socket,fifo。程序一旦启动便进入后台,直到满足条件他便开始处理任务。 3.何时采用守护进程开发应用程序以我当前的需求为例,我需要运行一个程序,然后监听某端口,持续接受服务端发起的数据,然后对数据分析处理,再将结果写入到数据库中; 我采用ZeroMQ实现数据收发。 如果我不采用守护进程方式开发该程序,程序一旦运行就会占用当前终端窗框,还有受到当前终端键盘输入影响,有可能程序误退出。 4.守护进程的安全问题我们希望程序在非超级用户运行,这样一旦由于程序出现漏洞被骇客控制,攻击者只能继承运行权限,而无法获得超级用户权限。 我们希望程序只能运行一个实例,不运行同事开启两个以上的程序,因为会出现端口冲突等等问题。 5.怎样开发守护进程例 1. 守护进程例示 public function __construct(Logging $logger) {
$this->logger = $logger;}protected $logger;protected static $dbh; } self::$dbh = new PDO("mysql:host=$dbhost;port=$dbport;dbname=$dbname",$dbuser,$dbpass,array( } } / the collectable class implements machinery for Pool::collect / public function run() { $this->worker->logger->log("%s executing in Thread #%lu",CLASS,$this->worker->getThreadId() );try { $insert = "INSERT INTO fee(ticket,login,volume, / ...... / $update = "UPDATE fee SET class Example { protected $pool = NULL; $pid = pcntl_fork(); / Loop receiving and echoing back / if (file_exists($this->pidfile)) { $cgse = new Example(); 5.1. 程序启动 下面是程序启动后进入后台的代码 通过进程ID文件来判断,当前进程状态,如果进程ID文件存在表示程序在运行中,通过代码file_exists($this->pidfile)实现,但而后进程被kill需要手工删除该文件才能运行 pidfile)) {
echo "The file $this->pidfile exists.n";
exit();
}
$pid = pcntl_fork(); 程序启动后,父进程会推出,子进程会在后台运行,子进程权限从root切换到指定用户,同时将pid写入进程ID文件。 5.2. 程序停止 程序停止,只需读取pid文件,然后调用posix_kill($pid,9); 最后将该文件删除。 if (file_exists($this->pidfile)) { $pid = file_get_contents($this->pidfile); posix_kill($pid,9); unlink($this->pidfile); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |