php获取后台Job管理的实现代码

 更新时间:2011年06月10日 00:31:16   作者:  
从数据库中取出job 队列 创建新的进程进行执行 等待job 结束
复制代码 代码如下:

<?php defined('SYSPATH') OR die('No direct access allowed.');
class Controller_Jobs extends Controller_Base{
public function before(){
parent::before();
if(Request::$protocol != "cli"){
die("Only cli allowed!\n");
}
}
public function after(){
parent::after();
//do some cleaning tasks
}
private function _execJobCommand($joburi,$paras){
$php_exec = Kohana::config("picsou.php_exec");
$php_index = APPINDEX;
$command_args = array();
$command_args[] = $php_index;
$command_args[] = "--uri=".$joburi;
foreach ($paras as $para => $value){
$command_args[] = "--".$para."=".$value;
}
//var_dump($command_args);exit;
echo "exec commmand:".$php_exec."\n";
pcntl_exec($php_exec,$command_args);
}
/*
* Running jobs in queues
*/
public function action_run(){
$requestCount = 0;
while(true){
$sql = "select * from job_queue where status='1' and approved='1' order by id";
$jobs = DB::query(Database::SELECT,$sql)->execute()->as_array();
if($jobs){
foreach ($jobs as $job){
$requestCount ++;
//update the jobs status as running
DB::update('job_queue')->set(array('status'=>'2'))
->where('id','=',$job['id'])->execute();
$job_pid = pcntl_fork();
if($job_pid == -1){
die("Could not fork Child");
} else if($job_pid == 0 ){
$this->_execJobCommand($job['job_uri'],json_decode($job['paras'],true));
echo "finish Child\n";
exit(0);
//run jobs here
} else{
echo "Waiting for job\n";
ob_flush();
$child_pid = pcntl_waitpid($job_pid,$status, WUNTRACED);
echo "waitpid end:".$status."\n";
if($status == 0){
//job completed
DB::update('job_queue')->set(array('status'=>'999'))
->where('id','=',$job['id'])->execute();
echo "Child Finished\n";
ob_flush();
}else{
DB::update('job_queue')->set(array('status'=>'-1'))
->where('id','=',$job['id'])->execute();
echo "Child Failed\n";
ob_flush();
}
}
}
}
else{
if($requestCount >=10){
echo "Have a rest, I have processed 10 jobs\n";
exit;
}
//no job to run
//echo "No job\n";
ob_flush();
sleep(5);
}
}
}
}

相关文章

  • PHP cron中的批处理

    PHP cron中的批处理

    如果 Web 应用程序中的一个特性需要超过 1 秒或 2 秒才能完成,那么应该怎么办?需要某种离线处理解决方案。学习几种对 PHP 应用程序中长时间运行的作业进行离线服务的方法。
    2008-09-09
  • 初识php MVC

    初识php MVC

    MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
    2014-09-09
  • PHP使用XMLWriter读写xml文件操作详解

    PHP使用XMLWriter读写xml文件操作详解

    这篇文章主要介绍了PHP使用XMLWriter读写xml文件操作,结合实例形式分析了php基于XMLWriter针对xml文件进行读写操作相关实现技巧,并附带相关源码供读者下载参考,需要的朋友可以参考下
    2018-07-07
  • PHP的instanceof详解及使用方法介绍

    PHP的instanceof详解及使用方法介绍

    php的instanceof是什么意思?instanceof由两个单词组成,instance和of,instance表示实例的意思,从字面上就可以理解这是实例引用的意思。instanceof 运算符是 PHP 5 引进的。在此之前用 is_a(),但是 is_a() 已经过时了,最好用 instanceof。
    2023-05-05
  • 抓取YAHOO股票报价的类

    抓取YAHOO股票报价的类

    实时抓取YAHOO股票报价的函数,大家可以学习一下思路跟具体的代码,自己可以拓宽下。
    2009-05-05
  • PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法

    PHP提示Deprecated: mysql_connect(): The mysql extension is dep

    这篇文章主要介绍了PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法,是在进行PHP数据库程序开发中常会遇到的错误,需要的朋友可以参考下
    2014-08-08
  • mysql 的 like 问题,超强毕杀记!!!

    mysql 的 like 问题,超强毕杀记!!!

    mysql 的 like 问题,超强毕杀记!!!...
    2007-01-01
  • PHP数组Key强制类型转换实现原理解析

    PHP数组Key强制类型转换实现原理解析

    这篇文章主要介绍了PHP数组Key强制类型转换实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • php读取文件内容的几种方法详解

    php读取文件内容的几种方法详解

    本篇文章是对php中读取文件内容的几种方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 判断PHP数组是否为空的代码

    判断PHP数组是否为空的代码

    这两种方法足以应对简单数组和多维数组是否为空的判断问题,个人一般用empty()来做数组非空判断,这样感觉代码看起来更容易理解。
    2011-09-09

最新评论