PHP命令行执行整合pathinfo模拟定时任务实例

命令行模式下,根据传参,调用不同控制器。控制器中根据配置定时执行指定方法

Application.php

<?php class Application{ public static function main(){ header("content-type:text/html;charset=utf-8"); self::register(); self::commandLine(); self::pathInfo(); } //自动加载 public static function loadClass($class){ $class=str_replace('\\', '/', $class); $dir=str_replace('\\', '/', __DIR__); $class=$dir."/".$class.".php"; require_once $class; } //命令行下 public static function commandLine(){ if(php_sapi_name()=="cli"){ $_SERVER['PATH_INFO']=""; foreach ($_SERVER['argv'] as $k=>$v) { if($k==0) continue; $_SERVER['PATH_INFO'].="/".$v; } } } //pathinfo处理 public static function pathInfo(){ if(isset($_SERVER['PATH_INFO'])){ $pathinfo=array_filter(explode("/", $_SERVER['PATH_INFO'])); for($i=1;$i<=count($pathinfo);$i++){ $key=isset($pathinfo[$i]) ? $pathinfo[$i] : ''; $value=isset($pathinfo[$i+1]) ? $pathinfo[$i+1] :""; switch ($i) { case 1: $_GET['m']=ucfirst($key); break; case 2: $_GET['c']=ucfirst($key); break; case 3: $_GET['a']=$key; break; default: if($i>3){ if($i%2==0){ $_GET[$key]=$value; } } break; } } } $_GET['m']=!empty($_GET['m']) ? ucfirst($_GET['m']) : 'Index'; $_GET['c']=!empty($_GET['c']) ? ucfirst($_GET['c']) : 'Index'; $_GET['a']=!empty($_GET['a']) ? $_GET['a'] : 'index'; $class="\\Controller\\{$_GET['m']}\\{$_GET['c']}"; $controller=new $class; $controller->$_GET['a'](); } //致命错误回调 public static function shutdownCallback(){ $e=error_get_last(); if(!$e) return; self::errorHandler($e['type'],'<font color="red">Fatal Error</font> '.$e['message'],$e['file'],$e['line']); } //错误处理 protected static function myErrorHandler($errno,$errstr,$errfile,$errline){ list($micseconds,$seconds)=explode(" ",microtime()); $micseconds=round($micseconds*1000); $micseconds=strlen($micseconds)==1 ? '0'.$micseconds : $micseconds; if(php_sapi_name()=="cli"){ $break="\r\n"; }else{ $break="<br/>"; } $mes="[".date("Y-m-d H:i:s",$seconds).":{$micseconds}] ".$errfile." ".$errline." line ".$errstr.$break; echo $mes; } //注册 public static function register(){ error_reporting(0); set_error_handler(function($errno,$errstr,$errfile,$errline){ self::myErrorHandler($errno,$errstr,$errfile,$errline); }); register_shutdown_function(function(){ self::shutdownCallback(); }); spl_autoload_register("self::loadClass"); } } Application::main();

\Controller\Client\Cron.php

<?php namespace Controller\Client; class Cron{ private $second=0; private $tasks=array( array("duration"=>5,"method"=>"doSomething"), array("duration"=>2,"method"=>"doSomething2"), ); public function index(){ while (true) { sleep(1); $this->second++; foreach($this->tasks as $task){ if($this->second%$task['duration']==0){ $this->$task['method'](); } } } } public function doSomething(){ echo "[".date("Y-m-d H:i:s",time())."] doSomething1 ok!\r\n"; } public function doSomething2(){ echo "[".date("Y-m-d H:i:s",time())."] doSomething2 ok!\r\n"; } }

效果:

方法doSomething每隔2秒执行一次

方法doSomething2每隔5秒执行一次

现在执行其他方法是同步的,可以再优化成开新线程执行这些方法,就不会阻塞主线程的定时了

以上这篇PHP命令行执行整合pathinfo模拟定时任务实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

时间: 2024-08-23 16:25:05

PHP命令行执行整合pathinfo模拟定时任务实例的相关文章

PHP命令行执行整合pathinfo模拟定时任务实例_php实例

命令行模式下,根据传参,调用不同控制器.控制器中根据配置定时执行指定方法 Application.php <?php class Application{ public static function main(){ header("content-type:text/html;charset=utf-8"); self::register(); self::commandLine(); self::pathInfo(); } //自动加载 public static funct

paip: paip.命令行执行js

paip.命令行执行js 作者Attilax ,  EMAIL:1466519819@qq.com,112237553@qq.com 使用JS来做项目,需要解决两个问题...GUI界面可以使用HTML技术来解决..命令行程序则需要使用WSH技术了.. 1. 执行 ------------- Cscript //nologo //x C:\Users\attilax\Desktop\x.wsf   CScript //Job:mainx  C:\Users\attilax\Desktop\x.ws

正在自学go语言,命令行执行以下程序,进入等待输入状态,请问如何处理?

问题描述 正在自学go语言,命令行执行以下程序,进入等待输入状态,请问如何处理? package main import (bufio""fmt""os"") func main() { counts := make(map[string]int) input := bufio.NewScanner(os.Stdin) for input.Scan() { counts[input.Text()]++ } // NOTE: ignoring po

基于命令行执行带参数的php脚本并取得参数的方法_php技巧

本文分析了基于命令行执行带参数的php脚本并取得参数的方法.分享给大家供大家参考,具体如下: 一.为什么我们要在命令行下运行php脚本呢? 个人理解,主要有二个原因: 1. 利用crontab去跑php,可以给服务器减压,当然在这里有一个条件,就是实时性要求不高.比如:sns中的好友动态,这个实时要求不高,但是数据量比较大,这个时候定时跑的话,会给web服务器,数据库服务器分担不小的压力. 2. 就是我们要定时去完成某一事情,比如:我要删除一个月前,用户留言,这个时候,写的php脚本在cront

kettle用命令行执行ktr和kjb

Spoon 是一个图形用户界面,它允许你运行转换或者任务,其中转换是用Pan 工具来运行,任务是用Kitchen 来运行.Pan 是一个数据转换引擎,它可以执行很多功能,例如:从不同的数据源读取.操作和写入数据.Kitchen 是一个可以运行利用XML 或数据资源库描述 的任务.通常任务是在规定的时间间隔内用批处理的模式自动运 一.执行转换transformation(ktr) cd d:\etl\bin pan /file d:\etltest\etltestrans.ktr 二.执行任务jo

linux 通过命令行执行脚本生成的文件所有者为root的解决办法

通过命令行执行脚本,生成和输出的文件所有者都是root,这就为webserver的二次处理增加了障碍. (1)通过 su www可以解决这一问题 然而通情况下为了安全www用户的shell指定的/sbin/nologin,这就意味这无法通过su来切换. (2)通过修改profile文件的umask来指定权限,等价于chmod 这一方法不仅麻烦,还不安全 (3)通过CURL激活 这也是一个办法,需要在代码中加入:  代码如下 复制代码 <?php ignore_user_abort(true);

exception-对于URLClassLoader,Eclipse执行正确,而命令行执行抛出异常

问题描述 对于URLClassLoader,Eclipse执行正确,而命令行执行抛出异常 [0]问题描述 0.1)晚辈我想利用URLClassLoader 加载某目录下的class文件,执行结果发现,Eclipse执行正确,而命令行却抛出异常ClassNotFoundException,求各位前辈帮帮忙..谢谢. package com.tomcat.classloader; import java.io.File; import java.lang.reflect.Constructor; i

实例讲解yii2.0在php命令行中运行的步骤_php实例

Yii中的资源是和Web页面相关的文件,可为CSS文件,JavaScript文件,图片或视频等,资源放在Web可访问的目录下,直接被Web服务器调用. 有时候有些功能需要做到计划任务中去,因此就需要yii能用php命令去执行.yii2.0是支持php命令行运行的,操作方法如下: 在yii根目录下面有个"yii"文件(不是"yii.bat"),这个文件就是入口.然后"commands"目录下会默认有个"HelloController.ph

Hadoop系统实际运行的时候是不是都是用命令行执行的?Hadoop和Java的联系有哪些?

问题描述 我这两天装了一下Hadoop2.2的集群,用了Yarn和Zookeeper,执行Mapreduce的时候都是用命令行,比如hadoopjarmapreduceExample.jar/user/root/data/source.txt/user/root/output/result当然我估计实际使用的时候还会用到Flume.HBase等技术,但是实际的Hadoop系统是什么样的?都是用命令行人工执行的?还有Hadoop和Java的关系是不是就是用Java写Mapreduce的程序,然后把