php获取后台Job管理的实现代码
2015-01-24信息快讯网
从数据库中取出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中计算程序运行时间的类代码
php教程 插件机制在PHP中实现方案
PHP类与对象中的private访问控制的疑问
php类中private属性继承问题分析
用php实现百度网盘图片直链的代码分享
php页面缓存ob系列函数介绍
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
PHP中全局变量global和$GLOBALS[]的区别分析
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
PHP对象Object的概念 介绍
php中通过虚代理实现延迟加载的实现代码
php下通过curl抓取yahoo boss 搜索结果的实现代码
PHP缩略图等比例无损压缩,可填充空白区域补充色
PHP网站备份程序代码分享
php在页面中调用fckeditor编辑器的方法
PHP中遍历stdclass object的实现代码
php中全局变量global的使用演示代码
用php的ob_start来生成静态页面的方法分析
php ob_flush,flush在ie中缓冲无效的解决方法
用PHP ob_start()控制浏览器cache、生成html实现代码